¿Cuál es la forma correcta de dejar el gunicorn funcionando?

4 minutos de lectura

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?

avatar de usuario de zhiguo.wang
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 con gunicorn (sin daemon) 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 el gunicorn comando y ejecuta la aplicación por nohup 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

Avatar de usuario de Rachel Sanders
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.)

Avatar de usuario de Michael Dillon
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 gunicornespecificas 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é execesto supone un administrador de procesos, que ejecutará gunicorn como un proceso secundario con exec.

Puedes encontrar todas las diferentes banderas. aquí.

¿Ha sido útil esta solución?