如果上游启动,则 Nginx 绕过缓存,如果关闭则使用缓存

Ana*_*oly 6 caching nginx nginx-location nginx-reverse-proxy nginx-config

如果上游启动(max-age 1)绕过缓存并在关闭时使用缓存(proxy_cache_use_stale),我创建了以下配置:

proxy_cache_path   /app/cache/ui levels=1:2 keys_zone=ui:10m max_size=1g inactive=30d;
server {
    ...
    location /app/ui/config.json {
        proxy_cache ui;
        proxy_cache_valid 1d;
        proxy_ignore_headers Expires;           
        proxy_hide_header Expires;
        proxy_hide_header Cache-Control;
        add_header Cache-Control "max-age=1, public";
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        add_header X-Cache-Status $upstream_cache_status;
        add_header X-Cache-Date $upstream_http_date;
        proxy_pass http://app/config.json;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当上游关闭并且客户端仅获得 504 Gateway Timeout 时不使用缓存。我已经阅读了以下文章:

https://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_cache_use_stale

如何配置 NginX 仅在后端关闭时才提供缓存内容(5xx 响应代码)?

https://serverfault.com/questions/752838/nginx-use-proxy-cache-if​​-backend-is-down

它不像我期望的那样工作。任何帮助表示赞赏。

Rem*_*yNL 7

让我们讨论一个有两台服务器的非常简单的设置。一个运行 apache2 服务于一个简单的 html 页面。另一个正在运行的 nginx 反向代理到第一个。

http {
[...]

  proxy_cache_path /var/lib/nginx/tmp/proxy levels=2:2 keys_zone=one:10m inactive=48h max_size=16g use_temp_path=off;

  upstream backend {
    server foo.com;
  }

  server {
  [...]
    location / {
      proxy_cache           one;
      proxy_cache_valid     200 1s;
      proxy_cache_lock      on;

      proxy_connect_timeout 1s;
      proxy_cache_use_stale error timeout updating http_502 http_503 http_504;

      proxy_pass http://backend/
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这个设置对我有用。最重要的区别是proxy_cache_valid 200 1s;这意味着只有 http 代码为 200 的响应才会被缓存,并且只有 1 秒有效。这确实意味着对某个资源的第一个请求将从后端获取并放入缓存中。对同一资源的任何进一步请求都将从缓存中提供一整秒。之后,第一个请求将再次发送到后端,依此类推。

proxy_cache_use_stale是您场景中的重要部分。它基本上说明了在哪些情况下它仍然应该为缓存版本提供服务,尽管指定的时间proxy_cache_valid已经过去。所以在这里你必须决定在哪些情况下你仍然希望从缓存中提供服务。

该指令的参数与 for 相同proxy_next_upstream

您将需要这些:

error: 如果服务器仍在运行,但没有响应,或者没有正确响应。

timeout: 连接到服务器,请求或响应超时。这也是为什么你想设置proxy_connect_timeout为低的原因。默认值为 60 秒,对于最终用户来说是很长的时间。

updating:已经有新内容的请求正在发送中。(不是真的需要,但从性能的角度来看更好。)

这些http_xxx参数对您没有多大作用,当后端服务器关闭时,您将永远不会收到任何这些代码的响应。

然而,在我的现实生活中,后端服务器也是 nginx,它代理到本地主机上的不同端口。因此,当 nginx 运行良好,但是这些后端中的任何一个都关闭了参数http_502http_503并且http_504非常有用,因为这些正是我将收到的 http 代码。

http_403http_404http_500我不希望从高速缓存服务。当文件被禁止 (403) 或不再在后端 (404) 或脚本出错 (500) 时,这是有原因的。但这是我的看法。