Nginx缓存详细配置

Nginx的proxy_cache是有大讲究的。

用proxy_cache来指定cache的名字空间,proxy_cache_path来指定cache的属性。
proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=10g;
cache的路径是/home/cache,levels是2级目录(名字分别为一个字符和两个字符),名字是cache_one,分配的内存空间是200M,有效期是1天,最大可以存取的磁盘大小是10G,一旦满了就会被移除。

proxy_cache也可以在location里面自定义配置。
proxy_cache_valid 指定了相应的状态码的有效时间,这个指令是什么意思呢?看看wiki上的解释。Nginx会按照这下面的顺询进行cache时间的缓存。

X-Accel-Expires       #自己定义
Expires/Cache-Control #max-age字段,指定浏览器缓存时间。
proxy_cache_valid     #Nginx指定有效时间

也就说按照上面的顺序,Nginx的缓存指定有效时间是最后一个等级,拿一个静态文件比如a.html来说,假设源站指定了Cache-Control,max-age指定了一年时间,也就是说告诉浏览器需要把a.html缓存一年。那么如果请求a.html(不是刷新或者F5),浏览器自动会返回这个cache,这个http包都没有发送出去。对于Nginx的proxy_cache_valid就算指定了1分钟也是没有用的,因为Nginx按照上面的指令顺序下来缓存的时间也是1年,所以配置是无效的。

简而言之,对于源站而言,Nginx也就是一个大的浏览器,源站告诉Nginx的Expires/Cache-Control指定了max-age值,按照规则是轮不到proxy_cache_valid的。那么如果一定要根据Nginx缓存时间为准怎么办呢?那就是忽略源站的Expires/Cache-Control控制,用下面的指令:

proxy_ignore_headers Cache-Control;
proxy_hide_header Cache-Control;
proxy_ignore_headers Expires;
proxy_hide_header Expires;

这样配置的话Nginx就可以根据proxy_cache_valid来生效了。下面看一段配置demo
## 自定义缓存模板
location ~ .*\.(html|htm|png)$ {
        ## 忽略浏览器的缓存
        proxy_ignore_headers Cache-Control;
        proxy_ignore_headers Expires;

        proxy_cache cache_one;
        proxy_cache_valid 200 304 1h;

        proxy_cache_key $host$uri$is_args$args;

        expires 1h;
        proxy_set_header        Host    $host;

        add_header OpenCDN-Cache "$upstream_cache_status";

        if (!-f $request_filename) {
                proxy_pass http://ocdn_www.firefoxbug.net;
                break;
        }
}

看看上面的 expires 指令是什么作用的?expires是Nginx告诉浏览器需要缓存的时间,也就是max-age,反向代理的功能还可以把源站要求浏览器缓存的时间设置也做了。
add_header指令也是指定http response加一个OpenCDN-Cache字段,状态是$upstream_cache_status,HIT或MISS或EXPIRES等。

标签:none

评论已关闭