Nginx代理缓存机制

2,851 阅读2分钟

是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

缓存简介

Nginx的http_proxy模块,可以实现类似于Squid的缓存功能。

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

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

  • 对于缓存,我们大概会有以下问题 :
  1. 缓存文件放哪儿 ?
  2. 如何指定哪些请求被缓存 ?
  3. 缓存的有效期是多久 ?
  4. 对于某些请求,是否可以不走缓存 ?

解决这些问题后,Nginx的缓存也就基本配置完成了。

  • 缓存文件放在哪儿 ?
  1. proxy_cache_path:Nginx 使用该参数指定缓存位置。

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

  3. proxy_cache_path:有两个必填参数, 第一个参数为缓存目录。 第二个参数keys_zone指定缓存名称和占用内存空间的大小。 

    nginx.confg 配置文件
    
    http {
    	proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
            upstream www.nicole.com{
               server 127.0.0.1:8881;
               server 127.0.0.1:8882;
               server 127.0.0.1:8883;        
            }
            server{
                listen 80 ;
                proxy_cache one ;
                server_name www.nicole.com;
            }
    }
    

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

  • 如何指定哪些请求被缓存?
  1. Nginx默认会缓存所有get和head方法的请求结果,缓存的key默认使用请求字符串。

  2. 自定义Key  例如proxy_cache_key "hosthostrequest_uri$cookie_user" ;

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

  4. 指定哪些方法的请求被缓存,例如proxy_cache_methods GET HEAD POST ;

    nginx.confg 配置文件
    
    http {
    	proxy_cache_path /data/nginx/cache keys_zone=one:10m;
           upstream www.nicole.com{
               server 127.0.0.1:8881;
               server 127.0.0.1:8882;
               server 127.0.0.1:8883;      
           }        server{
                listen 80 ;
                proxy_cache one ;
                server_name www.nicole.com;
                    location / {
                         proxy_pass         http://www.nicole.com;                     
                         proxy_set_header   Host        $host;
                         proxy_set_header   X-Real-IP   $remote_addr;
                         proxy_cache_key    $host$request_uri$cookie_user;
                    }        }
    }
    
  • 缓存有效期

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

  1. 响应状态码为200 、302 时 ,10分钟有效 ,proxy_cache_valid 200 302 10m ;

  2. 对应任何状态码,5分钟有效 ,proxy_cache_valid any 5m ; 

    nginx.confg 配置文件
    
    http {
           proxy_cache_path /data/nginx/cache keys_zone=one:10m;
           upstream www.nicole.com{
               server 127.0.0.1:8881;
               server 127.0.0.1:8882;
               server 127.0.0.1:8883;      
           }
            server{
                listen 80 ;
                proxy_cache one ;
                server_name www.nicole.com;
                    location / {
                         proxy_pass         http://www.nicole.com;
                         proxy_set_header   Host        $host;
                         proxy_set_header   X-Real-IP   $remote_addr;
                         proxy_cache_valid 200 302 10m ;
                    }
            }
    }
    
  • 对于某些请求,是否可以不走缓存 ?

proxy_cache_bypass : 该指令响应来自原始服务器而不是缓存。

例如proxy_cache_bypass cookie_nocachecookie\_nocache arg_nocache $arg_comment ;

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

nginx.confg 配置文件

http {
       proxy_cache_path /data/nginx/cache keys_zone=one:10m;
       upstream www.nicole.com{
           server 127.0.0.1:8881;
           server 127.0.0.1:8882;
           server 127.0.0.1:8883;      
       }
        server{
            listen 80 ;
            proxy_cache one ;
            server_name www.nicole.com;
                location / {
                     proxy_pass         http://www.nicole.com;
                     proxy_set_header   Host        $host;
                     proxy_set_header   X-Real-IP   $remote_addr;
                     proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment ;
                }
        }
}

缓存原理

网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据不同的重新浏览方式分为以下几种情况:

缓存配置

操作配置后,curl -I 命令验证缓存的状态  。