Forma correcta de utilizar nginx como caché web

Forma correcta de utilizar nginx como caché web

Estoy intentando utilizar nginx como caché web (y no lo logro).

Mi sistema es un servidor Ubuntu 16.04 donde nginx es un proxy inverso para un servidor web gunicorn (es una aplicación Django).

Para configurar el almacenamiento en caché web, agregué las siguientes líneas en la parte superior de mi virtual hostarchivo (el que está en sites-available):

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=90m;
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

A continuación, dentro del serveralcance principal, tengo el siguiente fragmento (donde inyecté las directivas de almacenamiento en caché):

location @https_proxy_to_app {
    proxy_cache static_cache;
    proxy_cache_bypass $http_cache_control;
    add_header X-Proxy-Cache $upstream_cache_status;

    proxy_set_header X-Forwarded-Proto https;
    # additional proxy parameters
    include proxy_params;

    proxy_redirect off;
    proxy_pass http://app_server;
}

Esto no produce HITS o MISSES de caché cuando intento rizar los uris de activos estáticos (que es la única forma de probar si el caché está funcionando o no). Ergo, el almacenamiento en caché no está operativo. Esto es lo que quiero decir:

Probando curl -X GET -I https://example.com/static/css/my_app.cssrendimientos:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 22 Jan 2020 08:05:37 GMT
Content-Type: text/css
Content-Length: 26597
Last-Modified: Fri, 03 Jan 2020 14:23:59 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5e0f4e7f-67e5"
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Accept-Ranges: bytes

Esto es problemático porque se suponía que debía incluir X-Proxy-Cache: HITo X-Proxy-Cache: MISS. Por favor ayúdenme a diagnosticar el problema.


A continuación se muestran todos mis locationbloques (en orden de aparición):

location ~* \.(?:ico|css|js|gif|jpg|jpeg|png|svg|woff|ttf|eot)$ {

    root /home/ubuntu/app/myproj/;
    access_log off;
    error_log off;

}

# shows number of connections at https://example.com/status_nginx
location /status_nginx {
    stub_status on;
    allow 127.0.0.1;
    deny all;
}

location / {

    limit_conn conn_limit_per_ip 20;
    limit_req zone=req_limit_per_ip burst=10 nodelay;

    limit_req_log_level warn;

    #proxy_pass_request_headers on;
    proxy_buffering on;
    proxy_buffers 24 4k;
    proxy_buffer_size 2k;
    proxy_busy_buffers_size 8k;

    try_files $uri @https_proxy_to_app;
}

location @https_proxy_to_app {

    proxy_cache static_cache;
    proxy_cache_bypass $http_cache_control;
    add_header X-Proxy-Cache $upstream_cache_status;

    proxy_set_header X-Forwarded-Proto https;
    # additional proxy parameters
    include proxy_params;

    proxy_redirect off;
    proxy_pass http://app_server;
}

Respuesta1

Su .cssarchivo se sirve utilizando el siguiente bloque en su configuración:

location ~* \.(?:ico|css|js|gif|jpg|jpeg|png|svg|woff|ttf|eot)$
    root /home/ubuntu/app/myproj/;
    access_log off;
    error_log off;
}

Esto significa que nginx envía el archivo directamente, sin utilizar el servidor ascendente para procesar la solicitud. Esto significa que no se realiza ningún almacenamiento en caché.

Si elimina .cssla extensión de la lista Y si rootno apunta al directorio donde se puede encontrar este archivo CSS, entonces la solicitud irá proxy_passal servidor ascendente.

Luego, la respuesta se almacenará en caché siempre que el servidor ascendente establezca encabezados de caché HTTP adecuados.

información relacionada