您的位置:首页 > 运维架构 > 反向代理

nginx的cache_purge模块及支持squidclient刷新的配置

2011-04-25 15:48 921 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: