nginx caching:仅当无法访问上游服务器时,才返回缓存页面(当指定缓存控制头时)

nginx caching:仅当无法访问上游服务器时,才返回缓存页面(当指定缓存控制头时),nginx,caching,Nginx,Caching,我正在尝试为上游服务器(我不管理)设置缓存。大多数文件都可以缓存(并且没有缓存控制设置),这些文件工作正常 但是,服务器上的某些位置是目录列表(并且具有缓存控制:无存储)。我只想在无法访问服务器时缓存这些内容。 不幸的是,我的结局可能是: 在这些列表未缓存的情况下(缓存中没有文件,标头始终显示缓存未命中)。如果无法访问服务器,则(显然)不会返回目录列表 在缓存了这些列表,但之后它们永远不会更新的情况下(至少只要缓存有效就不会更新)。由于我想长期缓存所有其他条目,目录列表很快就会过时 我试图将

我正在尝试为上游服务器(我不管理)设置缓存。大多数文件都可以缓存(并且没有
缓存控制设置),这些文件工作正常

但是,服务器上的某些位置是目录列表(并且具有
缓存控制:无存储
)。我只想在无法访问服务器时缓存这些内容。
不幸的是,我的结局可能是:

  • 在这些列表未缓存的情况下(缓存中没有文件,标头始终显示缓存未命中)。如果无法访问服务器,则(显然)不会返回目录列表
  • 在缓存了这些列表,但之后它们永远不会更新的情况下(至少只要缓存有效就不会更新)。由于我想长期缓存所有其他条目,目录列表很快就会过时
我试图将标题修改为
stale if error
,但这似乎也没有帮助

map $http_cache_control $http_updated_cache_control {
  no-store stale-if-error;
}

server {
...
  location /somewhere {
      sendfile on;
      sendfile_max_chunk 10m;
      tcp_nopush on;
      proxy_cache keyzone;

      # allow using stale requests in case of errors or when updating a file
      proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
      proxy_cache_revalidate on;
      proxy_cache_background_update on;

      # add header to indicate if caching works
      add_header X-Cache-Status $upstream_cache_status;

      proxy_cache_lock on;
      proxy_read_timeout  900;
      proxy_pass_header   Server;
      proxy_ignore_headers Set-Cookie;

      # allow caching of non-cacheable entries only when the server is erroring
      proxy_hide_header Cache-Control;
      add_header Cache-Control $http_updated_cache_control;

      # don't ignore the cache control header: some items (like directory listings) are marked as "don't cache")
      #proxy_ignore_headers Cache-Control;
  }
}

如何使用
缓存控制来缓存条目:无存储
,但仅在上游服务器关闭时使用缓存条目?

我看到两种可能性:

  • NGINX尊重来自上游服务器的头。因此,如果上游发送
    Expires
    ,而不考虑
    缓存控制:no store
    ,那么在您修改NGINX的头之后,它们将变成
    Expires:。。。缓存控制:如果出现错误
    并等待,则会过时 至少只要缓存有效

  • proxy\u cache\u valid
    可能具有相同的效果
  • 所以你需要

  • 位置/某处的
    代理缓存设置一些小值
  • 或/并删除
    过期
    (如果存在)
  • 或/并将
    max age=0
    添加到
    Cache Control

  • 添加上游服务器和代理的响应头。您所说的“(至少只要缓存是有效的,就不需要)”是什么意思?如何为
    缓存控制:no store
    content定义缓存的有效性?我的意思是:如果我将proxy\u cache\u valid设置为一个大值(理想情况下是几天),那么我想要缓存的东西会被缓存很长时间。不幸的是,这意味着我只想在出错时缓存的项目也会被缓存(并使用)10天。如果我把它设为一个很短的值,那么我要缓存的项目也不会缓存很长。谢谢!我已经为代理缓存配置了一个小值(10秒),该值现在有效。由于我在“更新”时设置了proxy\u cache\u use\u stale以返回,这意味着我至少会收到一次过期响应(例如,如果我执行一个请求,等待一个小时并执行一秒钟,则第二个响应将非常旧)。然而,如果我省略了“更新”,这意味着它将重新验证,所以我也做了那个小改动。现在它的行为应该如此!谢谢!:-)