Gunicorn

Gunicorn es un servidor WSGI hecho Python puro con una configuración sencilla y múltiples implementaciones de trabajadores para el ajuste del rendimiento.

  • Suele integrarse fácilmente con las plataformas de alojamiento.

  • No es compatible con Windows (pero sí con WSL).

  • Es fácil de instalar, ya que no requiere dependencias adicionales ni compilación.

  • Tiene soporte de trabajador asíncrono incorporado usando gevent o eventlet.

Esta página describe los aspectos básicos del funcionamiento de Gunicorn. Asegúrese de leer su documentación y utilizar gunicorn --help para entender qué características están disponibles.

Instalación

Gunicorn es fácil de instalar, ya que no requiere dependencias externas ni compilación. Se ejecuta en Windows sólo bajo WSL.

Crea un virtualenv, instala tu aplicación y luego instala gunicorn.

$ cd hello-app
$ python -m venv .venv
$ . .venv/bin/activate
$ pip install .  # install your application
$ pip install gunicorn

Ejecutando

El único argumento requerido a Gunicorn le dice cómo cargar su aplicación Flask. La sintaxis es {module_import}:{app_variable}. module_import es el nombre de importación con puntos del módulo con tu aplicación. app_variable es la variable con la aplicación. También puede ser una llamada a una función (con cualquier argumento) si estás usando el patrón de fábrica de aplicaciones.

# equivalent to 'from hello import app'
$ gunicorn -w 4 'hello:app'

# equivalent to 'from hello import create_app; create_app()'
$ gunicorn -w 4 'hello:create_app()'

Starting gunicorn 20.1.0
Listening at: http://127.0.0.1:8000 (x)
Using worker: sync
Booting worker with pid: x
Booting worker with pid: x
Booting worker with pid: x
Booting worker with pid: x

La opción -w especifica el número de procesos a ejecutar; un valor inicial podría ser CPU * 2. El valor por defecto es sólo 1 trabajador, que probablemente no es lo que quieres para el tipo de trabajador por defecto.

Los registros de cada solicitud no se muestran por defecto, sólo se muestra la información del trabajador y los errores. Para mostrar los registros de acceso en stdout, utilice la opción --access-logfile=-.

Vinculación externa

Gunicorn no debe ser ejecutado como root porque causaría que el código de su aplicación se ejecute como root, lo cual no es seguro. Sin embargo, esto significa que no será posible enlazar con el puerto 80 o 443. En su lugar, un proxy inverso como nginx o Apache httpd debe ser utilizado delante de Gunicorn.

Puedes enlazar con todas las IPs externas en un puerto no privilegiado usando la opción b 0.0.0.0. No hagas esto cuando utilices una configuración de proxy inverso, de lo contrario será posible eludir el proxy.

$ gunicorn -w 4 -b 0.0.0.0 'hello:create_app()'
Listening at: http://0.0.0.0:8000 (x)

0.0.0.0 no es una dirección válida para navegar, sino que debes utilizar una dirección IP específica en tu navegador.

Async con gevent o eventlet

El sync worker por defecto es apropiado para muchos casos de uso. Si necesitas soporte asíncrono, Gunicorn proporciona trabajadores usando gevent o eventlet. Esto no es lo mismo que async/await de Python, o la especificación del servidor ASGI. Debes usar gevent/eventlet en tu propio código para ver algún beneficio al usar los workers.

Cuando se utiliza gevent o eventlet, se requiere greenlet>=1.0, de lo contrario los contextos locales como request no funcionarán como se espera. Cuando se utiliza PyPy, se requiere PyPy>=7.3.7.

Para utilizar gevent:

$ gunicorn -k gevent 'hello:create_app()'
Starting gunicorn 20.1.0
Listening at: http://127.0.0.1:8000 (x)
Using worker: gevent
Booting worker with pid: x

Para utilizar eventlet:

$ gunicorn -k eventlet 'hello:create_app()'
Starting gunicorn 20.1.0
Listening at: http://127.0.0.1:8000 (x)
Using worker: eventlet
Booting worker with pid: x