美文网首页
Nginx缓存及使用ngx_cache_purge进行缓存清除

Nginx缓存及使用ngx_cache_purge进行缓存清除

作者: 右耳菌 | 来源:发表于2022-08-16 17:57 被阅读0次

    1. Nginx 缓存

    Nginx 从 0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持404/301/302这样的非200状态码。

    Nginx的Web缓存服务主要由proxy_cache 相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。

    在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为“负载均衡”与“Web缓存”服务器来使用。

    Nginx对客户已经访问过的内容在Nginx服务器本地建立副本,这样在一段时间内再次访问该数据,就不需要通过Nginx服务器再次向后端服务器发出请求,所以能够减少Nginx服务器与后端服务器之间的网络流量,减轻网络拥塞,同时还能减小数据传输延迟,提高用户访问速度。

    同时,当后端服务器宕机时,Nginx服务器上的副本资源还能够回应相关的用户请求,这样能够提高后端服务器的可用性。

    缓存问题:

    (1) 缓存文件放在哪儿?

    • proxy_cache_path: Nginx使用该参数指定缓存位置。

    • proxy_cache: 该参数为之前指定的缓存名称。

    • proxy_cache_path: 有两个必填参数,

      • 第一个参数为缓存目录。
      • 第二个参数keys_zone指定缓存名称和占用内存空间的大小。
    • 示例

    user www-data;
    worker_processes auto; #表示服务器有几个内核就起几个work
    pid /run/nginx.pid;  #进程编号
    
    http {
    
      proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
      
      upstream test.lazyfennec.cn {
        server 127.0.0.1:8881; # 第一台服务器
        server 127.0.0.1:8882; # 第二台服务器
      }
    
      server {
        listen 80; # 监听80端口
        proxy_cache one; # 指定缓存配置
        server_name test.lazyfennec.cn; # 自己的域名或者IP
    
        location / {
          proxy_pass    http://test.lazyfennec.cn;
          proxy_set_header Host  $host;
          proxy_set_header X-Real-IP $remote_addr;
        }
      }
    }
    

    注:示例中的10m是对内存中缓存内容元数据信息大小的限制,如果想限制缓存总量大小,需要用max_size参数。

    (2) 如何指定哪些请求被缓存?

    1. Nginx默认会缓存所有get和head方法的请求结
      果,缓存的key默认使用请求字符串。

    2. 自定义key
      例如

    proxy_cache_key "$host$request_uri$cookie_user";
    

    3.指定请求至少被发送了多少次以上时才缓存,可以防止低频请求被缓存。
    例如

    proxy_cache_min_uses 5;
    

    4.指定哪些方法的请求被缓存
    例如

    proxy_cache_methods GET HEAD POST;
    

    (3) 缓存的有效期是多久?

    默认情况下,缓存内容是长期存留的,除非缓存的总量超出限制。可以指定缓存有效时间,例如:

    • 响应状态码为200302时,10分钟有效
    proxy_cache_valid 200 302 10m;
    
    • 对应任何状态码,5分钟有效
    proxy_cache_valid any 5m;
    

    (4) 对于某些请求,是否可以不走缓存?
    proxy_cache_bypass: 该指令响应来自原始服务器而不是缓存。
    例如

    proxy_cache_bypass $cookie_nocache $arg_nocache$airg_comment;
    

    如果任何一个参数值不为空,或者不等于0,nginx就不会查找缓存,直接进行代理转发。


    2. Nginx清除缓存

    虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。

    Nginx添加第三方缓存清除模块

    (1) 编译安装Nginx并且添加ngx_cache_purge模块

    关于编译安装Nginx,也可以查看【Linux编译安装Nginx】

    • 获取nginx,在/etc/software_pkg/下执行,具体是在那个目录,可以自行决定。
    wget http://nginx.org/download/nginx-1.21.0.tar.gz
    tar -zxvf nginx-1.12.2.tar.gz
    
    • 获取ngx_cache_purge,在/etc/software_pkg/下执行,具体是在那个目录,可以自行决定,这里建议与下载的nginx目录一致:
    wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
    tar -zxvf 2.3.tar.gz
    
    • 修改配置

    下载并且解压后,进入到解压目录,假设解压的目录为 /ect/softwares_pks/nginx-1.21.0

    cd /etc/software_pks/nginx-1.21.0
    

    配置相关的内容:

    ./configure --prefix=/etc/softwares/nginx  \
    --with-http_stub_status_module  \
    --with-http_ssl_module --with-stream  \
    --with-http_gzip_static_module  \
    --with-http_sub_module \
    --with-pcre  \
    --add-module=../ngx_cache_purge-2.3
    

    --add-module=../ngx_cache_purge-2.3 这是新增的,如果要查看以前的configure参数,可以使用以下命令查看,然后复制后再后边加入需要添加的配置即可。

    /etc/softwares/nginx/sbin/nginx -V
    

    如果是第一次安装nginx,则直接执行

    make && make install
    

    如果以前安装过,则先备份之前的内容(假设安装的目录为/ect/softwares/nginx/)

    • 停止nginx
    /etc/softwares/nginx/sbin/nginx -s stop
    
    • 备份nginx
    cp /etc/softwares/nginx/sbin/nginx /etc/softwares/nginx/sbin/nginx.bak20220817
    
    • 重新编译,在/etc/software_pks/nginx-1.21.0下执行
    make
    
    • 将编译好的nginx文件覆盖到/etc/softwares/nginx/sbin/nginx
    cp objs/nginx /etc/softwares/nginx/sbin/nginx
    

    (2) 修改Nginx配置

    cd /etc/softwares/nginx/conf/
    vim nginx.conf
    
    • 例子
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        charset  utf-8;
    
        #注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
        proxy_temp_path   /data0/proxy_temp_dir;
        #设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为10GB。levels=1:2 表示缓存目录的第一级目录是1个字符,第二级目录是2个字符,即/app/proxy_cache_dir/cache1/a/1b这种形式
        proxy_cache_path  /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=10g;
        
        server {
            listen       80;
            server_name  study.163.com;
            location / {
                root   html;
                index  index.html index.htm;
            }
            
            #用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存!
            location ~ /purge(/.*) {
                #设置只允许指定的IP或IP段才可以清除URL缓存。
                allow   127.0.0.1;
                allow   192.168.1.0/16;
                deny        all;
                proxy_cache_purge cache_one $host$1$is_args$args;
            }
    
            #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
            location ~ .*\.(php|jsp|cgi)?$ {
                proxy_set_header Host  $host;
                proxy_set_header X-Forwarded-For  $remote_addr;
                proxy_pass http://web_pools;
            }
        
            location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
                #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
                proxy_next_upstream http_502 http_504 error timeout invalid_header;
                proxy_cache cache_one;
                #对不同的HTTP状态码设置不同的缓存时间
                proxy_cache_valid 200 304 12h;
                #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
                proxy_cache_key $host$uri$is_args$args; 
                proxy_set_header Host  $host;
                proxy_set_header X-Forwarded-For  $remote_addr;
                proxy_pass http://127.0.0.1:8080;
                #缓存时间           
                expires 7d; 
            }
        }
    }
    

    如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~

    相关文章

      网友评论

          本文标题:Nginx缓存及使用ngx_cache_purge进行缓存清除

          本文链接:https://www.haomeiwen.com/subject/mbtjgrtx.html