Pregunta ¿Por qué necesito Nginx y algo como Gunicorn?


Estoy buscando una respuesta demasiado simplificada para la siguiente pregunta. Estoy tratando de construir una comprensión fundamental de cómo funciona Nginx junto con algo como Gunicorn.

¿Necesito Nginx y algo como Gunicorn para implementar aplicaciones Django en Nginx?

Si es así, ¿qué maneja realmente las solicitudes HTTP?

PD. ¡No quiero usar Apache y mod_wsgi!


182
2017-11-15 21:16


origen


Apache y mod_wsgi es la forma más sencilla de implementar el puente entre su aplicación django y las solicitudes http que también es muy capaz en un entorno de producción. Para muchos desarrolladores, esto significa que 'Apache es mejor que nginx' si lo supieron pero lo saben, pero como 'betamax es mejor que VHS', desgraciadamente, las reglas de Dogma - MagicLAMP


Respuestas:


Muy simplificado: necesita algo que ejecute Python pero Python no es el mejor para manejar todo tipo de solicitudes.

[descargo de responsabilidad: soy un desarrollador Gunicorn]

Menos simplificado: independientemente del servidor de aplicaciones que use (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy), cualquier tipo de implementación no trivial tendrá algo en sentido ascendente que manejará las solicitudes que su aplicación Django no debería manejar. Los ejemplos triviales de tales solicitudes son los activos estáticos (images / css / js).

Esto da como resultado dos primeros niveles de la clásica "arquitectura de tres niveles". Es decir, el servidor web (Nginx en su caso) manejará muchas solicitudes de imágenes y recursos estáticos. Las solicitudes que deben generarse dinámicamente se pasarán al servidor de la aplicación (Gunicorn en su ejemplo). (Dejando de lado, el tercero de los tres niveles es la base de datos)

Hablando históricamente, cada uno de estos niveles se alojaría en máquinas separadas (y probablemente habría varias máquinas en los dos primeros niveles, es decir: 5 servidores web envían solicitudes a dos servidores de aplicaciones que a su vez consultan una sola base de datos).

En la era moderna, ahora tenemos aplicaciones de todas las formas y tamaños. No todos los proyectos de fin de semana o sitios de pequeñas empresas realmente necesitan la potencia de varias máquinas y se ejecutarán de forma bastante feliz en una sola caja. Esto ha generado nuevas entradas en la gama de soluciones de alojamiento. Algunas soluciones casarán el servidor de aplicaciones con el servidor web (Apache httpd + mod_wsgi, Nginx + mod_uwsgi, etc.). Y no es nada raro alojar la base de datos en la misma máquina que una de estas combinaciones de servidor web / de aplicaciones.

Ahora, en el caso de Gunicorn, tomamos una decisión específica (copiar de Unicornio de Ruby) para mantener las cosas separadas de Nginx mientras confiamos en el comportamiento de proxy de Nginx. Específicamente, si podemos asumir que Gunicorn nunca leerá las conexiones directamente desde Internet, entonces no debemos preocuparnos por los clientes que son lentos. Esto significa que el modelo de procesamiento para Gunicorn es vergonzosamente simple.

La separación también permite que Gunicorn se escriba en Python puro, lo que minimiza el costo de desarrollo y no afecta significativamente el rendimiento. También les permite a los usuarios la posibilidad de usar otros proxies (asumiendo que se almacenan correctamente).

En cuanto a su segunda pregunta acerca de lo que realmente maneja la solicitud HTTP, la respuesta simple es Gunicorn. La respuesta completa es que tanto Nginx como Gunicorn manejan la solicitud. Básicamente, Nginx recibirá la solicitud y si es una solicitud dinámica (generalmente basada en patrones de URL), le dará esa solicitud a Gunicorn, que la procesará, y luego devolverá una respuesta a Nginx que luego reenviará la respuesta al original. cliente.

Así que para terminar, sí. Necesitas tanto Nginx como Gunicorn (o algo similar) para una implementación adecuada de Django. Si está buscando específicamente alojar a Django con Nginx, entonces investigaría a Gunicorn, mod_uwsgi y tal vez a CherryPy como candidatos para el lado de Django.


267
2017-11-15 21:49



¡Gracias por tomarse el tiempo para escribir una respuesta tan detallada! ¿Alguna lectura recomendada en esta "arquitectura de 3 niveles"? - a.m.
Gran respuesta, sin embargo no entiendo el problema con clientes lentos. - Mads Skjern
@MadsSkjern Estoy adivinando aquí, pero si asume que todos los clientes son rápidos, entonces puede usar un grupo fijo de procesos de trabajo, y no tener que codificar el caso en el que muchos o todos ellos se bloquean en espera de un cliente. - Jonathan Hartley
@a.m. es.wikipedia.org/wiki/Multitier_architecture - Jonathan Hartley
mi aplicación django solo sirve json sin contenido estático, solo puedo ir con gunicorn y no nginx - Sar009


Me gustó esta explicación en su simplicidad:

Nginx se enfrentará al mundo exterior. Servirá archivos multimedia (imágenes,   CSS, etc) directamente desde el sistema de archivos. Sin embargo, no puede hablar.   directamente a las aplicaciones de Django; necesita algo que funcione   Aplicación, aliméntala desde la web y devuelve las respuestas.

Ese es el trabajo de Gunicorn. Gunicorn creará un socket Unix, y servirá   Respuestas a nginx a través del protocolo wsgi: el socket pasa los datos   ambas direcciones:

The outside world <-> Nginx <-> The socket <-> Gunicorn

https://gist.github.com/Atem18/4696071


20
2017-12-13 07:52



No tiene que ser enchufes, en caso de que otros se lo pregunten. - akshay


Estoy buscando una respuesta demasiado simplificada ...

¿Necesito Nginx y algo como Gunicorn para implementar aplicaciones Django en Nginx?

Si es así, ¿qué maneja realmente las solicitudes HTTP?

Respuesta demasiado simplificada:

SÍ.

Tanto Nginx como Gunicorn.

Como está implementando en Nginx, por supuesto que necesita Nginx.

Dado que está implementando Django, que es un marco web, necesita algo que sirva de enlace entre el servidor web (Nginx) y el marco web (Django). En el mundo de Python, tal cosa se llama un servidor WSGI (pero creo que es un software intermedio), entre los que se incluyen Gunicorn y uWSGI. Al manejar una solicitud, Nginx envía la solicitud a Gunicorn o uWSGI, que a su vez llama al código Django y devuelve la respuesta.

Este documento y la respuesta de Paul te ayudará a aprenderlo mejor.


0
2017-10-26 21:42