【问题标题】:Nginx proxy cache working for curl, but not browsersNginx 代理缓存适用于 curl,但不适用于浏览器
【发布时间】: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 状态。

标签: caching curl nginx


【解决方案1】:

curl 和浏览器之间的主要区别在于浏览器记住/缓存资源 - 因此可能是 cookie 负责(可能是 if ($http_cookie ~* "SESS") { set $no_cache true; } 部分),或者浏览器在请求中使用的标头会更改缓存使用情况。

在这种情况下,我会比较 curl 和浏览器发出的确切请求 - 例如使用 Firebug。这样你就可以知道浏览器发送了哪些 curl 没有发送的内容。

【讨论】:

    【解决方案2】:

    问题出在网站发送的 Vary 标头上。它正在运行 Drupal 7,它显然被配置为传递 Vary 标头以进行自己的缓存破坏。在 Nginx 中忽略该标头解决了该问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2016-04-12
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多