¿Cuándo debo cambiar a NGinx?

11

Tengo un servidor con varios dominios y aplicaciones ejecutándose, todo a través de Apache. Todo está bien en este momento, pero tengo planes de desarrollar una aplicación web que requiera mucho rendimiento (usando C ++ con CPPCMS), comenzando con mi servidor para realizar pruebas, tal vez obteniendo un servidor separado solo para esta aplicación una vez que esté lista.

De todos modos, he escuchado mucho sobre NGinx, que parece ser más eficaz que Apache, así que me preguntaba si valía la pena trabajar con él para ese nuevo proyecto. No está claro en mi mente porque no sé qué tipo de cuello de botella de rendimiento NGinx soluciona exactamente.

No soy un usuario avanzado de Apache, soy un pobre administrador de Linux y no desarrollo muchas aplicaciones web (pero tengo nociones). Me dedico principalmente a escribir software, por lo que la parte del servidor web a veces es muy oscura para mí. Cada vez que tengo que configurar un sitio web a través de apach, necesito mucho tiempo para navegar en el documento para asegurarme de no romper todo.

Dicho esto, creo que estoy mejorando mucho de este lado, pero todavía necesito consejos. He visto algunos archivos de configuración nginx, y eso parece mucho más comprensible que los de Apache, pero ¿tal vez estoy equivocado?

Según la información que reuní, NGinx sería la mejor opción cuando desee equilibrar la carga, por lo que si tiene su aplicación distribuida en varias máquinas, ¿verdad? Como estoy pensando en mi aplicación para escalamiento (y rendimiento), parece que es lo que necesito, pero tal vez necesito saber más sobre cuándo es interesante pasar de Apache a NGinx. ¿Vale la pena cambiar a NGinx para todas mis aplicaciones actuales también? ¿Cuanto cuesta? (Quiero decir, ¿es costoso a tiempo cambiar de uno a otro?) ¿Puedo usar Apache y NGinx en la misma máquina sin ningún problema?

Nota al margen : Por favor, no me inste a usar lenguajes interpretados en lugar de C ++, no está relacionado con la pregunta. Consulte la página de justificación de CPPCSM para ver qué tipo de aplicación puede beneficiarse de ella. Entiendo perfectamente los inconvenientes (en comparación con las aplicaciones en Ruby y Python, que ya uso para aplicaciones web que consumen menos energía) y estoy de acuerdo con eso.

Klaim
fuente

Respuestas:

10

Varios puntos:

La principal diferencia entre Apache y Nginx o Lighttpd (que personalmente me gusta mucho) es la arquitectura:

  1. Apache maneja una conexión por proceso o por hilo (dependiendo de mod-XYZ)
  2. Nginx y Lighttpd son de un solo subproceso y manejan múltiples conexiones en un solo evento.

Como resultado:

  1. Nginx y Lighttpd escalan mucho mejor bajo un gran número de conexiones simultáneas, digamos que con 1000 conexiones Apache casi moriría, ya que requeriría 1000 procesos en mod-prefork o 1000 hilos en mod-worker.

    Si planea utilizar tecnologías Comet donde cada conexión requiere una conexión HTTP de sondeo larga, entonces Apache no sería aceptable ya que no se escala bien.

  2. Nginx y Lighttpd consumen menos memoria ya que cada conexión requiere + - dos sockets (HTTP y FastCGI), memoria intermedia intermedia y algún estado, mientras que Apache necesitaría un hilo completo, incluyendo pila y otras cosas.

Desde mi experiencia personal en los puntos de referencia, Lighttpd (y supongo que Nginx también) es un poco más rápido con FastCGI backend que Apache, pero esto es para poca cantidad de conexiones.

Ahora, otro punto es cuando desea hacer algunos equilibrios de carga utilizando conexiones FastCGI.

En la arquitectura tradicional hay

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Debido a que Apache maneja grupos de procesos cada uno de ellos ejecutando mod-PHP (u otros modos)

Cuando usa CppCMS que maneja agrupaciones por sí solo, puede hacer algo diferente:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Básicamente, no necesita otro nivel de indirección porque CppCMS maneja el grupo de procesos, hilos y conexiones por usted. Mientras que PHP / Ruby / Perl necesitan algo de Apache mod-XYZ o manejan su propio conector FastCGI.

Artyom
fuente
+1 Buena explicación completa por el autor de CppCMS;) Ok, ahora veo mejor el problema general. Entonces, el caso en el que solo tiene un servidor (para empezar) es HTTP-> Balancer-> FCGI-> CPPCMS, si lo entiendo correctamente. ¿Qué opinas del consejo del comentario de Jesper Mortensen, que dice que FastCGI no es rápido?
Klaim
@Klaim: Mire los excelentes dibujos anteriores: en esta arquitectura, FastCGI se usa como interconexión entre varios servidores, cada uno de los cuales ejecuta una instancia de CppCMS de subprocesos múltiples. La velocidad relativa de FastCGI importa mucho menos en este caso; sus alternativas serían HTTP, AJP y otros protocolos de red que tampoco son 'rápidos'. Esta respuesta probablemente debería marcarse como aceptada, y su pregunta editada, porque esto no se trata realmente de cuándo vale la pena nginx.
Jesper M
@Jesper Mortensen> Estoy de acuerdo, pero ¿qué modificación de la pregunta sugiere con precisión?
Klaim
6

Nginx, hablando muy ( muy ) en general, puede obtener un rendimiento mucho mayor que Apache gracias a un enfoque arquitectónico diferente al problema de publicar páginas en la web. Nginx también se creó principalmente como un proxy inverso, y cumple ese rol excepcionalmente bien (este es el bit de equilibrio de carga al que aludiste); Apache, por otro lado, fue creado para servir páginas web, y luego ganó la capacidad de proxy.

Dicho esto, es casi seguro que hay áreas en las que Apache superará constantemente a Nginx, mientras que hay otras en las que Nginx superará a Apache de manera constante.

La respuesta corta es que si Apache está trabajando para usted, no hay necesidad de cambiar. (Y digo esto como un antiguo usuario de Apache que se ha convertido en un discípulo de Nginx totalmente convertido). Solo cuando el tráfico a su servidor comienza a alcanzar niveles en los que Apache se está convirtiendo en su cuello de botella (esto es del orden de algunos miles de conexiones simultáneas, pero variará enormemente según las especificaciones de su servidor y otra carga del servidor), o si está tratando de ejecutar Apache en un entorno de escasos recursos donde apenas puede encajar, cambiar a Nginx le brinda un beneficio sólido.

Dicho esto, si desea cambiar a Nginx (¡lo que sí animo!), Entonces hágalo. ¿Verás algún beneficio? 9 de cada 10 veces: No, no lo harás. Pero mencionó que le gusta más el idioma del archivo de configuración de Nginx, por lo que si le hace sentir más cómodo configurar Nginx que Apache, ¡eso es un beneficio para usted! (Personalmente, creo que las configuraciones de Apache son más fáciles de leer en general, pero eso podría deberse a que pasé muchos, muchos años leyéndolas, ¡y solo unos pocos meses en Nginx!)

En una nota al margen: mencionaste tu deseo de construir una aplicación web en C ++. En aras de su cordura, le recomiendo encarecidamente que utilice un lenguaje de nivel superior como PHP, Python o incluso Java. Luego perfile su código y considere crear módulos basados ​​en C ++ para abordar cuellos de botella específicos (Python y PHP lo permiten con bastante facilidad; no sé acerca de Java). Si le preocupa el rendimiento general, tenga en cuenta lo siguiente: EVE Online, el MMORPG sin sombrear más grande del mundo, se basa en una variante de Python (Stackless Python), con solo componentes clave (por ejemplo, las bibliotecas de gráficos) escritos en C ++. Si Python puede manejar eso, ¿seguramente puede manejar su aplicación web?

Kromey
fuente
+1 gracias. Sobre C ++, vea mi comentario sobre la respuesta de Jesper Mortensen. Además, incluso si Python se usa en el lado del servidor de Eve Online (sé mucho sobre esto) AFAIK, solo administra el código de juego (que es grande), y algunas otras partes están de hecho en C ++. El código gráfico está en el lado del cliente, por lo que C ++ también es obligatorio para este tipo de rendimiento gráfico. Como dije, vea la página de Justificación de CPPCMS sobre por qué lo elegí. Si siguiera su consejo, tendría que escribir mi solicitud dos veces, mientras que ya sé que consume mucha energía. Además, entiendo los inconvenientes y estoy bien con eso.
Klaim
3

Nadie puede responder realmente la parte "cuándo debería cambiar": dependerá de su carga, el rendimiento de su propio código de aplicación, etc.

NGinx, eso parece ser más eficiente que Apache

nginx usa un solo proceso (o un número muy pequeño de procesos de trabajo) para manejar todas las conexiones de los clientes que usan E / S con eventos. Apache tiene varios "Módulos de procesamiento múltiple" disponibles, pero todos se inclinan más hacia muchos procesos / muchos hilos. Como resultado, Apache generalmente consumirá más RAM y CPU que nginx para el manejo básico de la conexión HTTP. Puede obtener una descripción general de los diferentes enfoques de manejo de conexiones en la página C10K de Kegel .

aplicación web que requiere mucho rendimiento (usando C ++ con CPPCMS)

Me fuertemente sugieren considerar hacer la aplicación web básica en un lenguaje de alto nivel (Python, o tal vez Ruby, Scala), y el uso de mensajes con cola para enviar entradas de trabajo a las máquinas de los trabajadores que manejan las tareas "rendimiento intensivo" de forma asíncrona.

NGinx sería la mejor opción cuando desee equilibrar la carga,

nginx es un buen equilibrador de carga; pero hay muchas opciones en ese espacio .

¿Puedo usar Apache y NGinx en la misma máquina sin ningún problema?

Si. Simplemente ejecútelos en diferentes números de puerto IP y / o direcciones IP.

Jesper M
fuente
"Sugeriría encarecidamente considerar hacer la aplicación web básica en un lenguaje de nivel superior"> No dije que fuera una aplicación web básica, ni siquiera es trivial. Si ve la justificación del uso de CPPCMS, el autor señala los pocos casos en los que podría ser útil, y estoy en esos casos. He considerado otras alternativas, pero las encontré más caras que usar C ++, al menos en el tipo de aplicación web que estoy escribiendo. Entonces no es parte de la pregunta. Pero entiendo su consejo y da lo mismo a las personas que me preguntan si deberían usar C ++ para aplicaciones web. También planeo usar Python para otra aplicación más simple.
Klaim
De todos modos, +1 para los detalles.
Klaim
@Klaim: si desea realizar la supuesta mejora del rendimiento de "orden de magnitud" sobre una implementación bien ajustada de C # / Java, entonces vea si puede ejecutar CppCMS y el código de la aplicación en proceso con su servidor web, es decir, como un complemento para nginx / Apache. Las páginas de CppCMS parecen mostrar FastCGI como conexión entre el servidor web y CppCMS; y en realidad FastCGI no es ... rápido.
Jesper M
> Interesante idea. La mayoría de los consejos es que debe usar fastcgi porque es más rápido que las alternativas. Comprobaré si puedo hacer esto, quizás vea con el autor de CPPCMS por qué cree que es el más rápido.
Klaim