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

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;
    }
}

你可能感兴趣的:(nginx,cache,header,测试,服务器,Path)