我的团队使用 nginx缓存问题是上游的应用程序发送了一些我们想要覆盖的标头在缓存的对象中。如果在缓存中搜索密钥(或密钥的一部分),则可以看到保存在缓存对象中的标头。例如
cd /var/cache/nginx/test
grep -inr part_of_key *
Binary file 6/29/7bcd0cd0aadfd536cdd7183cd8b77296 matches
然后可以做
strings 6/29/7bcd0cd0aadfd536cdd7183cd8b77296
# content with keys, cached headers and so on
nginx 配置(简化)
# part of server1
location / {
proxy_pass http://upstream;
proxy_cache zone1;
}
现在我知道了该指令proxy_hide_header
,并且我曾经尝试删除(并替换)缓存对象中的标头,但它不起作用。感觉这个过程如下:
- 上游发送响应
- nginx 读取响应
- 响应保存在缓存的文件中
- 对响应执行一些操作,比如删除标头,以将响应发送到客户端
因此,在将其保存到缓存中之前,似乎没有办法影响响应的标头。
我可以开发的一个解决方法是简单地将另一个 nginx 服务器放在中间,以便它可以更改标头,然后将其保存在缓存中server1
。
例子
# part of server1
location /
proxy_pass http://upstream-modify-headers;
proxy_set_header Host modify.headers;
proxy_cache zone1;
}
# the upstream
upstream upstream-modify-headers {
server 127.0.0.1:80;
}
#the host that modifies the headers
server {
listen *:80;
server_name modify.headers;
add_header "cache-control" "public, max-age=10, must-revalidate";
...
location / {
proxy_pass http://upstream;
proxy_hide_header cache-control; #one example header that should be modified in the cache
}
...
allow 127.0.0.1; #only locally available
}
这是可行的,但是需要额外的 nginx 主机。是否有可能在同一个 nginx 服务器中覆盖缓存对象中的标头,而不在上游添加额外的标头?
答案1
看来您正在寻找proxy_hide_header
指令。
答案2
解决方法是尝试在标头上添加日期戳。添加后,您将能够区分哪些标头来自缓存,哪些是新的(通过在访问日志中与其他时间戳进行比较)