Nginx Varnish Nginx Django?

13

Tengo una aplicación django y quiero configurar Varnish en un servidor frente a él. En otro hilo predeterminado del servidor, alguien sugirió poner Nginx delante de Varnish.

¿Debo poner Nginx delante de Varnish en el servidor de almacenamiento en caché? Si es así, ¿debo usar Nginx en el servidor de aplicaciones?

Enrico
fuente

Respuestas:

10

Estamos hablando de 1 a 3 servidores frontend en total, ¿no es una gran granja de servidores con equilibrio de carga entre los niveles?

Poner nginx delante de Vanish le permite hacer compresión HTTP sobre la marcha. Esa es una mejor práctica de rendimiento, pero podría prescindirse de ella. (El contenido en Varnish a menudo se mantiene sin comprimir, de modo que ESI incluye el trabajo y, por lo tanto, no tiene que lidiar con múltiples versiones en caché del mismo objeto dependiendo de la coincidencia del encabezado / navegador Vary).

Con respecto a nginx en el servidor de aplicaciones, ¿ Apache con mod_wsgi no es la forma recomendada y más común para implementar nuevas instalaciones de Django en la actualidad? No conozco una razón convincente para usar nginx / fastcgi sobre Apache / mod_wsgi para Django; pero deberías obtener consejos de un experto de Django.

En cuanto a que Varnish tiene características de equilibrio de carga atractivas que nginx no tiene, ¿no veo cuáles son? El barniz tiene un balance aleatorio y redondo. nginx tiene round-robin, IP de cliente y hashing constante: ¿no veo un beneficio significativo para Varnish? ¿Es la recarga de configuración elegante de VCL o Varnish o algo más?

Para una pequeña configuración de servidor 1-3, supongo que simplemente haría

Barniz -> Apache / mod_wsgi / Django

o tal vez

Calamar -> Apache / mod_wsgi / Django

e ignore la compresión HTTP por simplicidad, a menos que el ancho de banda sea costoso.

Actualizar:

Graham Dumpleton ha escrito un valioso comentario a continuación. Menciona una configuración muy común, por ejemplo, un blog en un VPS, o una pequeña granja web sin almacenamiento en caché:

nginx -> Apache / mod_wsgi / Django

Esta es una muy buena solución, por un par de razones:

  1. Configuración simple
  2. nginx, que tiene alta velocidad y una sobrecarga mínima, maneja el servicio de archivos estáticos y la conexión del navegador de manera activa.
  3. Django se ejecuta en el excelente mod_wsgi de Graham Dumpleton, la plataforma recomendada para Django.

La razón por la que no mencioné esto inicialmente es que OP parecía requerir Varnish, una solución de almacenamiento en caché de muy alto rendimiento. El combo nginx / Apache / mod_wsgi no puede almacenar en caché con un nivel de rendimiento y flexibilidad que coincida con Varnish.

Jesper M
fuente
2
Incluso podría usar 'nginx -> Apache / mod_wsgi / Django' como muchas personas lo hacen por varias buenas razones.
Graham Dumpleton el
44
La otra cosa que proporciona nginx en ese caso de uso que muchos no se darían cuenta es que nginx aísla a Apache de clientes lentos. Esto se debe a que nginx no transmite contenido de hasta cierto tamaño. En su lugar, almacenará los encabezados y el contenido de la solicitud y solo la solicitud de proxy cuando lo tenga todo. Esto significa que solo se lo entrega a Apache cuando toda la información necesaria para manejar la solicitud está disponible. Por lo tanto, Apache / mod_wsgi estará ocupado durante el menor tiempo posible y los procesos / subprocesos no estarán atados por un cliente lento. También se produce una medida de almacenamiento en búfer en reversa para que Apache pueda terminar más rápido también.
Graham Dumpleton el
2
@Graham Dumpleton: Es muy agradable tenerte aquí, espero que te quedes. :-). Con respecto a la multiplexación HTTP nginx / manejo de conexión inteligente, estoy completamente de acuerdo.
Jesper M
Ante todo, gracias a Jesper y Graham por tomarse el tiempo para escribir respuestas tan completas. Estoy planeando poner un servidor de equilibrio de carga frente a dos servidores de aplicaciones. Un servidor manejará la mayor parte del tráfico y el segundo se utilizará principalmente para la conmutación por error y las nuevas funciones de prueba beta.
Enrico, el
Varnish es atractivo porque me da control total sobre qué solicitudes se envían a qué backend. Varnish también verifica el estado de los servidores de back-end, la conmutación por error es fácil de configurar y maneja los backends lentos / muertos con gracia (si ambos servidores mueren).
Enrico, el
4

Puede usar nginx sin barniz para proxy y almacenar en caché el contenido.

silencio
fuente
2
barniz tiene algunas características atractivas de equilibrio de carga que nginx no tiene listo para usar
Enrico es el
44
¿Qué características, por ejemplo?
silencioso
4

He estado usando Nginx, Varnish y Apache / mod_wsgi / Django con éxito. Comencé con la siguiente configuración:

Nginx -> Apache / mod_wsgi / Django

Una vez que comencé a ver una carga significativa en Apache, agregué Varnish:

Nginx -> Barniz -> Apache / mod_wsgi / Django

Yo uso Nginx como una especie de "enrutador de URL". Las solicitudes de administración de Django se envían directamente desde Nginx a Apache. Las solicitudes de los clientes se envían desde Nginx a Varnish, que almacena en caché las solicitudes de Apache y también sirve elementos "agraciados" de la memoria caché si los servidores de la aplicación no están disponibles.

Mi servidor Nginx también sirve directamente cierto contenido estático (por ejemplo, imágenes, CSS y archivos javascript).

En general, el rendimiento ha sido excelente. He notado un par de advertencias que debo mencionar:

  1. En un sitio ocupado, reiniciar Varnish puede hacer que la carga aumente en los servidores de aplicaciones, por lo que es mejor mantener Varnish reinicia al mínimo. (Varnish no parece tener una "recarga" como Nginx / Apache donde solo vuelve a leer sus archivos VCL). Por el contrario, recargar una configuración de Nginx tiene un impacto mínimo. Por esta razón, hago la mayor parte de la reescritura de URL y "enrutamiento" en Nginx.
  2. El barniz es fácil de colocar entre Nginx y Apache. Si comienza a notar una gran carga en sus servidores de aplicaciones, agregar barniz incluso con la configuración predeterminada realmente puede marcar la diferencia.
  3. Si usa Varnish, definitivamente debe pensar en cómo manejará la invalidación de caché.
  4. Mi experiencia ha sido que Varnish maneja los backends fallidos con un poco más de gracia que Nginx (como usted señaló anteriormente).
David Narayan
fuente
Nunca he visto barniz detrás de otra cosa. El barniz suele ser el equilibrador de carga que hace el enrutador de url. Entonces, ¿tienes 2 servidores web y 1 proxy o 2 servidores proxy y 1 servidor web? Q
ioanb7
2

Estoy usando Nginx-> Varnish-> uWSGI-> Django

Mecanismo
fuente