¿Por qué necesito nginx cuando tengo uWSGI?

62

Hay muchos tutoriales sobre cómo configurar nginx para cooperar con uWGSI cuando quiero implementar la aplicación Django.

Pero, ¿por qué necesito nginx en este kit? uWSGI en sí mismo puede servir aplicaciones WSGI Python, puede servir archivos estáticos, también puede hacer SSL. ¿Qué puede hacer nginx que uWSGI no puede hacer?

usuario983447
fuente
99
Puedo ver que esta pregunta está cerrada como basada en la opinión. Estoy totalmente en desacuerdo. Pregunta "¿Qué puede hacer nginx que uWSGI no puede hacer?" está basado en hechos.
user983447
1
Generalmente no hablo por reaperturas, pero en este caso estoy de acuerdo. La respuesta actual votada y aceptada es buena, lo que demuestra que la pregunta, tal como está escrita, admite respuestas sensibles y relevantes; Creo que probablemente sea una buena pregunta.
MadHatter

Respuestas:

55

Usted no

De todos modos, esa es la respuesta simple: no la necesita . uWSGI es en sí mismo un servidor capaz.

Sin embargo, otros servidores como nginx han existido por más tiempo y son (probablemente, de todos modos) más seguros, además de tener características adicionales que no son compatibles con uWSGI, por ejemplo, un mejor manejo de los recursos estáticos (a través de cualquier combinación de Expires o E-Tag encabezados, compresión gzip, gzip precomprimido, etc.) que pueden reducir significativamente la carga del servidor y la red; Además, un servidor como nginx frente a su aplicación Django también puede implementar el almacenamiento en caché de su contenido dinámico, lo que ayuda a reducir la carga del servidor e incluso ayuda a facilitar el uso de un CDN (que normalmente no funciona bien con el contenido dinámico) ) Incluso podría ir más allá y tener nginx en un servidor completamente separado, revertir las solicitudes de proxy para contenido dinámico a un clúster de carga equilibrado de servidores de aplicaciones mientras maneja el contenido estático en sí.

Por ejemplo, mi blog (aunque es WordPress, tiene nginx delante) está sintonizado para almacenar en caché las publicaciones durante 24 horas, y para almacenar en caché las páginas de índice durante 5 minutos; Si bien no veo suficiente tráfico para que eso realmente importe la mayor parte del tiempo, ayuda a mi pequeño VPS a resistir el aumento ocasional que de otro modo podría detenerlo, como el gran aumento del tráfico cuando uno de mis artículos fue elegido por un Twitterer con muchos miles de seguidores, muchos de los cuales lo tuitearon a sus miles de seguidores.

Si hubiera estado ejecutando un servidor uWSGI "desnudo" (y suponiendo que hubiera sido un sitio de Django, en lugar de WordPress), podría haber resistido bien, o podría haber fallado y quemado, lo que me costó visitas perdidas . Tener nginx frente a él para manejar esa carga realmente puede ayudar.

Dicho todo esto, si solo está ejecutando un pequeño sitio que no verá mucho tráfico, no hay necesidad real de nginx ni nada más; solo use uWSGI solo si eso es lo que quiere hacer. Por otro lado, si verá mucho tráfico ... bueno, es posible que aún desee uWSGI, pero al menos debería considerar algo en frente para ayudarlo con la carga. En realidad, realmente debería probar diferentes configuraciones de carga con su sitio terminado para determinar qué funciona mejor para usted bajo su carga esperada y usar lo que sea que termine siendo.

Kromey
fuente
3
Lo único que me viene a la mente que creo que vale la pena señalar, además de lo que cubrió @Kromey en su respuesta, es que el protocolo nativo para uWSGI no es http sino el protocolo uwsgi. El protocolo uwsgi es más simple y más eficiente de tratar que http y, por lo tanto, colocar un servidor web con más funciones (nginx o cualquier otra cosa) frente a su aplicación uWSGI en realidad no duplica mucho procesamiento y puede proporcionar beneficios significativos dependiendo de su necesidades.
Håkan Lindqvist
@ HåkanLindqvist es absolutamente correcto; solo para aclarar, uWSGI es totalmente capaz de "hablar" HTTP, sin embargo, por lo que puede sostenerse por sí solo bien, pero sí vale la pena señalar que un servidor web frente a él usaría el protocolo uwsgi, no HTTP, para hable con uWSGI y, por lo tanto, sí, muy poca duplicación del procesamiento involucrado.
Kromey
Esta es una buena respuesta, sin embargo, podría mejorarse con un enlace a la propia documentación de uWSGI sobre el tema, que explica con más detalles lo que puede hacer con uWSGI: uwsgi-docs.readthedocs.io/en/latest/…
Tobias McNulty
1

En mi opinión, si coloca su sitio web en Internet en lugar de Lab, puede ver la diferencia.

Imagine a un usuario de otro país con un navegador web abierto de baja velocidad de red para acceder a su sitio web. uWSGI manejará esa conexión Http en un hilo. Ese hilo puede pasar bastante tiempo esperando una solicitud Http completa debido a la baja velocidad de la red. Si el tamaño de su grupo de subprocesos es 100, imagine que a 100 usuarios les gusta eso lentamente, ¿qué sucederá? No hay subproceso inactivo para manejar otra solicitud Http.

Pero las cosas son bastante diferentes para Nginx. Nginx está diseñado en 'Patrón Reactor'. Puede buscar en Google 'Reactor Pattern' para ver cómo funciona. En resumen, la conexión de baja velocidad no lo afecta para manejar otras solicitudes Http.

Jcyrss
fuente
1
Dudo que usar Nginx vaya a cambiar eso. Cuando una aplicación Django está alojada en Apache usando WSGI, se llamará a la función de vista antes de que cualquier dato POST se lea desde un socket. Por lo tanto, si el cliente es lento, ocupará un subproceso desde que se recibió la solicitud hasta que se hayan recibido los datos POST. ¿Por qué reemplazar eso Apache con Nginx cambiaría eso?
kasperd
1
Como lo que sé, de forma predeterminada, Nginx no enviará la solicitud HTTP al servidor de aplicaciones de fondo hasta que obtenga una solicitud HTTP completa. Entonces, para un servidor de aplicaciones como Django, lo que obtuvieron es siempre una conexión y solicitud HTTP rápidas, sin perder tiempo esperando una solicitud HTTP completa, después de manejar la búsqueda pronto, el hilo en ejecución podría estar inactivo para la próxima solicitud Http pronto.
Jcyrss
1
Se llama buffer de solicitud, que está habilitado por defecto en Nginx (en versiones anteriores de Nginx no era posible desactivarlo): nginx.org/en/docs/http/…
Tobias McNulty