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
它不像我期望的那样工作。任何帮助表示赞赏。
让我们讨论一个有两台服务器的非常简单的设置。一个运行 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_502,http_503并且http_504非常有用,因为这些正是我将收到的 http 代码。
的http_403,http_404而http_500我不希望从高速缓存服务。当文件被禁止 (403) 或不再在后端 (404) 或脚本出错 (500) 时,这是有原因的。但这是我的看法。
| 归档时间: |
|
| 查看次数: |
2355 次 |
| 最近记录: |