nginx与浏览器之间的缓存
- 前端开发同学可能会遇到明明改好的BUG,但一到线上依然是旧版本(可能是浏览器缓存,也有可能是nginx带来的缓存)。那此时有的前端同学就会告诉可爱的经理或者测试小朋友说"朋友,咱把浏览器缓存清一下吧",但是依然可能因为nginx带来的缓存依然无法看到最新的前端版本。(咳咳:无非就是强缓存协商缓存,没有使用专业术语,见谅)
亲~不喜勿喷,就当我恬不知耻的浪费您的流量了!谢谢啦!
关于nginx缓存更新不及时的一些处理办法
- 在前端资源的URL中添加版本号或时间戳(不一定成!)。
<link rel="stylesheet" href="/css/style.css?v=1.0.0">
- 使用Nginx的cache_bypass指令来强制忽略缓存。
location / {
if ($query_string ~* "nocache") {
add_header Cache-Control "no-cache, must-revalidate";
expires off;
proxy_no_cache 1;
proxy_cache_bypass 1;
}
proxy_pass http://backend;
proxy_cache my_cache;
}
如果请求的HTTP头中包含“Cache-Control: no-cache”,则Nginx会忽略缓存并直接从后端服务器获取最新的内容
- 使用Nginx的proxy_cache_valid指令可以设置缓存的有效期,以确保及时更新缓存。
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 5m;
}
在上面的示例中,Nginx会缓存200状态码的响应,并在5分钟后过期。
- 使用Nginx的Lua模块可以更灵活地控制缓存,例如可以在Lua脚本中动态设置缓存有效期或强制刷新缓存。例如:
location / {
content_by_lua_block {
local cache = ngx.shared.cache
local key = ngx.var.uri
local res = cache:get(key)
if res then
ngx.say(res)
return
end
res = ngx.location.capture("/backend")
if res.status == ngx.HTTP_OK then
cache:set(key, res.body, 60)
ngx.say(res.body)
else
ngx.exit(res.status)
end
}
}
在上面的示例中,使用Lua脚本实现了基于内存的缓存,并设置缓存有效期为60秒。
- cache_purge模块是一个第三方模块,可以让您通过发送HTTP PURGE请求来刷新Nginx缓存。您可以在Nginx配置中使用该模块
location / {
proxy_pass http://backend;
proxy_cache my_cache;
# allow cache purging
allow all;
deny all;
proxy_cache_purge on;
}
在上面的示例中,启用了cache_purge模块,并允许所有客户端发送HTTP PURGE请求来刷新缓存。