Nginx配置反向代理缓存proxy_cache
Nginx的反向代理缓存有两个目录,一个是临时目录,一个是真实缓存目录,缓存时,会先把数据保存到临时目录,最后保存完成再移动到真实目录。
这个过程,就相当于php上传文件,先会保存到临时目录(tmp_name),再移动到真实目录(只不过php移动到真实目录是我们自己写代码,用move_uploaded_file()
函数移动过去)。此外,如果有条件,还可以把临时目录指定为内存映射成的“内存硬盘”,这样会非常快。
设置缓存目录路径
上面说的临时目录用proxy_temp_path
来指定目录路径,而真实缓存目录用proxy_cache_path
来指定目录路径,这两句一段都放在http模块
下(可以设置多个proxy_cache_path
给不同的server模块用,只要proxy_cache_path
和keys_zone
不同即可):
http{
//.....
proxy_temp_path /data/wwwcache/proxy_temp;
proxy_cache_path /data/wwwcache/nginx levels=1:2 use_temp_path=off keys_zone=STATIC:200m inactive=24h max_size=1g;
proxy_cache_path /data/wwwcache/mattermost levels=1:2 use_temp_path=off keys_zone=mattermost_cache:200m inactive=24h max_size=1g;
//.....
}
说明:临时缓存目录,不一定要设置,也就是说你可以不用临时目录,这样就会直接把缓存写入到真实缓存目录中,如果你想使用临时目录,除了要用proxy_temp_path
定义一个临时目录路径外,还需要把proxy_cache_path的use_temp_path
设置为on
,这样才会使用临时目录(一般是有内存虚拟的硬盘,速度快,才使用临时目录,否则没必要),如果你不设置use_temp_path=on
,那么它默认就是on
,除非你把它设置为off
,它才是off,但是如果你没有设置为off
也没有设置proxy_temp_path
,理论上它是要使用临时目录但是又没有指定临时目录,所以它会不使用临时缓存目录。
- 1、参数levels=1:2 指定缓存空间为二级hash目录,第一级为1个字符,第二级为2个字符,比如
/7/c2
。 - 2、use_temp_path如果为on,则内容首先被写入临时文件(proxy_temp_path指定的目录),然后重命名到proxy_cache_path指定的目录;如果设置为off,则内容直接被写入到proxy_cache_path指定的目录(如果没有内存虚拟的硬盘,建议设置为off,因为设置为on反而多了一步重命名),该特性是1.7.10提供的。proxy_temp_path和proxy_cache_path必须指定为同一磁盘分区。
- 3、参数keys_zone=STATIC:200m 用户存放key和元数据的缓存区间,命名为STATIC,最大占用内存200m。
- 4、参数inactive=24h 如果资源在24h内未被请求,从缓存区中清除。
- 5、参数max_size=1g 指定本地缓存空间的大小,如果资源过于庞大时,按照LRU算法进行清除。
使用代理缓存
在具有proxy_pass语句的location里面,添加proxy_cache相关语句即可指定在proxy_pass时使用proxy_cache_path中的缓存:
location / {
proxy_pass http://image_server;
proxy_set_header Host localhost;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#代理缓存,STATIC是缓存的keys_zone名称,是在http模块下统一设置了(即在nginx.conf文件中)
proxy_cache STATIC;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 10m;
}
说明:
- 1、proxy_cache STATIC;表示使用前面http模块里定义的名为
STATIC
的缓存,这个名字是可以随便定义的,也就是说如果你前面定义的名字是abc,那这里也是写abc。 - 2、proxy_cache_key指定缓存所使用的key的组合字符串,然后用md5进行加密。
- 3、proxy_cache_valid表示缓存http状态码为200(表示成功)的时间为10 分钟
重启nginx,随便刷新一个页面,然后查看proxy_cache_path
指定的目录是否生成了文件,如果是,那说明已经成功了。