Quiero hacer una implementación de Flask+Nginx+Gunicorn. Tengo Nginx configurado y ejecutándose y ejecuto gunicorn como se describe en los documentos:
gunicorn app:app
Pero cuando cierro la sesión del servidor, ¿el proceso gunicorn sale? ¿Cuál es la forma correcta de asegurarse de que siga funcionando para que Nginx se conecte y se reinicie si falla?
zhiguo.wang
Usar --daemon
opción mientras se ejecuta gunicorn. Ejemplo:
gunicorn grand56.wsgi:application --name grand56 --workers 3 --user=root --group=root --bind=127.0.0.1:1001 --daemon
-
será el
--daemon
flag también reiniciar mi proceso si falla? ¿O todavía tendré que usar advenedizo, systemd, sysv (o incluso supervisor) para algo como esto?– Este chico no puede ni siquiera
24 de julio de 2019 a las 21:21
-
¿Es seguro usar el “nohup” de linux al iniciar el gunicorn?
– kawingkelvin
16 de marzo de 2021 a las 17:13
-
@kawingkelvin En mi opinión, no es seguro. He usado
nohup
congunicorn
(sindaemon
) y descubrí que los trabajadores se reiniciaron después de que cerré la terminal del servidor (lo cual es inesperado). he usado un.sh
archivo que contiene elgunicorn
comando y ejecuta la aplicación pornohup service.sh &
.– hafiz031
3 de julio de 2022 a las 7:41
-
¿Cómo se detiene esto una vez que comienza?
– Temba
1 de mayo a las 13:30
use –daemon para el comando vinculante de gunicorn. ex:
gunicorn --bind 0.0.0.0:8001 your_project.wsgi --daemon
raquel lijadoras
Yo miraría algo como Supervisor.
Tutorial muy útil se puede encontrar aquí https://www.codificaciónparaentrepreneurs.com/blog/hello-linux-setup-gunicorn-and-supervisor/
-
esto es exactamente para lo que es Supervisor.
– MalphasWats
5 de diciembre de 2012 a las 11:17
-
supervisor es bueno para los sistemas de nivel de producción, pero no es la respuesta a la pregunta. Compruebe a continuación las otras respuestas
– stelios
5 de julio de 2018 a las 12:05
-
¿Supervisor sigue siendo la solución goto hoy en día?
– Mr-Programas
28 de enero de 2019 a las 11:09
Prueba esto:
nohup gunicorn app:app &
La clave a tener en cuenta es que cuando inicia el proceso desde la línea de comando, es un proceso secundario de su terminal (es decir, un proceso secundario de bash
). Cuando cierra sesión en el servidor, su bash
finaliza el proceso, al igual que todos sus hijos.
Querrá usar cualquier sistema que tenga para administrar nginx y también administrar gunicorn (cualquier cosa, desde init.d
o Upstart scripts para monitores de procesos de aplicaciones especializados como Monit, Supervisor, Bluepill, Foreman, etc.)
Michael Dillon
Presta atención a Sean.
Sin embargo, puede ejecutarlo sobre la marcha de esta manera:
nohup gunicorn -c config.py </dev/null >/dev/null 2>&1
y ya no dependerá de la conexión del terminal. podrías reemplazar >/dev/null
con algo como >somelogfile
si desea guardar cualquier salida.
Pero para el uso de producción, es mejor integrarlo en cualquier herramienta que use para administrar procesos.
Supervisor
es una gran solución multiplataforma para la gestión de procesos. Es muy rico en funciones y (en mi opinión) requiere mucha más configuración que algunas de las alternativas básicas de Linux (upstart, sysv, systemd). Definitivamente debería usar algo como esto para iniciar, monitorear y (si es necesario) reiniciar su proceso.
No importa qué administrador de procesos termine usando, aún puede dejar muy fácilmente a gunicorn “funcionando incorrectamente” (es decir, como usuario raíz). Creo que algunos de los detalles importantes dejados de lado por otras respuestas son que probablemente debería tener un usuario (no root) que posea el proceso de gunicorn que se une a un socket de Unix que es propiedad de ese usuario y el grupo nginx y tiene permisos 770
. Con gunicorn
especificas una máscara en su lugar, así que invierte 770
en 007
y usa el -m
bandera. De esta manera, solo gunicorn y nginx pueden leer/escribir/ejecutar en el socket y no se necesita ningún puerto. Puede especificar el usuario y el grupo de su proceso gunicorn con el -u
y -g
banderas, y creará el socket con esos propietarios. Independientemente de lo que termine usando para proceso mgmt, para nginx/gunicorn, probablemente quiera algo como esto en su secuencia de comandos de inicio:
exec gunicorn wsgi:app -u gunicorn -g nginx -m 007 -b gunicorn.sock >> /var/log/$<service_name>.sys.log 2>&1
Asegúrese de que el usuario de gunicorn tenga permiso de escritura en el archivo de registro. Luego, en nginx, donde anteriormente tenía la ip/puerto (es decir, 0.0.0.0:5000
), pones la ruta al socket (es decir /usr/share/nginx/html/gunicorn.sock
). Observe que no usé el --daemon
bandera aquí, pero usé exec
esto supone un administrador de procesos, que ejecutará gunicorn como un proceso secundario con exec
.
Puedes encontrar todas las diferentes banderas. aquí.