Configurando Nginx como Proxy Inverso

Primero creamos los directorios donde se alojará las configuraciones para todos los sitios.

mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/sites-enabled

Ahora vamos a crear la configuración de Nginx como proxy inverso.
En /etc/nginx/sites-available/ creamos un archivo con la configuración del sitio al que apuntará el proxy. (Para esta prueba crearemos la configuración para el siguiente dominio (example.com) ).

vim /etc/nginx/sites-available/example.com.conf

Sobre este archivo agregamos la siguiente configuración correspondiente a la configuración de proxy inverso sobre los sitios que indicamos anteriormente.

server {
    listen		80; #Puerto sobre el cual escucha
    server_name	example.com www.example.com;
    access_log	/var/log/nginx/example.com.access.log main;
    access_log 	/var/log/nginx/example.com.cache.log cache;
    error_log   	/var/log/nginx/example.com.error.log error;

    location / {
        proxy_pass   http://192.168.1.200:80; #Host donde apunta
    }
    Include		/etc/nginx/proxy.conf; # Incluimos la configuración del Proxy
}

La directiva proxy_pass establece la dirección del servidor proxy y el URI al que se asignará la ubicación. Dirección se puede dar como nombre o dirección y el puerto, por ejemplo: proxy_pass http://localhost:8000/uri/;.

Procedemos a crear el archivo /etc/nginx/proxy.conf que contendrá la configuración del Proxy.

vim /etc/nginx/proxy.conf

Y le agregamos el siguiente contenido correspondiente a la configuración del Proxy.

proxy_cache             STATIC;
proxy_cache_valid       200  1d;
proxy_cache_use_stale   error timeout invalid_header updating
                        http_500 http_502 http_503 http_504;

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    16m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

Ahora pasamos a editar el archivo de configuración principal de Nginx /etc/nginx/nginx.conf.

Dentro del contexto http hacemos el include que levantará todos los sitios habilitados, también agregamos la configuración correspondiente al cache del proxy.

Archivo de configuración /etc/nginx/nginx.conf.

user  nginx;
worker_processes  2;

#Cantidad limite de conexiones de red abiertas por cada worker_processes
worker_rlimit_nofile 4096;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  2048;
    use epoll;
};

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    #Definimos la configuración de cache para el proxy.
    proxy_cache_path  /var/cache/nginx/proxy_temp   levels=1:2    keys_zone=STATIC:10m
                                                    inactive=24h  max_size=1g;

    #Incluimos los sitios habilitados
    include /etc/nginx/sites-enabled/*.conf;

}

Después de creada la configuración, creamos un link simbólico en la carpeta /etc/nginx/sites-enabled/ que es donde se levantarán todos los sitios habilitados (Se creó esta estructura para que sea mas fácil para los que ya hemos trabajado con Apache)

ln -s /etc/nginx/sites-available/crisishazterico.conf /etc/nginx/sites-enabled/

Después de creado el link simbólico reiniciamos el servidor Nginx para que tome los nuevos cambios.

/etc/init.d/nginx start

Con esto ya deberíamos tener nuestro sitio funcionando a través de un proxy inverso. Para probarlo deberemos mapear el dominio en el host de nuestra maquina a la IP del servidor proxy y probar si accede bien. (Con herramientas como Firebug podemos chequear desde que IP levanta los recursos un sitio)

  • Wilmer Javier Castellanos

    soy nuevo en esto, tengo una duda que quizás para los entendidos sea una obviedad, pero quisiera saber es mejor el rendimiento en un entrono de una pila LEMP o usar Lamp con Nginx como proxy reverso. Y si en lemp ya hace de proxy reverso o se podría usar Lemp y aparte configurar lo del proxy reverso en el nginx.conf

    Gracias por adelantado a cualquier ayuda

    • LAMP = Linux, Apache, MySQL y PHP
      LEMP = Linux, Nginx (E=Engine-X), MySQL y PHP

      El rendimiento depende de lo que tengas corriendo en el servidor y el tráfico que visitas que tengas, en entornos de mucho tráfico (miles de sessiones concurrentes) se tiende a tener un servidor para cada cosa, por ejemplo uno solo para el proxy inverso de Nginx.

      Otra cosa, el entorno LEMP, no tiene apache por lo que si no lo instalas deberías de hacer que por medio de sockets y una librería poder conectar nginx con php y servir tus páginas php sin necesidad de Apache, en este caso esta opción es mejor.
      Si usas LAMP y quieres usar Nginx tenes la sobrecarga de recursos que implica tener otro server corriendo, pero ojo, tener Nginx delante como proxy inverso siempre es beneficioso ya que tenes el cache y es mas eficiente para servir recursos estáticos.

      Un ejemplo, hace un tiempo una empresa tenia varios servers XLarge de intancias EC2 en Amazon con muchos sitios wordpress que mataban las maquinas. El problema era que los templates de los wordpress que se usaban en ese momento, las imagenes thumb que usaban eran re-dimensionadas en caliente, (Algo muy costo para los servidores) y ese valor multiplicado por el tráfico hacia que los servers colapsen. Una solución muy eficiente y que todavía está corriendo fue de poner un NGINX delante y cachear esas urls en NGINX, entonces ahí no se hacía mas el resize dinámico en cada petición sino únicamente cuando vencía el cache de Nginx que creo lo puse a un mes.

      Estas y muchas otras bondades presenta Nginx y la mayoría de los portales con millones de visitas diarias lo usan junto con otros servicios tan buenos o mejores que Nginx como Varnish.

      • Wilmer Javier Castellanos

        Gracias por responder, en mi caso yo tengo un wordpress instalado en un vps con la pila LEMP, es decir, ya tengo nginx con PHP-FPM; el corre bien, aunque hay unos picos a ciertas horas, entonces investigando aquí y allá veo lo del proxy inverso. Mi duda está en si se puede hacer cache en el mismo servidor usando proxy inverso. Veo que hay algunos plugins de wordpress que ayudan a limpiar ese cache cada vez que se publica contenido nuevo. Estuve siguiendo tu tutorial pero no sé si cuando usas el proxy_pass hacia esa ip es otro servidor o es el mismo (local) donde tienes el sitio web alojado.

        • Entiendo y si podes. En tu caso no solo trabaja como proxy sino como Webserver, podes configurar para que te cache algunos recursos desde la configuración del Nginx.

          O podes hacerlo con un plugin, pero se puede si

        • Justo en este ejemplo creo que no esta pero te paso un ejemplo:

          Con el location definís un patrón/expresión de la url a configurar
          location ~* /(autenticacion|carrito|direccion|module|modules|api|backend|mylogout)/.*$ {
          access_log /[YOUR_PAHT]/access.log main;
          error_log /[YOUR_PAHT]/error.log error;

          proxy_cache_valid 200 1d; # 1 dia de cache
          expires 1d;
          proxy_cache staticfilecache;
          add_header Pragma “public”;
          add_header Cache-Control “max-age=86400, public, must-revalidate, proxy-revalidate”; # Tambien especificamos cache de browser
          add_header ContentSource “Mi cache”; # Header inventado por mi para saber si el recurso entro en cache
          proxy_pass http://192.168.1.200:80 # Host donde apunta
          }

          Este ejemplo es una fracción de configuración para un Prestashop

  • Martin

    Tambien pones el Include con la primera mayuscula en example.com.conf (cuando deberia ser todo en minusculas)

    • No afecta en nada eso! A parte si no aporta lo que dices no comentes