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 host
archivo (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 server
alcance 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.css
rendimientos:
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: HIT
o X-Proxy-Cache: MISS
. Por favor ayúdenme a diagnosticar el problema.
A continuación se muestran todos mis location
bloques (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 .css
archivo 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 .css
la extensión de la lista Y si root
no apunta al directorio donde se puede encontrar este archivo CSS, entonces la solicitud irá proxy_pass
al servidor ascendente.
Luego, la respuesta se almacenará en caché siempre que el servidor ascendente establezca encabezados de caché HTTP adecuados.