Nginx代理缓存机制

是我参与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指定缓存名称和占用内存空间的大小。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ini复制代码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 “hosthosthostrequest_uri$cookie_user” ;
  3. 指定请求至少被发送了多少次以上时才缓存,可以防止低频请求被缓存。例如proxy_cache_min_uses 5 ;
  4. 指定哪些方法的请求被缓存,例如proxy_cache_methods GET HEAD POST ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ini复制代码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 ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ini复制代码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 cookie_nocachearg_nocache $arg_comment ;

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ini复制代码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 命令验证缓存的状态 。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%