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请求来改写缓存。