A continuación se muestra un ejemplo de cómo configurar Nginx para trabajar como reverse proxy en un entorno multisitio y con múltiples backends esta configuración esta optimizada para CMS como WordPress. En este ejemplo se muestran dos archivos de configuración: el archivo principal de Nginx y la configuración para un sitio (el segundo sería similar, utilizando otro dominio y zona). Se han reemplazado los nombres de dominio y zonas originales por example1 y example2. Asimismo, se han omitido las líneas comentadas para concentrar la atención en la configuración activa.
1. Configuración principal de Nginx
El archivo /etc/nginx/nginx.conf
define ajustes globales, como el manejo de conexiones, la compresión, la gestión de SSL y, de forma importante, las rutas de caché que serán utilizadas por cada sitio. En este ejemplo se han definido dos zonas de caché: una para el sitio example1 y otra para example2.
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 8192;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
proxy_ssl_server_name on;
proxy_ssl_verify off;
log_not_found off;
access_log off;
gzip on;
gzip_vary on;
gzip_proxied any;
proxy_buffering off;
proxy_cache_path /var/cache/nginx/example1 levels=2:2:2 keys_zone=example1:100m max_size=500m inactive=7d use_temp_path=off;
proxy_cache_path /var/cache/nginx/example2 levels=2:2:2 keys_zone=example2:100m max_size=500m inactive=7d use_temp_path=off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
keepalive_timeout 600;
send_timeout 600;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
En esta configuración se destaca que se han definido dos rutas de caché con sus respectivas zonas (example1
y example2
), las cuales se utilizarán posteriormente en la configuración de cada sitio.
2. Configuración de un sitio: example1
La siguiente configuración se encuentra en el archivo /etc/nginx/sites-available/example1
(originalmente era para "binariocero", ahora se ha adaptado para example1). Esta definición incluye dos bloques de servidor: uno para atender el tráfico HTTPS y otro para redireccionar las peticiones HTTP.
Bloque HTTPS (Puerto 443)
Este bloque se encarga de recibir las conexiones seguras y redirigirlas al backend correspondiente, aplicando además la caché configurada en la zona example1. La directiva proxy_cache_key
se utiliza para generar la llave de caché en función del esquema, host, URI y dirección del upstream. Además, se incluyen directivas para la gestión del stale cache y una validación adicional de la caché.
server {
server_name example1.com www.example1.com;
location / {
proxy_cache example1;
proxy_cache_key "$scheme$host$request_uri$upstream_addr";
proxy_pass https://192.168.1.14:443;
include proxy_params;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
proxy_cache_valid 30m;
proxy_cache_revalidate on;
proxy_cache_background_update on;
if ($request_uri ~* "/wp-admin/|/back/|/xmlrpc.php|wp-.*.php|index.php") {
set $skip_cache 1;
}
}
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
set $skip_cache 0;
}
Bloque HTTP (Puerto 80)
Este bloque se encarga de redirigir todas las peticiones HTTP a HTTPS o, en su defecto, devolver un error 404. Esto ayuda a evitar contenido duplicado y refuerza la seguridad mediante el uso exclusivo de conexiones encriptadas.
server {
if ($host = www.example1.com) {
return 301 https://$host$request_uri;
}
if ($host = example1.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name example1.com www.example1.com;
return 404;
}
3. Configuración de un segundo sitio: example2
El sitio example2 se configuraría de forma muy similar al de example1, con las únicas diferencias en los nombres de dominio y en la zona de caché. Por ejemplo, el archivo /etc/nginx/sites-available/example2
podría tener el siguiente contenido:
server {
server_name example2.com www.example2.com;
location / {
proxy_cache example2;
proxy_cache_key "$scheme$host$request_uri$upstream_addr";
proxy_pass https://192.168.1.15:443;
include proxy_params;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
proxy_cache_valid 30m;
proxy_cache_revalidate on;
proxy_cache_background_update on;
if ($request_uri ~* "/wp-admin/|/back/|/xmlrpc.php|wp-.*.php|index.php") {
set $skip_cache 1;
}
}
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example2.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example2.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
set $skip_cache 0;
}
server {
if ($host = www.example2.com) {
return 301 https://$host$request_uri;
}
if ($host = example2.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name example2.com www.example2.com;
return 404;
}
Nota: En este ejemplo se ha supuesto que el backend de example2 responde en la dirección
192.168.1.15:443
. Adapta esta IP y demás parámetros a la infraestructura que tengas implementada.
Conclusión
Con estas configuraciones, se logra un entorno de reverse proxy en Nginx capaz de gestionar múltiples sitios y backends, utilizando zonas de caché separadas para cada uno. Esto permite optimizar el rendimiento de las peticiones y mantener una estructura organizada y escalable. Recuerda que después de realizar cambios en la configuración, es recomendable comprobar la sintaxis con:
sudo nginx -t
y, de ser correcto, recargar Nginx:
sudo systemctl reload nginx
Con estos pasos, tendrás un entorno robusto y eficiente que soporta múltiples sitios con sus respectivas configuraciones de caché y seguridad SSL.