nginx 缓存响应的时间超过 max-age

nginx 缓存响应的时间超过 max-age

我已经将 Nginx 配置为缓存始终返回的上游服务器的所有响应Cache-Control: public, max-age=1,但 nginx 似乎将响应缓存了 2 秒。为什么?

更具体地说,我的上游服务器是一个简单的 Express.js(节点)应用程序,它返回当前时间:

  app.get('/', function (req, res) {
    res.setHeader('Cache-Control', 'public, max-age=1');
    res.send((new Date()).toISOString());
  });

这是相关的 nginx 配置:

http {
  proxy_cache_path /data levels=1:2 keys_zone=zuul:10m max_size=10g;
...
  server {
      location / {
          proxy_cache zuul;
          proxy_pass http://zuul;
          proxy_cache_use_stale updating;
          proxy_cache_background_update on;
      }
      listen 0.0.0.0:80 default_server;
  }
}

然后我http://localhost循环执行 curl 并期望看到响应(包含 node.js 看到的时间戳)每秒都会更改。而不是每两秒更改一次。好像 Nginx 不愿意缓存少于两秒的响应,不尊重max-age上游返回的内容。

我怎样才能说服Nginx缓存响应

答案1

可能是proxy_cache_use_stale更新,结合proxy_cache_background_update. 文档说

proxy_cache_use_stale

确定在哪些情况下可以在与代理服务器通信期间使用陈旧的缓存响应。

如果当前正在更新,则更新参数允许使用过时的缓存响应。这允许在更新缓存数据时最大限度地减少对代理服务器的访问次数。

proxy_cache_background_update

允许启动后台子请求来更新过期的缓存项,同时将过时的缓存响应返回给客户端。请注意,在更新过时的缓存响应时,必须允许使用过时的缓存响应。

在我看来,它正在按照你的指示去做。

可能的解决方案

我怀疑你想要的是

proxy_cache_use_stale off;
proxy_cache_background_update off;

答案2

免责声明

这可能不是 OP 问题的解决方案。我在寻找标题中确切问题的答案时找到了这个主题(它在谷歌搜索结果中排名很高)。我发布这个答案是因为有人可能会像我一样在找到这个主题后发现它很有用。

回答

就我而言,我发现指令设置为

proxy_cache_valid 200 302 30m;
proxy_ignore_headers Set-Cookie X-Accel-Expires Expires Cache-Control;

nginx 不遵守max-ageCache-Control头,所有内容都被缓存了半个小时。这些指令“隐藏”在文件中,nginx.conf而不是 vhost 配置中,因此请确保您也检查了该位置。我Cache-Control从第二个指令中删除了它,现在所有内容都正确缓存了。

相关内容