Apache vs Nginx

29

He estado investigando las diferencias entre Apache y Nginx recientemente y estoy confundido acerca de cuál debería elegir.

He buscado un poco, pero no hay una comparación definitiva entre los dos y me preguntaba si alguien aquí podría dar su opinión sobre las diferencias entre los dos.

Mi conocimiento actual me permite comprender que mod_php es más rápido y más seguro que fastcgi, sin embargo, Apache es mucho peor cuando se trata de conexiones simultáneas y consumo de memoria.

Mi sitio utiliza muchas encuestas largas pero tiene una base web que no es AJAX (es decir, Apache con encuestas largas en la parte superior).

Mi solución original a los problemas de memoria de Apaches fue enviar el sondeo largo a través de node.js y luego obtener node.js para acceder a Apache cada 2 segundos, en cuyo caso Apache no tendría una conexión abierta, sino node.js. Me di cuenta de que esto podría no ser lo suficientemente bueno y estoy buscando diferentes soluciones. Todavía estoy interesado en saber si mi idea original habría funcionado.

Entonces, ¿cuál es mejor para la web moderna? Apache o Nginx?

Actualización: todas las sugerencias dadas fueron buenas y válidas. He seguido la segunda idea original, que es utilizar un servidor Nginx completo. Estoy satisfecho de que al ser un servidor dedicado no podría sufrir problemas de seguridad de fastcgi y dado que mis largos scripts de sondeo deben estar escritos en PHP, necesito un servidor que pueda manejar conexiones simultáneas de alta carga y Apache simplemente no puede hacer eso, no importa cuánto Cambio la estructura, seguirá teniendo hambre de memoria.

Marqué la respuesta de Martin F, ya que dio una respuesta tan clara y completa a mis puntos de preguntas que siento que merece la calificación, sin embargo, las tres respuestas fueron buenas y válidas y definitivamente analizaré el uso del proxy inverso para otro sitio que poseo ya que acabo de encontrar algo muy muy muy bueno que Nginx puede hacer en representación.

Gracias,

Sammaye
fuente

Respuestas:

28

Parece que tiene algunos conceptos erróneos que creo que deben abordarse.

En primer lugar, mod_php es solo un poco más rápido, todas mis pruebas han demostrado que la diferencia es tan minúscula que no vale la pena tenerla en cuenta. También dudo que el aspecto de seguridad sea relevante para usted, ya que parece estar mirando un servidor dedicado y mod_php realmente solo tiene una ventaja en un entorno compartido; de hecho, en un entorno dedicado php-fpm tendrá la ventaja de que PHP y su servidor web ahora se ejecutan como procesos diferentes, y eso ni siquiera tiene en cuenta las increíbles opciones de registro en php- fpm como el registro lento.

Si el mundo fuera blanco y negro, diría que vaya con una configuración nginx pura y compile php con php-fpm. De manera más realista, si ya tiene Apache funcionando, entonces haga de nginx un proxy inverso a apache y puede ahorrar algunas horas de tiempo de configuración y la diferencia en el rendimiento será pequeña.

Pero supongamos que el mundo es blanco y negro por un segundo, porque esto hace configuraciones mucho más impresionantes. Haces nginx + php-fpm para tu servidor web. Para resolver las cargas, use el módulo de carga y el módulo de progreso de carga para nginx. Esto significa que su servidor web acepta la carga y pasa la ruta del archivo a PHP cuando está hecho, de modo que el archivo no necesita ser transmitido entre nginx y PHP a través del protocolo fastcgi, dulce. (¡Tengo esto en una configuración en vivo y está funcionando muy bien, por cierto!)

Para la descarga del usuario, utiliza la función nginxs x-send-file-like llamada x-accel-redirect, esencialmente realiza su autenticación en PHP y establece un encabezado que nginx recoge y comienza a transferir ese archivo. PHP finaliza la ejecución y su servidor web está manejando la transferencia, ¡qué bien! (Nuevamente, tengo esto en una configuración en vivo y está funcionando muy bien)

Para distribuir archivos a través de servidores u otras operaciones de larga ejecución, nos damos cuenta de que PHP no es realmente el más adecuado para esto, por lo que instalamos gearman, que es un servidor de trabajo que puede distribuir trabajos entre trabajadores en diferentes servidores, estos trabajadores se pueden escribir en cualquier idioma. Por lo tanto, puede crear un trabajador de distribución y generar 5 de ellos usando un total de 200 KB de memoria en lugar de los 100 MB que usaría PHP. Dulce. (También tengo esto funcionando en vivo, así que todo es realmente posible)

En caso de que aún no lo haya detectado, creo que muchos de sus problemas no están relacionados con su servidor web, simplemente piensa de esa manera porque Apache lo obliga a estar relacionado con su servidor web debido a su estructura, a menudo hay herramientas mucho mejores para el trabajo que PHP y PHP es un lenguaje que lo sabe y ofrece excelentes opciones para descargar el trabajo sin tener que abandonar PHP.

Recomiendo encarecidamente nginx, pero también creo que debería buscar otras opciones para sus otros problemas, si tiene un problema de escala o rendimiento, no dude en escribirme. No sé si puede enviar mensajes por aquí, pero de lo contrario escríbame a [email protected] ya que no acecho al servidor por cualquier cosa que no esté etiquetada con nginx. :)

Martin Fjordvald
fuente
1
Maldición, eso realmente aclaró las cosas :) gracias, esa fue la explicación que estaba buscando. Creo que estoy bastante convencido de aprender Nginx ahora, ya que Apache se atragantaría y moriría usando mi sitio. Afortunadamente, parece bastante fácil moverlo. Quiero decir que las personas en node.js han dicho que escriban la mayoría de las cosas en eso y solo sondeen su clase de sesión php si realmente lo necesitan (lo que hago a menos que haya una forma de detectar cuándo los usuarios cierran sus ventanas: P). Sí, estoy corriendo en una granja de servidores masiva, así que saber que no hay amenaza para la seguridad ayuda a toneladas, gracias por la gran explicación :)
Sammaye
He estado mirando esto: joeandmotorboat.com/2008/02/28/… y esto: blog.webfaction.com/a-little-holiday-present y realmente me ha hecho bromear ante la idea de poder anhelar Encuesta a mi corazón contento realmente. Ni un solo problema de memoria a diferencia de Apache :)
Sammaye
Espera, ¿estás diciendo que podría hacer que un trabajador multiproceso en Java y PHP puedan solucionarlo perfectamente? Quiero decir que el mayor problema que veo es el servidor, ya que tengo problemas de memoria masivos con Apache usando sondeos largos, lo cual es común ... ofc solucionado por Nginx.
Sammaye
1
Esencialmente sí, tengo trabajadores de distribución de archivos escritos en C, usando la extensión gearman para PHP, envío un trabajo de distribución al servidor de trabajo gearman y se lo envía a un trabajador, que puede escribirse en cualquier idioma; PHP, Java, C, etc. Este trabajador luego hace su trabajo e informa el estado a Gearman, que informa a PHP. (a menos que se haya elegido un trabajo en segundo plano, en cuyo caso PHP termina sin esperarlo)
Martin Fjordvald
2
Sé que esta es una publicación antigua, pero tengo que decir que esta es una de las publicaciones más informativas que he encontrado sobre el tema de nginx vs apache. Thans Martin, +1.
Akoi Meexx
5

Sugeriría ejecutar nginx como proxy inverso. Manejará todos sus archivos estáticos y en caché (donde es considerablemente más rápido que Apache / menos sobrecarga de memoria) y luego reenviará todas las solicitudes de contenido dinámico a Apache.

Greg Annandale
fuente
Sí, esto es lo que la mayoría de la gente parece estar haciendo en un
cajero automático
1
Recuerde instalar mod_rpaf para Apache para que pueda pasar a través de las direcciones IP del cliente para fines de registro (de lo contrario, los registros de Apache mostrarán todas las solicitudes de 127.0.0.1), agregue lo siguiente en la configuración de nginx: proxy_set_header X-Fordered-For $ proxy_add_x_forwards_for;
Greg Annandale
Me pregunto una cosa antes de intentar esto esta noche. Si estoy enrutando a través de Nginx a Apache que sirve mi PHP, ¿eso significa que las encuestas largas todavía tendrían los mismos problemas que Apache o llamarlo en proxy inverso hace que Apache actúe de manera diferente de alguna manera?
Sammaye
1

No estoy tan seguro de que mod_php sea más rápido que sus alternativas, ¿dónde leíste esto? He realizado algunas pruebas de laboratorio con nginx + php-fpm, y por lo que he medido supera a cualquier otra configuración.

Eche un vistazo a esta configuración: http://interfacelab.com/nginx-php-fpm-apc-awesome/

Lo configuré casi igual, excepto que uso paquetes PHP de http://www.dotdeb.org/ , que incluye un paquete php-fpm y un script de inicio listo para usar. No uso memecache o syck.

pauska
fuente
stackoverflow.com/questions/78108/… lo obtuve de aquí y he revisado el manual de php y dice que php_mod proporciona una ventaja significativa sobre las versiones de cgi. Su configuración se ve bien. Se ve muy fácil también. Lo investigaré :)
Sammaye
2
Establece que CGI es mucho más lento que un módulo integrado, no FastCGI :)
pauska 05 de
1
Bueno, si te preocupa que los procesos de PHP mueran (o que se agote el tiempo de espera), entonces FastCGI (o PHP-FPM) es el camino a seguir. Puede matar procesos infantiles muertos sin interrumpir otras actividades.
pauska
1
Sí. O bien, depende. ¿Cuántas (máximo) número de solicitudes lentas procesará al mismo tiempo? Establezca hilos de PHP FPM máximos para eso, más el número de cgi "rápidos" que desee disponibles. He oído hablar de personas que ejecutan 200 niños PHP-FPM en un servidor con 4 GB de RAM, así que no me preocuparía demasiado si fuera usted. La próxima versión de PHP (5.3.3) incluirá PHP-FPM de forma estándar, donde también se incluye un motor adaptativo: se escalará de acuerdo con la cantidad de solicitudes pendientes.
pauska 05 de
1
Me estaría ejecutando fácilmente en varios servidores (tal vez hasta 10), pero si puedo acomodar 200 solicitudes que se pueden sondear en un servidor de 4 GB, esto debería ser casi la mitad de los 20 servidores que necesitaría ejecutar Apache. hmmmm ... tendré que probar esto esta noche
Sammaye