2010-09-03 9 views
10

Esta pregunta no es nginx vs apache. Estoy más interesado en las ventajas arquitectónicas de NGinx que Apache. Como pude entender:servidores web nginx y apache

  • nginx es un servidor web asíncrono, orientado a eventos, que supera a Apache por un amplio margen.

¿Por qué es esto? ¿Dónde se queda atrás Apache?

+0

¿Está seguro de que Nginx es puramente asincrónico? –

Respuesta

13

No existe una sola razón por la cual nginx estrictamente "supere" a Apache. Para muchos patrones de carga, puede configurar Apache para que maneje esta carga. Para algunos patrones de carga (muy ocupados) nginx en la configuración predeterminada puede presentar degradaciones de rendimiento y puede requerir un ajuste fino para funcionar correctamente.

Sin embargo, ha sido la experiencia de muchos, que nginx realmente funciona "mejor" fuera de la caja, o con un ajuste simple. El rendimiento de muchos sistemas mejoró claramente cuando se instaló nginx como front-end, con Apache movido a back-end.

La razón principal es que nginx está controlado por eventos y contiene la máquina de estados que maneja el ciclo de vida de las conexiones. De esta forma, puede tener muy pocos procesos de "trabajador", cada uno manejando muchos cientos o incluso miles de conexiones simultáneamente. Para Apache, deberá ejecutar la misma cantidad de procesos secundarios (o subprocesos) que el número de conexiones.

Es obvio que tres procesos contra mil procesos deberían ser una gran victoria, al menos.

En particular, nginx permite reducir fácilmente la carga de servir archivos estáticos (imágenes, Javascript, CSS). Manejar cada conexión adicional en nginx es muy barato, por lo que como los archivos estáticos generalmente son mayoría en términos de número de solicitudes, obtienes un procesamiento eficiente.

Además, el rendimiento de nginx es mejor para los "clientes lentos". Cuando Apache mira directamente a Internet y los clientes envían solicitudes a través de líneas (congestionadas), su servidor (rápido) deberá alimentar pacientemente al cliente (lento), esperando hasta que consuma toda la respuesta. Por lo tanto, el niño Apache (o hilo) no puede hacer nada útil. El trabajador de Nginx, por otro lado, simplemente mantiene esta conexión lenta en un conjunto de descriptores epoll, todo mientras procesa otras conexiones.

Desde el punto de vista conceptual, siempre debe tratar de separar las "clases" de solicitudes, con sus propios perfiles de rendimiento y demandas. Por ejemplo, servir pequeños archivos estáticos es una de esas clases; el servicio de páginas dinámicas es otra de esas clases; servir grandes archivos estáticos es otro más. La introducción de nginx a su sistema maneja implícitamente esta separación.

+0

Cita: * Para Apache, tendrá que ejecutar la misma cantidad de procesos secundarios (o subprocesos) que el número de conexiones. * Creo que esto no se aplica si usa 'mpm_event'? –

+0

No, se aplica también a 'mpm_event' (de la lectura http://httpd.apache.org/docs/2.4/mod/event.html,' mpm_event' es simplemente 'worker' con un giro). Apache no tiene un módulo de FSM apropiado. – squadette

+0

@squadette De mi pequeña lectura del código 'mpm_event' no estoy de acuerdo: con' mpm_event' los trabajadores solo se utilizan para realizar E/S cuando el zócalo está listo para ello y para ejecutar los dispositivos de seguridad y los filtros, p. de la misma manera, los trabajadores se usan en libevent (libevhtp), Cherokee, etc. En 'mpm_event' puede tener miles de conexiones con solo unos pocos trabajadores. – ArtemGr

Cuestiones relacionadas