2013-12-25 15:10:01
来 源
IT技术网
Nginx
本文介绍Nginx的cache_purge模块及支持squidclient刷新的配置,希望对于初学Nginx服务器相关的朋友有帮助,更多Nginx安装、配置、报错处理等资源请本站内搜索。。

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;

}

}

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。