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