Fundamentos de los Servidores Proxy
Un servidor proxy actúa como un intermediario en la red, situado entre el cliente que inicia la petición y el servidor de destino. Dependiendo de la dirección del tráfico y de quién se oculta, se clasifican principalmente en dos tipos:
Proxy Directo (Forward Proxy)
En este modelo, el tráfico fluye desde el cliente hacia el proxy, y de ahí al servidor externo. El objetivo principle es ocultar la identidad del cliente. El proxy recibe la solicitud, la reenvía al destino y devuelve la respuesta. Un ejemplo común de esta arquitectura son las redes VPN corporativas, que permiten a los empleados acceder a internet bajo una IP unificada.
Proxy Inverso (Reverse Proxy)
Aquí el flujo se invierte: el cliente envía la petición al proxy creyendo que es el servidor final. El proxy inverso evalúa la solicitud y decide a qué servidor interno (backend) debe reenviarla. Posteriormente, entrega la respuesta al cliente como si la hubiera generado él mismo. Esta técnica es fundamental para el balanceo de carga, la terminación SSL y la protección de la infraestructura interna.
Protocolos y Módulos en Nginx
Nginx gestiona diferentes tipos de tráfico a través de módulos específicos integrados en su arquitectura:
ngx_http_proxy_module: Manejo de tráfico HTTP/HTTPS estándar.ngx_http_fastcgi_module: Comunicación con aplicaciones PHP.ngx_http_uwsgi_module: Integración con aplicaciones Python.ngx_http_scgi_module: Soporte para protocolos SCGI (común en Java u otros backends).ngx_http_v2_module: Habilitación del protocolo HTTP/2.
Arquitectura Práctica: Despliegue de un Entorno Proxy
Para ilustrar la configuración, utilizaremos dos nodos: un servidor web interno (backend-01) y un balanceador de carga que actuará como proxy inverso (lb-proxy).
1. Preparación del Servidor Backend (backend-01)
Configuramos un bloque de servidor básico en el nodo backend para alojar una aplicación estática y sus recursos multimedia.
# /etc/nginx/conf.d/app_backend.conf
server {
listen 80;
server_name 10.0.1.10;
location / {
root /var/www/html/portal;
index main.html;
}
location /assets/ {
root /var/www/media;
}
}
2. Compilación e Instalación de Nginx en el Balanceador (lb-proxy)
En lugar de usar paquetes precompilados, instalaremos Nginx desde el código fuente para tener un control total sobre los módulos.
# 1. Descargar el código fuente (versión 1.24.0 como ejemplo)
[root@lb-proxy ~]# wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 2. Extraer y acceder al directorio
[root@lb-proxy ~]# tar -zxvf nginx-1.24.0.tar.gz
[root@lb-proxy ~]# cd nginx-1.24.0
# 3. Instalar dependencias de compilación
[root@lb-proxy nginx-1.24.0]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
# 4. Configurar los parámetros de construcción con un prefijo personalizado
[root@lb-proxy nginx-1.24.0]# ./configure \
--prefix=/opt/nginx \
--conf-path=/etc/nginx/nginx.conf \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-stream
# 5. Compilar e instalar
[root@lb-proxy nginx-1.24.0]# make && make install
3. Configuración del Entorno y Usuario del Sistema
Por seguridad, Nginx no debe ejecutarse como root. Creamos un usuario dedicado sin acceso a shell.
[root@lb-proxy ~]# groupadd -g 800 netadmin
[root@lb-proxy ~]# useradd -u 800 -g netadmin -M -r -s /sbin/nologin netadmin
A continuación, definimos la configuración global de Nginx adaptada a nuestro nuevo usuario y rutas:
# /etc/nginx/nginx.conf
user netadmin;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx-custom.pid;
events {
worker_connections 2048;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format custom_log '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log custom_log;
sendfile on;
keepalive_timeout 60;
include /etc/nginx/conf.d/*.conf;
}
4. Creación del Servicio Systemd
Para gestionar el ciclo de vida del proceso, creamos una unidad de systemd apuntando a nuestro directorio /opt/nginx.
# /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx-custom.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Preparamos los directorios de logs, recargamos el gestor de servicios y verificamos el estado:
[root@lb-proxy ~]# mkdir -p /var/log/nginx
[root@lb-proxy ~]# chown netadmin:netadmin /var/log/nginx
[root@lb-proxy ~]# systemctl daemon-reload
[root@lb-proxy ~]# systemctl enable --now nginx
[root@lb-proxy ~]# nginx -t # Verificación de sintaxis
5. Implementación del Proxy Inverso
Finalmente, configuramos el balanceador para interceptar el tráfico HTTP y reenviarlo al backend utilizando un bloque upstream, lo cual facilita futuras escalaciones.
# /etc/nginx/conf.d/reverse_proxy.conf
upstream backend_pool {
server 10.0.1.10:80;
}
server {
listen 80;
server_name app.mi-dominio.com;
location / {
proxy_pass http://backend_pool;
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;
}
}
Aplicamos los cambios recargando la configuración:
[root@lb-proxy ~]# systemctl reload nginx
6. Validación del Flujo
Para comporbar el funcionamiento, configuramos la resolución DNS local apuntando el dominio hacia la IP del balanceador (por ejemplo, 10.0.1.5).
# /etc/hosts (en la máquina cliente)
10.0.1.5 app.mi-dominio.com
Al acceder a http://app.mi-dominio.com desde el navegador, el balanceador recibirá la solicitud en el puerto 80 y la transmitirá transparentemente al servidor backend-01 alojado en 10.0.1.10.