2012-02-13 14 views
8

Estoy implementando una aplicación django con gunicorn detrás de nginx en centos 5. ¿Cómo puedo ejecutar gunicorn como usuario no root? Ninguno de los documentos parece abordar esto. Probablemente esto se aplica a cualquier servidor de aplicaciones Python corriendo detrás de nginx, así ...¿Cómo ejecutar el servidor de aplicaciones de python/python como usuario no root?

debo añadir que el siguiente no funciona:

sudo -u nobody gunicorn_django --workers=4 

falla con:

raise HaltServer(reason, self.WORKER_BOOT_ERROR) 
    gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3> 

respuesta :

Mi error. Tenía un archivo settings.py personalizado, de modo que debería haber invocado gunicorn con:

sudo -u nobody gunicorn_django --workers=4 production_settings.py 
+0

¿Estás seguro de que es el comando? ¿Estás seguro de que puedes agregar '-u nobody' al comienzo del comando gunicorn_django? Esto no parece funcionar para mí. – Mark

+0

@Mark Están agregando '-u nobody' al final del comando' sudo', no al comienzo del comando 'gunicorn_django'. 'sudo -u' le permite elegir un usuario que no sea root para ejecutar el siguiente comando como. – BHSPitMonkey

Respuesta

2

recomiendo el uso de supervisord. Supervisor inicia su aplicación en la cuenta de usuario que le indica al inicio.

Aquí es mi my_app.conf que pongo bajo /etc/supervisor/conf.d/:

[program:my_app] 
command=/home/some_user/my_app/run_gunicorn 
directory=/home/some_user/my_app 
user=some_user     
redirect_stderr=true    
stdout_logfile=/home/some_user/supervisord_stdout.txt 
stdout_logfile_maxbytes=20MB 
stdout_logfile_backups=10 

Mi script run_gunicorn es entonces:

#!/bin/bash 
source /home/some_user/virtualenvs/my_app_virtualenv/bin/activate 
exec /home/some_user/virtualenvs/my_app_virtualenv/bin/gunicorn -c gunicorn.conf wsgi:application 

que podría hacer referencia a gunicorn directamente en my_app .conf, pero no lo hago porque de esta manera puedo ejecutar activate. Puse mi DJANGO_SECRET en la cola de mi script de activación como env var. También es bueno hacerlo con claves API y otras cosas sensibles que no pertenecen a Git o Mercurial.

Mi gunicorn.conf es:

backlog = 2048 
bind = "127.0.0.1:9000" 
pidfile = "/home/some_user/gunicorn-my_app.pid" 
daemon = False 
debug = False 
workers = 3 
logfile = "/home/some_user/gunicorn-my_app.log" 
loglevel = "info" 
timeout = 90 

En realidad, yo estoy seguro de que se puede mejorar, pero consiguen mi aplicación en ejecución sin ser root. Supervisord asegura que el servidor de la aplicación se mantenga funcionando. Luego señalo nginx en mi servidor de aplicaciones a través de proxy_pass (puedo compartir eso también si es necesario).

EDIT: aclarar los nombres de archivo

Cuestiones relacionadas