Ich versuche, Nginx als Web-Cache zu verwenden (was mir nicht gelingt).
Mein System ist ein Ubuntu 16.04-Server, bei dem Nginx ein Reverse-Proxy für einen Gunicorn-Webserver ist (es ist eine Django-Anwendung).
Um das Web-Caching zu konfigurieren, habe ich oben in meiner virtual host
Datei (in sites-available
) die folgenden Zeilen hinzugefügt:
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;
Als nächstes habe ich im Hauptbereich server
den folgenden Codeausschnitt (wo ich die Caching-Direktiven eingefügt habe):
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;
}
Dies führt nicht zu Cache-Treffern oder -Fehlschlägen, wenn ich versuche, statische Asset-URIs zu curlen (was die einzige Möglichkeit ist, zu testen, ob der Cache funktioniert oder nicht). Ergo ist das Caching nicht betriebsbereit. Das meine ich damit:
Der Versuch curl -X GET -I https://example.com/static/css/my_app.css
ergibt:
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
X-Proxy-Cache: HIT
Dies ist problematisch, da es oder enthalten sollte X-Proxy-Cache: MISS
. Bitte helfen Sie mir bei der Diagnose des Problems.
Nachfolgend sind alle meine location
Blöcke aufgeführt (in der Reihenfolge ihres Auftretens):
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;
}
Antwort1
Ihre .css
Datei wird mithilfe des folgenden Blocks in Ihrer Konfiguration bereitgestellt:
location ~* \.(?:ico|css|js|gif|jpg|jpeg|png|svg|woff|ttf|eot)$
root /home/ubuntu/app/myproj/;
access_log off;
error_log off;
}
Das bedeutet, dass nginx die Datei direkt sendet, ohne den Upstream-Server zur Verarbeitung der Anfrage zu verwenden. Das bedeutet, dass kein Caching durchgeführt wird.
.css
Wenn Sie die Erweiterung aus der Liste entfernen UND wenn Ihre nicht auf das Verzeichnis verweist, in dem diese CSS-Datei zu finden ist, wird die Anfrage an den Upstream-Server root
weitergeleitet .proxy_pass
Anschließend wird die Antwort zwischengespeichert, sofern der Upstream-Server geeignete HTTP-Cache-Header setzt.