一、背景

目前很多项目都使用到nginx缓存技术,如何有效的清除缓存页面也成了一个问题。nginx可以使用proxy_cache_purge模块进行页面缓存清理。文档:https://github.com/FRiCKLE/ngx_cache_purge

参考官方的一个配置

map request_methodpurge_method {
    PURGE   1;
    default 0;
}

server {
    ...
    location / {
        proxy_pass http://backend;
        proxy_cache cache_zone;
        proxy_cache_key uri;
        proxy_cache_purgepurge_method;
    }
}

备注:网上几乎所有的文档都是按照以上模式去写的,这样配置后不会通过测试,而且nginx官方已经明确了该功能商用了,这个功能和开源的ngx_cache_purge包配置一样,但实际却不是一个东西。参考说明文档:http://mailman.nginx.org/pipermail/nginx/2017-June/054083.html

二、源码编译nginx

[root@xiangys0134-k8s-master tmp]# yum install gcc gcc-c++ pcre-devel openssl-devel -y
[root@xiangys0134-k8s-master tmp]# useradd www
[root@xiangys0134-k8s-master tmp]# wget https://github.com/FRiCKLE/ngx_cache_purge/archive/refs/tags/2.3.tar.gz
[root@xiangys0134-k8s-master tmp]# tar -zxvf ngx_cache_purge-2.3.tar.gz
[root@xiangys0134-k8s-master tmp]# cp -r ngx_cache_purge-2.3 /opt/

[root@xiangys0134-k8s-master tmp]# wget http://nginx.org/download/nginx-1.21.4.tar.gz
[root@xiangys0134-k8s-master tmp]# tar -zxvf nginx-1.21.4.tar.gz
[root@xiangys0134-k8s-master tmp]# cd nginx-1.21.4/
./configure \
--user=www \
--group=www \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-pcre \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-ipv6 \
--add-module=/opt/ngx_cache_purge-2.3

[root@xiangys0134-k8s-master nginx-1.21.4]# make && make install
[root@xiangys0134-k8s-master nginx-1.21.4]# ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

三、配置缓存

3.1配置缓存
[root@xiangys0134-k8s-master conf]# vi nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=40g;
    server {
        listen       80;
        server_name  localhost;
        location / {
            index  index.html index.htm;
            proxy_cache cache_one;
            expires 1d;
            proxy_cache_key hosturiis_argsargs; 
            proxy_cache_valid 200 1d;                           
            add_header X-Cache $upstream_cache_status;

            proxy_pass  http://192.168.1.29:8000;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

备注:这里expires指的是缓存至本地浏览器,目前缓存已经配置好,现在需要的是如何去清除缓存

3.2配置nginx

参考官方文档:https://github.com/FRiCKLE/ngx_cache_purge

[root@xiangys0134-k8s-master conf]# vi nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  log_format main ' http_originhttp_x_forwarded_for Hostserver_name remote_addr -remote_user [time_local] "request" '
               'statusbody_bytes_sent "http_referer" '
               '"http_user_agent" "http_x_forwarded_for" '
               'ssl_protocol ssl_cipherrequest_time upstream_response_time' 'cookie_COOKIE' 'args args';
    proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=40g;
    access_log  logs/access.log  main;

    server {
        listen       80;
        server_name  localhost;
        access_log  logs/host.access.log  main;
        location / {
            index  index.html index.htm;
            proxy_cache cache_one;
            proxy_cache_keyhosturiis_argsargs;            proxy_cache_valid 200 1d;                                      add_header X-Cacheupstream_cache_status;
            proxy_pass  http://192.168.1.29:8000;
            proxy_cache_purge  PURGE from 192.168.7.83;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
3.3修改后端页面

备注:通过django返回一个页面

3.4修改后端返回数据

备注:再次浏览器访问发现还是原先的页面,因为我缓存了,现在需要测试清除缓存

3.5命令测试
[root@xiangys0134-k8s-master conf]# curl -X PURGE -D - "http://192.168.7.250/test"

备注:这里不能写通配匹配是最大的问题

四、总结

优点:

  • 可以通过http的PURGE请求类型去清除缓存
  • 通过完整的url地址去清除缓存,可以精细化操作
  • 如果生产使用的话我能想到的就是将url地址给收集起来做统一处理,不明白为什么不写一个通配的清除规则

缺点:

  • 网上摘抄的配置计划都是安装nginx商用版本配置的,我用了开源的模块测试对应配置文件没有通过,前面已经提过
  • 项目在2014年的时候就完犊子了,这其实是一个很好的项目
  • 没法通配清除缓存,功能弱了一些,有些用户也提出过类似诉求。文档:https://github.com/FRiCKLE/ngx_cache_purge/issues
  • proxy_cache_purge PURGE from 192.168.7.83; IP:192.168.7.83目前发现不可以通过变量去定义该值,也就是说允许清除的机器ip可能要写死
  • 承接缺点4,如果默认写成127.0.0.1,那么为什么我不能通过自动化操作直接清除proxy_cache缓存目录内容呢,何必多此一举
最后修改日期: 2023年12月16日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。