Hace un tiempo venía con ganas de probarle, hasta que a la final analizando cómo está funcionando plesk 11 me dí cuenta que utilizan nginx como un proxy reverso para apache.
Bueno, ¿qué es esto de un proxy reverso y para qué me sirve?
Normalmente tu tienes digamos un servidor apache, y este servidor tiene ciertas customizaciones instaladas ya sea que instalaste algún tipo de módulo para un lenguaje de programación fuera de lo normal, exótico, o que en el .htaccess tienes ciertos rewrites muy complejos, o no sé, tienes algún módulo sumamente interesante que te parece imprescindible para el funcionamiento del sitema.
El hecho, yendo un poco más a lo directo, es que no puedes prescindir del apache por una u otra razón. Pero su desempeño no te convence. Está dejando de responder a ratos, se te agota la memoria del servidor; y cuando miras en los logs de apache notas que hay cientos de miles de peticiones.
Tu sitio funciona así:
Es decir, tienes apache corriento en tu server, el apache está atendiendo en el puerto 80 de ambas interfaces que tienes: la ethernet (eth0) y en localhost (lo). Lógicamente si llega una petición por la IP 1.2.3.4 que está en la eth0, le atiende el apache y de la misma forma, si llega una petición por 127.0.0.1 que es la IP de lo (localhost) igual le atiende, no es cierto? Ok, quién se va a fijar en localhost por favor! Pues mira, que sí es importante.
Bueno pues: te felicito … tienes un sitio web muy accedido, muy popular, y te felicito por esto! Pero el apache que está escuchando en ambas interfaces no te acompaña, su forma de trabajar ya no te funciona bien, tienes problemas.
¿Cómo puedes resolverlo? Una variante es instalar un proxy reverso, que es un servidor de proxy delante de él (del apache). De forma tal que cuando alguien vaya a ver tu sitio web, el server de proxy reverso atienda la petición y si considera necesaria o útil, le pase esta petición al apache.
Así quedaría
A ver te explico: yo configuraré el nginx de forma tal que si llega una petición a la IP publica (externa) mía 1.2.3.4 en el puerto 80, quien le atienda sea el nginx. Y si el nginx lo considera, reenviará esta petición al puerto 80 de la IP 127.0.0.1 que será atendido por el apache. Como ambos, el nginx y el apache, corren en el mismo equipo, pues puedo hacer esto sin inconveniente ninguno.
El procedimiento es el siguiente:
Yo parto del hecho de que ya tenemos el apache funcionando en el servidor, bien, con todas las de la ley… y que lo que quieres es agregar el nginx como un proxy reverso, ok?
Procedo a instalar el repositorio de epel y entonces ejecuto:
yum install nginx
wow.. y ya estará instalado.
Luego edito el archivo de configuración default del nginx (/etc/nginx/conf.d/default.conf) y le pongo solamente estos contenidos:
upstream apache {
server 127.0.0.1:80;
}
server {
listen 1.2.3.4:80;
client_max_body_size 4M;
location / {
proxy_read_timeout 150;
proxy_pass http://apache;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
}
}
Bueno, aquí lo más interesante es el parámetro “listen” que le indicará al nginx que escuche en la IP 1.2.3.4 en el puerto 80. Lógicamente deberás modificarle para que escuche en la IP de tu server.
Si te fijas, todo lo que el nginx reciba, lo reenviaré a 127.0.0.1 en el puerto 80. Así que ahora me toca editar el archivo de configuración del apache para decirle que exclusivamente escuche en 127.0.0.1 porque sino ambos servidores se pelearían por el puerto 80 de la ip publica y por el puerto 80 de localhost.. lo que estoy haciendo es a cada uno ponerlo a escuchar en el puerto 80 de dos IPs diferentes (una la IP de eth0 y otra la IP de localhost).
Edito entonces /etc/httpd/conf/httpd.conf y busco una línea que dice:
Listen 80
este línea está descomentada y lo que le indica al apache es que escuche en el puerto 80 de TODAS las IPs que encuentre, yo simplemente le cambio a:
Listen 127.0.0.1:80
Así le estaré indicando que escuche exclusivamente en el puerto 80 de 127.0.0.1
Ahora procedo a reiniciar el apache y arrancar el nginx, en ese orden:
service httpd restart
service nginx start
chkconfig nginx on
Por qué en ese orden? Para primero poner a escuchar al apache en localhost exclusivamente, que libere cualquier otro puerto de cualquier otra IP.. y luego al arrancar el nginx, este comience a escuchar en el puerto 80 de la IP 1.2.3.4
y ya, ahi intenta acceder a tu sitio web y todo se verá normal, tiene que verse normalito.
Lo único que notarás es que la carga bajará drásticamente. Tenemos un servidor cuya carga era continuamente superior a 7.00 y luego de esto, la carga ha bajado a menos de 2. En realidad a un valor cercano a 1 y raramente superior a 1.5.
Seguro hay muchos más parámetros por configurar, pero esto funciona al 100%. Si notas que algo me faltó me avisas para verificarlo.
Muy bien explicado, excelente post, funciona a la perfección.
Muy bien explicado, despues de haber leido en varios sitios la forma de usar nginx como proxy y de haber probado todos sus metodos ninguno me funciono correctamente me daba error de bucle de re-direccionamiento, este simplemente fue probar y al momento todo funciono perfecto, muchas gracias por el post, me ha sido verdaderamente de mucha utilidad.