【发布时间】:2016-10-14 21:16:30
【问题描述】:
我已经配置了 Nginx 缓存,主要使用 Nginx's own documentation。当我调用应该使用 curl 缓存的 URL 时,它的工作方式与预期完全一样:MISS 在第一个请求上,HIT 在所有后续请求上。但是,当我在任何主流浏览器中调用同一个 URL 时,我每次都会得到一个 MISS - 即使同一个 URL 刚刚被 curl 调用并被缓存了。
这是我的 Nginx 配置:
proxy_cache_path /tmp/nginx levels=1:2 keys_zone=lb_cache:10m inactive=60m use_temp_path=off;
proxy_cache_key "$request_method$host$request_uri";
proxy_cache_lock on;
proxy_cache_use_stale updating;
server {
location / {
proxy_cache lb_cache;
proxy_ignore_headers Expires;
proxy_hide_header Expires;
proxy_cache_valid 200 60m;
proxy_cache_revalidate on;
proxy_no_cache $no_cache;
proxy_cache_bypass $http_cache_control $http_pragma $cookie_nocache $arg_nocache;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://webservers;
if ($request_uri ~* "/(admin/)") {
set $no_cache true;
}
if ($http_cookie ~* "SESS") {
set $no_cache true;
}
}
}
如何确保我的缓存始终被使用,在发出导致我的缓存丢失的请求时,与 curl 不同的浏览器有何不同?
【问题讨论】:
-
原因很可能是
proxy_cache_bypass指令。检查来自浏览器的请求标头是否有“Cache-Control”或“Pragma”。如果其中任何一个存在,Nginx 将忽略缓存而不考虑标头值。我的赌注是“缓存控制”。 -
我不认为这是问题所在,因为当我通过其中一个标头时,我看到缓存状态记录为
BYPASS。当我只是正常请求页面时,我得到MISS,即使curl显示同一 URL 的HIT状态。