Optimización de Nginx como Proxy Inverso con Caché

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

Cuando se administra un servidor web con múltiples sitios, el rendimiento y la eficiencia en la entrega de contenido son esenciales. En este artículo, exploraremos cómo configurar Nginx como un proxy inverso con caché para optimizar el rendimiento de un sitio web alojado detrás de un servidor Apache.

Configuración General de Nginx

La configuración del archivo nginx.conf define parámetros clave para el funcionamiento del servidor. Algunos puntos clave incluyen:

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;
    proxy_socket_keepalive on;

    log_not_found off;
    access_log off;

    gzip on;
    gzip_vary on;
    gzip_proxied any;

    proxy_cache_path /var/cache/nginx/sitio1 levels=1:2 keys_zone=sitio1:100m max_size=200m inactive=7d use_temp_path=off;
    proxy_cache_path /var/cache/nginx/sitio2 levels=2:2:2 keys_zone=sitio2: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/*;
}

Configuración de un Sitio en Nginx como Proxy Inverso

El archivo de configuración del sitio en sites-enabled establece cómo Nginx manejará las peticiones. Un ejemplo para sitio1.com:

server {
    server_name sitio1.com www.sitio1.com;

    location / {
        proxy_cache sitio1;
        proxy_cache_key "$scheme$host$request_uri$upstream_addr";
        proxy_pass https://192.168.1.100:443;
        include proxy_params;
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
        proxy_cache_valid 200 6h;
        proxy_cache_revalidate on;
        proxy_cache_background_update on;
        proxy_cache_min_uses 1;

        add_header Cache-Control "public, no-cache";
        add_header X-Cache-Status $upstream_cache_status;
    }

    location ~* \.(pdf|ico|svg|jpg|jpeg|png|gif|webp|css|js|woff|woff2|otf|eot)$ {
        proxy_cache sitio1;
        proxy_cache_key "$scheme$host$request_uri$upstream_addr";
        proxy_pass https://192.168.1.100:443;
        include proxy_params;
        proxy_cache_valid 200 1d;
        proxy_cache_revalidate on;
        proxy_cache_background_update on;
        proxy_cache_min_uses 1;

        expires 365d;
        add_header Cache-Control "public, max-age=31557600";
    }

    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/sitio1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sitio1.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    set $skip_cache 0;
    if ($request_method = POST) { set $skip_cache 1; }
    if ($query_string != "") { set $skip_cache 1; }
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|index.php") { set $skip_cache 1; }
}

Redirección de HTTP a HTTPS

Para forzar el tráfico HTTPS y evitar accesos no seguros, se incluye una redirección en otro bloque server:

server {
    listen 80;
    server_name sitio1.com www.sitio1.com;
    return 301 https://$host$request_uri;
}

Conclusión

Esta configuración permite mejorar el rendimiento de los sitios web alojados detrás de un proxy inverso, reduciendo la carga en el servidor de origen mediante una caché eficiente en Nginx. Implementar estas prácticas puede mejorar significativamente los tiempos de respuesta y la experiencia del usuario final.