nginx proxy_cache是一个类似squid的完整的缓存解决方案,它是0.7.44版本之后加入的功能,发展了比较长时间,想必也能稳定下来了。在没有proxy_cache之前只能用proxy_store缓存页面,因为nginx并没有为proxy_store设计任何刷新机制,所以要用的话还得加入外部设计的刷新功能,比如shell啊php等等,使用proxy_cache就会方便一些。
一、proxy_cache
proxy_cache在网上有很多的例子可以照搬,我也抄来了一段简单的配置:
proxy_cache_path /dev/shm/nginx_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=200m;
server {
location / {
proxy_pass http://192.168.0.123;
proxy_cache cache_one;
proxy_cache_valid 200 302 301 1d;
proxy_cache_key $host$uri$is_args$args;
proxy_hide_header Vary;
proxy_set_header Host $host;
proxy_set_header Accept-Encoding '';
proxy_set_header X-Forwarded-For $remote_addr;
proxy_ignore_headers Cache-Control Expires;
}
}
我是希望做一个类似透明代理的服务器,不需要在这台cache机器做太多的域名配置,上面这个配置就会把所有的域名都扔给后台192.168.0.123,省事。
注意,这台nginx需要设定proxy_set_header Accept-Encoding '';(或是后台服务器关闭gzip),这样这台机器才不会缓存被压缩的文件,造成乱码。
proxy_ignore_headers Cache-Control Expires;这段配置加上后,proxy_cache就能支持后台设定的expires。
二、cache_purge
cache_purge是一个第三方模块,使用cache_purge模块可以手工删去缓存中的一个链接,可达到实时更新的目的,在这个页面可以下载到:
http://labs.frickle.com/nginx_cache_purge/
上面这个网页中给出了配置代码,一般直接拷贝测试就可成功,安装也比较简单,--add-module=...就可以了。
location ~ /purge(/.*) {
allow 192.168.0.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
使用这个配置,敲入:
curl http://www.sudone.com/purge/index.html
就可实现刷新缓存,其实也挺方便的,但这样会有一个问题,我要刷新一个页面,比如http://www.sudone.com/index.html,就不得不在这个页面中间插入一个purge,不太方便。解决这个问题有好多种办法,比如把purge放到链接后面,变成http://www.sudone.com/index.html.purge,或者干脆的就改成squidclient的PURGE方式,和squid接轨的好处不仅仅是操作方便,而且给别人解释使用方法也不用花费口舌。
配置思路就是,用if判断$request_method是PURGE时,转到/purge/这个location里去处理:
location / {
...#上面的配置
if ( $request_method = PURGE ) {
rewrite ^(.*)$ /purge$1 last;
}
}
修改配置用squidclient测试,测试方法:
squidclient -h192.168.0.123 -p80 -mPURGE -v http://www.sudone.com/index.html
测试失败,抛出一个405 Method not allowed,思考……不得其解。
不过405的问题有办法处理,很简单,加上一个
location ~ /purge(/.*) {
...#上面的配置
error_page 405 =200 /purge$1;
}
遇到405错误后转到自身一次,问题解决,测试通过。
附一个完整的配置:
proxy_cache_path /dev/shm/nginx_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=200m;
server {
location / {
proxy_pass http://192.168.0.123;
proxy_cache cache_one;
proxy_cache_valid 200 302 301 1d;
proxy_cache_key $host$uri$is_args$args;
proxy_hide_header Vary;
proxy_set_header Host $host;
proxy_set_header Accept-Encoding '';
proxy_set_header X-Forwarded-For $remote_addr;
if ( $request_method = PURGE ) {
rewrite ^(.*)$ /purge$1 last;
}
}
location ~ /purge(/.*) {
allow 192.168.0.0/24;
deny all;
error_page 405 =200 /purge$1;
proxy_cache_purge cache_one $host$1$is_args$args;
}
}
声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。