Cómo configurar un proxy reverso Nginx¶
Requerimentos¶
Acceso root a un sistema Linux actualizado con Nginx instalado
Conocimientos básicos de la línea de comandos de Linux
Editor de texto a elección
¿Cómo funciona un proxy reverso?¶
El servicio de proxy actúa como interfaz y se encarga de gestionar todas las solicitudes entrantes de los clientes y distribuirlas al servidor web, la base de datos y/u otros servidores. Un sistema que se encuentra entre un cliente y un servidor web (o servidores) puede configurarse como un proxy reverso.
Ventajas de un proxy reverso¶
Configurar un proxy reverso Nginx significa que todas las solicitudes entrantes se gestionan en un único punto, lo que ofrece varias ventajas:
Balanceo de carga – distribuye las conexiones entrantes a los servidores backend, e incluso puede hacerlo en función de la carga actual de cada servidor. Esto garantiza que ninguno de los servidores backend se sobrecargue con solicitudes. También evita el tiempo de inactividad, ya que el proxy reverso puede redirigir el tráfico si un servidor backend se desconecta.
Registro centralizado – en lugar de que varios servidores generen logs, el proxy reverso puede registrar toda la información relevante en una única ubicación. Esto facilita enormemente el trabajo del administrador, ya que los problemas se pueden aislar mucho más rápidamente y no es necesario analizar archivos de registro de varias ubicaciones para solucionar los problemas.
Mayor seguridad – Dado que filtra el tráfico antes de reenviarlo al backend, solo se transmite tráfico inocuo a los demás servidores. Actúa como primera línea de defensa contra los ataques entrantes al ocultar la información sobre los servidores backend.
Mejor rendimiento – puede tomar decisiones inteligentes sobre cómo distribuir la carga entre los servidores backend, lo que se traduce en tiempos de respuesta más rápidos. Otras tareas comunes del servidor, como el almacenamiento en caché y la compresión, también se pueden descargar al servidor proxy reverso, liberando recursos para los servidores backend.
Atención
Un proxy reverso no es un componente necesario en todos los escenarios de hosting web. Sus ventajas se hacen más evidentes en condiciones de alto tráfico o en situaciones en las que se implementan múltiples servidores backend y se necesita algún tipo de equilibrio de carga.
¿Por qué Nginx?¶
La escalabilidad de Nginx y su capacidad probada para gestionar un volumen extremadamente alto de conexiones lo convierten en la opción perfecta para su implementación como proxy reverso y balanceador de carga.
Una aplicación común es colocar Nginx entre los clientes y un servidor web, donde puede funcionar como punto de terminación para el cifrado SSL y acelerador web. Las operaciones que normalmente aumentarían la carga en un servidor web, como el cifrado, la compresión y el almacenamiento en caché, se pueden realizar de manera más eficiente a través de un proxy reverso Nginx.
Cómo configurar el proxy reverso Nginx¶
En esta sección repasaremos los pasos necesarios para configurar un proxy reverso Nginx.
Desabilitar el bloque de servidor predeterminado
# unlink /etc/nginx/sites-enabled/default
Crear archivo de configuración para el proxy reverso
/etc/nginx/sites-available/proxy-reverso.conf
Pegar la siguiente plantilla de configuración:
server {
listen 80;
location /alguna/ruta/ {
proxy_pass http://dominio.edu.ar;
}
}
Reeplazar dominio.edu.ar con la dirección o el nombre de host del servidor al que se está reenviando. También puede especificar un puerto con el nombre de host, como por ejemplo 127.0.0.1:8080. Guarde los cambios y salga del editor de texto.
Enable the proxy With your settings saved, enable the new configuring by creating a symbolic link to the sites-enabled directory:
# ln -s /etc/nginx/sites-available/proxy-reverso.conf /etc/nginx/sites-enabled/proxy-reverso.conf
Servidores que no son HTTP¶
El ejemplo anterior muestra cómo pasar solicitudes a un servidor HTTP, pero Nginx también puede actuar como proxy inverso para FastCGI, uwsgi, SCGI y memcached. En lugar de utilizar la directiva proxy_pass mostrada anteriormente, sustitúyala por el tipo adecuado:
proxy_pass (HTTP server – como se ha visto anteriormente)
fastcgi_pass (FastCGI server)
uwsgi_pass (uwsgi server)
scgi_pass (SCGI server)
memcached_pass (memcached server)
Cómo pasar encabezados¶
Para configurar qué encabezados pasa el proxy reverso a los demás servidores, se pueden definir en el archivo de configuración creado anteriormente. Utilice la directiva proxy_set_header para ajustar los encabezados.
Se pueden configurar en el bloque server, location o http. Por ejemplo:
location /alguna/ruta/ {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://dominio.edu.ar;
}
El ejemplo anterior define tres tipos de encabezados y los establece en las variables respectivas. Hay muchas opciones diferentes para pasar encabezados, pero este ejemplo muestra tres que son muy comunes.
El encabezado Host contiene información sobre qué host se está solicitando. El encabezado X-Forwarded-Proto especifica si la solicitud es HTTP o HTTPS. Y el encabezado X-Real-IP contiene la dirección IP del cliente solicitante.
Cómo configurar el balanceo de carga¶
El balanceo de carga es una de las principales razones para configurar un proxy reverso. Veamos un ejemplo:
upstream granja_servidores {
server host1.dominio.edu.ar;
server host2.dominio.edu.ar;
server host3.dominio.edu.ar;
}
server {
listen 80;
server_name dominio.edu.ar;
location / {
proxy_pass http://granja_servidores;
}
}
En este ejemplo, hemos añadido un contexto llamado granja_servidores. Dentro de él, el nombre de host/IP de cada servidor se especifica en una línea separada.
En la directiva proxy_pass, donde normalmente introduciríamos un nombre de host o una dirección IP, hemos especificado el nombre del contexto upstream definido anteriormente: granja_servidores.
Esta configuración reenviará las solicitudes entrantes a dominio.edu.ar a los tres hosts diferentes especificados en nuestro upstream. De forma predeterminada, Nginx reenviará estas solicitudes por turnos, lo que significa que cada host se turna para atender una solicitud.
Configurar algoritmos de balanceo de carga¶
Round robin es el algoritmo predeterminado que Nginx utilizará para rotar las solicitudes en el upstream. Hay otros algoritmos disponibles que se adaptan mejor a determinadas situaciones:
least_conn: distribuye las conexiones entrantes a los servidores backend en función de su número actual de conexiones activas. Un servidor solo recibirá una solicitud si tiene la menor cantidad de conexiones en ese momento. Esto es especialmente útil en aplicaciones que requieren conexiones duraderas con el cliente.
ip_hash: distribuye las conexiones entrantes en función de la dirección IP del cliente. Esto resulta útil si necesita crear consistencia en la sesión.
hash: distribuye las conexiones entrantes en función de una clave hash. Esto resulta útil especialmente con hosts memcached.
Especifique un método de balanceo de carga en la parte superior del contexto upstream, de la siguiente manera:
upstream granja_servidores {
least_conn;
server host1.dominio.edu.ar;
server host2.dominio.edu.ar;
server host3.dominio.edu.ar;
}
Cómo probar la configuración de Nginx¶
Siempre debe probar su configuración en busca de errores inmediatamente después de editar el archivo .conf y, si no hay errores, reiniciar Nginx.
# service nginx -t
# service nginx restart
Para verificar que el proxy reverso funciona correctamente puede acceder al dominio en un navegador web o utilizando una herramienta como curl.
$ curl -I http://dominio.edu.ar
Este comando debería devolver los encabezados HTTP del servidor backend, lo que confirma que el proxy reverso está activo y operativo.