# Implementando un Entorno de Proxy Inverso Multisitio y Multibackend con Nginx y Caché Avanzada

- Link: https://binariocero.com/linux/implementando-un-entorno-de-proxy-inverso-multisitio-y-multibackend-con-nginx-y-cache-avanzada
- Published: 2025-02-01T10:48:11+01:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

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**.

    ```wp-block-preformatted
    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é.

    ```wp-block-preformatted
    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.

    ```wp-block-preformatted
    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:

    ```wp-block-preformatted
    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:

    ```wp-block-preformatted
    sudo nginx -t
    ```

y, de ser correcto, recargar Nginx:

    ```wp-block-preformatted
    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.
