Nginx – Nginx como Proxy para Apache

Después de ver en diferentes pruebas(estático+dinámico), hablando con diferentes personas, atando cabos allí y allá, que Apache agota sus últimos años como servidor Web en Internet, se me hace harto difícil, dilucidar porque Parallels no ha implementado ya Nginx server en su Panel de Control Plesk. Es imposible que exista un sólo motivo técnico de peso para mantener esa decisión. Objeciones, las que sean, mótivos reales, no puedo creer que alguien los defienda.

Actualmente, sigue siendo el servidor web con mayor presencia en Internet de lejos, seguido no muy cerca por Microsoft, pero esto no cambia que Nginx ocupe ya el casi 7% del total. Es por eso que, cada vez más empezaremos a ver post de este tipo en casi todas las webs, blogs, dedicados al tema.

En este post, veremos como configurar Nginx como proxy, teniendo Apache escuchando en otro puerto que no es el 80. Esto de paso, nos servirá para estar más protegidos ante ataques contra Apache. Este tutorial es válido para configuraciones de Apache con VirtualHost, que necesitan la cabecera Header Host para funcionar.

Configurar repositorio EPEL – 64BITS
# wget epel-release-5-4.noarch.rpm
Configurar repositorio EPEL – 32BITS
# wget epel-release-5-4.noarch.rpm

Instalar Nginx

# yum install nginx

Ahora tenemos que añadir una serie de nuevos parámetros a la configuración de Nginx.


proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Esto añade tres nuevos headers a la petición que Nginx traslada a Apache. La definición de estas serían:

Host: necesaria para identificar a que virtualhost queremos acceder
X-Real-IP: la Ip que utiliza el cliente para conectarse a nginx
X-Forwarded-For: IP del cliente y los proxys a través de los cuales, llega la petición

Ejemplo de configuración básica de Nginx como proxy de apache(backend)

user nginx;
worker_processes 4;
daemon off;
events
{
worker_connections 1024;
}
http
{
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 3;
gzip on;
server
{
listen 80;
server_name _;
access_log off;
location / {
proxy_pass http://127.0.0.1:8080;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

A partir de este momento, podemos optar por seguir el siguiente capítulo de la configuración o no, pues no es relativa al funcionamiento del mismo servidor. Si tenemos la necesidad imperiosa de generar estadísticas de tráfico, a través de los logs del propio Apache, necesitaremos instalar un módulo adicional. Se trata de mod_rpaf. Con este módulo indicamos a Apache que utilice los headers X-Forwarded-For y el X-Real-IP como IP en su fichero de log.

Instalar y Configurar Mod_RPAF
# cd /root/
# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
# tar zxvf mod_rpaf-0.6.tar.gz
# cd mod_rpaf-0.6

Deberemos modificar el Makefile para que encuentre el apxs, ya que por defecto lo busca con el nombre “apxs2“:

# sed -i
's/APXS2=\$(shell which \(apxs2\))/APXS2=\$(shell which apxs)/' Makefile

También deberemos, si no esta ya, el bin del apache al PATH:

export PATH=$PATH:/usr/local/bin/

# make rpaf-2.0 && make install-2.0
# echo "LoadModule rpaf_module modules/mod_rpaf-2.0.so"
>> /etc/httpd/conf.d/mod_rpaf.conf
# echo "RPAFenable On" >> /etc/httpd/conf.d/mod_rpaf.conf
# echo "RPAFsethostname On" >> /etc/httpd/conf.d/mod_rpaf.conf
# echo "RPAFproxy_ips 127.0.0.1" >> /etc/httpd/conf.d/mod_rpaf.conf
# echo "RPAFheader X-Forwarded-For" >> /etc/httpd/conf.d/mod_rpaf.conf

Como se ve en el ejemplo, se utiliza la directiva X-Forwarded-For para averiguar la IP de origen del cliente.

Ahora quedaría, configurar Apache y sus VirtualHost para que escuchen por el puerto 8080:

NameVirtualHost
VirtualHost
Listen

Posteriormente, faltaría reiniciar Apache y Nginx.

Links
http://systemadmin.es/2009/08/instalacion-de-nginx-en-modo-proxy-con-un-apache-con-virtualhosts-de-backend

Leave a Reply

Your email address will not be published. Required fields are marked *