gunicorn 19.2 falla al iniciar con 18.0 configuration

Tengo un server de dev ejecutando gunicorn / Django detrás de nginx. Como parte de una actualización más amplia del entorno del server, intenté actualizar el gunicorn de 18.0 a 19.2.1, pero el service ya no se iniciaría. (El server está ejecutando Arch y por lo tanto utiliza systemctl.)

La configuration de los gunicorns fue hecha por alguien que ya no está a nuestra disposition, y realmente no sabía que el gunicorn que bien, yo era incapaz de arreglar o incluso localizar el problema, así que volví a la versión 18.0 y está trabajando por ahora. Sin embargo, me gustaría actualizarlo eventualmente y get la configuration en una forma en la que funcionaría. Tengo la sensación de que la configuration actual es subóptima o networkingundante, pero no tengo manera de saber con security :-).

Nada cambió en el ambiente (o el virtualenv que el gunicorn está funcionando adentro), solamente el gunicorn sí mismo fue aumentado. Systemctl produjo este error en systemctl start gunicorn :

 ● gunicorn.service - gunicorn daemon (production) Loaded: loaded (/usr/lib/systemd/system/gunicorn.service; enabled) Active: failed (Result: resources) since Tue 2015-02-17 20:55:41 UTC; 8s ago Process: 2837 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS) Process: 9608 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS) Process: 5353 ExecStart=/home/django/gunicorn/run.sh (code=exited, status=0/SUCCESS) Main PID: 24876 (code=exited, status=0/SUCCESS) Feb 17 20:55:41 ashima systemd[1]: PID file /home/django/gunicorn/gunicorn.pid not readable (yet?) after start. Feb 17 20:55:41 ashima systemd[1]: gunicorn.service never wrote its PID file. Failing. Feb 17 20:55:41 ashima systemd[1]: Failed to start gunicorn daemon (production). Feb 17 20:55:41 ashima systemd[1]: Unit gunicorn.service entenetworking failed state. 

Tratando de ejecutar manualmente el command gunicorn en run.sh (pegado debajo), simplemente salió inmediatamente sin producir ningún error, con un código de salida de 0. No se registró nada. De hecho, parece que mi pnetworkingecesor inhabilitó el logging de armas de fuego hace un time cuando el file de logging creció a un tamaño alarmante, pero eso es un problema para otro día.

Aquí están los contenidos de los files relevantes:

/usr/lib/systemd/system/gunicorn.service:

 [Unit] Description=gunicorn daemon [Service] Type=forking PIDFile=/home/django/gunicorn/gunicorn.pid User=django WorkingDirectory=/home/django/[name_withheld]/project ExecStart=/home/django/gunicorn/run.sh ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=false [Install] WantedBy=multi-user.target 

/home/django/gunicorn/run.sh:

 #!/bin/bash set -e cd /home/django/[name_withheld]/project source /home/django/.venv/bin/activate exec gunicorn -p /home/django/gunicorn/gunicorn.pid -c /home/django/gunicorn/config.py -e HTTPS=on [name_withheld]_site.wsgi:application 

/home/django/gunicorn/config.py:

 bind = 'unix:/tmp/gunicorn.sock' backlog = 2048 workers = 16 worker_class = 'egg:gunicorn#sync' worker_connections = 1000 timeout = 30 keepalive = 2 debug = False spew = False daemon = True pidfile = None umask = 0755 user = None group = None tmp_upload_dir = None raw_env = 'HTTPS=on' errorlog = '-' loglevel = 'info' accesslog = None proc_name = None def post_fork(server, worker): server.log.info("Worker spawned (pid: %s)", worker.pid) def pre_fork(server, worker): pass def pre_exec(server): server.log.info("Forked child, re-executing.") def when_ready(server): server.log.info("Server is ready. Spawning workers") 

(De los comentarios enviados a la pregunta, debo especialmente llamar a la de skarap , ya que me ayudó a encontrar una solución por mi count por la fabricación de errores de salida de cañón correctamente.Me gustaría poder otorgar una recompensa parcial para esto, la conversión de que el comentario en una respuesta aún no sería una respuesta completa, pero sí ayudó sustancialmente.)

Resulta que esta era la fila problemática en el file de configuration:

worker_class = 'egg:gunicorn#sync'

Causa este error:

 Error: class uri 'egg:gunicorn#sync' invalid or not found: [Traceback (most recent call last): File "/home/django/.venv/lib/python2.7/site-packages/gunicorn/util.py", line 113, in load_class return pkg_resources.load_entry_point(dist, section, name) File "/home/django/.venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/pkg_resources.py", line 318, in load_entry_point return get_distribution(dist).load_entry_point(group, name) File "/home/django/.venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/pkg_resources.py", line 2220, in load_entry_point raise ImportError("Entry point %r not found" % ((group,name),)) ImportError: Entry point ('gunicorn.workers', 'sync') not found ] 

Sustituirlo por worker_class = 'sync' arregló el ImportError y por lo tanto el problema. Ningún otro cambio de configuration fue necesario en la actualización 18.0 -> 19.2.1.

Parece que hay un problema con la documentation de gunicorn, que tengo la intención de informar, porque en el momento de escribir esto, los documentos para v19.2.1 aún dicen que la syntax egg:gunicorn#[worker] es válida. (El ejemplo utiliza gevent, pero parece que debería aplicarse a otros types). Quién sabe, puede ser válido en algunas circunstancias, pero en la mía (gunicorn en una virtualenv, instalado con pip), no lo es.