Introducción
Un proxy inverso es un servicio que acepta la solicitud de un cliente, envía la solicitud a uno o más servidores proxy, recupera la respuesta y entrega la respuesta del servidor al cliente.
Debido a su rendimiento y escalabilidad, NGINX se utiliza a menudo como un proxy inverso para servidores HTTP y no HTTP. Una configuración típica de proxy inverso es usar Nginx frente a las aplicaciones Node.js, Python o Java.
El uso de Nginx como proxy inverso ofrece varios beneficios adicionales:
- Equilibrio de carga: Nginx puede realizar un equilibrio de carga para distribuir las solicitudes de los clientes entre servidores proxy, mejorando el rendimiento, la escalabilidad y la confiabilidad.
- Almacenamiento en caché: con Nginx como proxy inverso, las versiones pre-renderizadas de las páginas se pueden almacenar en caché para acelerar los tiempos de carga de la página. Funciona almacenando en caché el contenido recibido de las respuestas del servidor proxy y usándolo para responder a los clientes sin tener que ponerse en contacto con el servidor proxy para obtener el mismo contenido cada vez.
- Terminación SSL: Nginx puede actuar como un punto final SSL para conexiones con clientes. Manejará y descifrará las conexiones SSL entrantes y cifrará las respuestas del servidor proxy.
- Compresión: si el servidor proxy no envía respuestas comprimidas, Nginx se puede configurar para comprimir las respuestas antes de enviarlas a los clientes.
- Mitigación de ataques DDoS: puede limitar las solicitudes entrantes y el número de conexiones por dirección IP única a un valor típico para los usuarios normales. Nginx también le permite bloquear o restringir el acceso según la ubicación del cliente y el valor de los encabezados de solicitud, como "User-Agent" y "Referer".
Este artículo describe los pasos necesarios para configurar Nginx como proxy inverso.
Prerrequisitos
Digamos que tiene Nginx instalado en su servidor Ubuntu, CentOS o Debian.
Utilice Nginx como proxy inverso
Para configurar Nginx como un proxy inverso a un servidor HTTP, abra el archivo de configuración del bloque del servidor de dominio y especifique una ubicación y un servidor proxy dentro de él:
server {
listen 80;
server_name www.example.com example.com;
location /app {
proxy_pass http://127.0.0.1:8080;
}
}
La URL del servidor proxy se establece mediante la proxy_pass
y puede usar HTTP
o HTTPS
como protocolo, nombre de dominio o dirección IP y un puerto opcional y URI como dirección.
La configuración anterior le dice a Nginx que pase todas las solicitudes a la ubicación /app
al servidor proxy en http://127.0.0.1:8080
.
En las distribuciones basadas en Ubuntu y Debian, los archivos de bloque del servidor se almacenan en el /etc/nginx/sites-available
, mientras que en CentOS en el directorio /etc/nginx/conf.d
Para ilustrar mejor cómo funcionan las location
y proxy_pass
, tomemos el siguiente ejemplo:
server {
listen 80;
server_name www.example.com example.com;
location /blog {
proxy_pass http://node1.com:8000/wordpress/;
}
}
Si un visitante inicia sesión en http://example.com/blog/my-post
, Nginx enviará esta solicitud a http://node1.com:8000/wordpress/my-post
.
Cuando la dirección del servidor proxy contiene un URI, ( /wordpress/
), el URI de solicitud que se pasa al servidor proxy se reemplaza por un URI especificado en la directiva. Si la dirección del servidor proxy se especifica sin un URI, el URI de solicitud completo se pasa al servidor proxy.
Administrar encabezados
Para ajustar o establecer encabezados para conexiones proxy, utilice la proxy_set_header
, seguida del valor del encabezado. Puede encontrar una lista de todos los encabezados de solicitud disponibles y sus valores permitidos aquí. Si desea evitar que se pase un encabezado al servidor proxy, configúrelo en una cadena vacía ""
.
En el siguiente ejemplo, estamos cambiando el valor del Host
$host
y eliminando el Accept-Encoding
del encabezado estableciendo su valor en una cadena vacía.
location /{
proxy_set_header Host $host;
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:3000;
}
Siempre que se cambie el archivo de configuración, el servicio Nginx debe reiniciarse para que los cambios surtan efecto.
Configurar Nginx en un servidor proxy que no sea HTTP
Para configurar Nginx como un proxy inverso a un servidor proxy que no sea HTTP, puede utilizar las siguientes directivas:
fastcgi_pass
: proxy inverso a un servidor FastCGI.uwsgi_pass
: proxy inverso a un servidor uwsgi.scgi_pass
: proxy inverso a un servidor SCGI.memcached_pass
: proxy inverso a un servidor Memcached.
Uno de los ejemplos más comunes es el uso de Nginx como proxy inverso de PHP-FPM:
server {
#... altre configurazioni
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
Opciones de proxy inverso de Nginx
La publicación de contenido a través de HTTPS se ha convertido en un estándar hoy en día. En esta sección, proporcionaremos un ejemplo de configuración de proxy inverso Nginx HTTPS, incluidos los parámetros y encabezados de proxy Nginx recomendados.
location/{
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
proxy_http_version 1.1
: define la versión del protocolo HTTP para el proxy, de forma predeterminada se establece en 1.0. Para Websockets ykeepalive
debe utilizar la versión 1.1.proxy_cache_bypass $http_upgrade
: establece las condiciones en las que la respuesta no se obtendrá de un caché.Upgrade $http_upgrade
yConnection "upgrade"
: estos campos de encabezado son obligatorios si la aplicación utiliza Websocket.Host $host
: la$host
en el siguiente orden de precedencia contiene: nombre de host de la línea de solicitud o nombre deHost
campo Host del encabezado de solicitud o el nombre del servidor correspondiente a una solicitud.X-Real-IP $remote_addr
: reenvía la dirección IP remota del visitante real al servidor proxy.X-Forwarded-For $proxy_add_x_forwarded_for
: una lista que contiene las direcciones IP de cada servidor a través del cual se envió el proxy.X-Forwarded-Proto $scheme
: cuando se usa dentro de un bloque de servidor HTTPS, cada respuesta HTTP del servidor proxy se reescribe a HTTPS.X-Forwarded-Host $host
: define el host original solicitado por el cliente.X-Forwarded-Port $server_port
: define el puerto original solicitado por el cliente.
Conclusión
En este tutorial hemos visto cómo configurar Nginx como Proxy inverso. También hemos mostrado cómo pasar parámetros adicionales al servidor y cómo cambiar y establecer diferentes campos de encabezado en las solicitudes de proxy.
Lea estos artículos para aprender cómo configurar Nginx como Apache 2 Reverse Proxy.