我在为两个相同的上游设置 nginx 代理+缓存时遇到了一个奇怪的问题。我有两个相同的上游服务器,它们以主动/备份配置设置。缓存对于其中一个服务器运行正常,但是一旦我切换主动/备份配置并重新加载 nginx,我就无法获得任何缓存命中,错误日志中充满了以下内容:
2017/06/15 10:14:21 [warn] 19048#19048: *2562 an upstream response is buffered to a temporary file /mnt/cache/temp/0000000504 while reading upstream, client: <CLIENT IP>, server: , request: "GET /secure/assets/file.ts?id=456 HTTP/1.1", upstream: "http://<UPSTREAM IP>:80/assets/file.ts", host: "server-host"
现在,我无法弄清楚为什么 nginx 必须缓冲其中一个上游的响应而不是另一个上游的响应,因为上游服务器具有完全相同的文件并且位于同一个网络中。
现在,配置的相关部分:
http {
tcp_nodelay on;
proxy_cache_path /mnt/cache/cache keys_zone=one:20m inactive=24h loader_threshold=300 loader_files=200 max_size=180g;
proxy_cache_key $uri;
upstream master-cdn {
server cdn1 backup max_fails=10 fail_timeout=60s;
server cdn0 max_fails=10 fail_timeout=60s;
keepalive 10;
}
proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_403 http_404;
server {
listen 80;
if_modified_since off;
add_header Cache-Control no-cache;
add_header Pragma "no-cache";
root /var/www/html;
location /assets {
sendfile on;
tcp_nopush on;
internal;
proxy_pass http://master-cdn;
proxy_cache one;
proxy_cache_min_uses 1;
proxy_cache_lock on;
proxy_cache_valid 200 24h;
proxy_temp_path /mnt/cache/temp;
}
}
注意:客户端访问的/secure
URL 会被发送到应用程序服务器,然后应用程序服务器会使用标X-Accel-Redirect
头来告诉 nginx 从内部位置提供静态文件。
整个设置运行良好,但仅限于cdn0
上游服务器。一旦我将语句移至backup
服务器cdn0
并重新加载 nginx,我就会得到上游缓冲和缓存未命中。
有人对如何进一步调试这个问题有什么想法吗?
提前致谢。
答案1
我设法解决了这个问题。在调试日志的帮助下,我发现其中一个上游服务器错误地(内容是静态的并且不会过期)发送了带有响应的Cache-Control
标Expires
头,然后弄乱了 nginx 缓存(不幸的是,上游服务器不在我的控制范围内)。
我已将这两个语句添加到代理位置:
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;
现在,两个上游服务器上的缓存均能正常工作。