Nginx 教程:启用和配置从代理服务器接收的响应的缓存
如何启用和配置从代理服务器接收的响应的缓存。主要包括以下内容 -
- 缓存简介
- 启用响应缓存
- 启用缓存的 NGINX 进程
- 指定缓存要求
- 限制或绕过缓存 清除缓存内容
- 配置缓存清理
- 发送清理命令
- 访问限制清理命令
- 完全删除缓存文件
- 缓存清理配置示例
- 字节缓存
- 组合配置示例
- 1.简介
启用缓存后,NGINX 将响应存储在磁盘缓存中,并使用它们来响应客户端,而不必每次都转发对相同内容的请求。
2。启用响应缓存
要启用缓存,请将 proxy_cache_path 指令包含在
http顶级上下文中。所需的第一个参数是缓存内容的本地文件系统路径,所需的参数keys_zone指定用于存储有关缓存项目的元数据的共享内存区域的名称和大小:
Shellhttp { ... proxy_cache_path /data/nginx/cache keys_zone=one:10m; }然后将指令
proxy_cache添加到要缓存服务器响应的上下文(协议类型、虚拟服务器或位置),指定由keys_zone 参数定义的区域名称asproxy_cache_path指令(本例中为一个):
Shellhttp { ... proxy_cache_path /data/nginx/cache keys_zone=one:10m; server { proxy_cache one; location / { proxy_pass http://localhost:8000; } } }请注意,
keys_zone参数指定的大小不会限制缓存的响应数据的总量。缓存的响应本身将元数据的副本存储在文件系统上的特定文件中。要限制缓存的响应数据量,请在proxy_cache_path指令中包含参数max_size(但请注意,缓存数据量可能会暂时超出此限制,如下一节所述) .)3。缓存中包含的 NGINX 进程
缓存中还有两个额外的 NGINX 进程:
- 缓存管理器会定期激活以检查缓存的状态。如果缓存大小超过由
max_cize_path指令设置的max_size参数,缓存管理器将删除最近访问的数据。如前所述,缓存管理器激活期间缓存的数据量可能会暂时超出限制。 - 缓存加载器仅在 NGINX 启动后运行一次。将有关先前缓存的数据的元数据加载到共享存储区域。立即加载整个缓存可能会消耗足够的资源,从而在启动后的最初几分钟内减慢 NGINX 的速度。为了避免这种情况,请通过在
proxy_cache_path指令中包含以下参数来配置迭代缓存加载:loader_threshold- 重试持续时间(以毫秒为单位)(默认为200)loader_files- 一次迭代期间要加载的最大元素数(默认为100)loader_sleeps- 迭代之间的延迟(默认为50)
在以下示例中,迭代需要
300ms 或直到没有加载200项:
Shellproxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;4。指定缓存要求
默认情况下,首先是 NGINX。从代理服务器收到此类响应后,它会缓存对
HTTP GET和HEAD方法的请求的所有响应。 NGINX 使用请求字符串作为请求的密钥(标识符)。如果请求与缓存的响应具有相同的密钥,NGINX 会将缓存的响应发送给客户端。您可以在http、server或location上下文中包含各种指令来控制缓存哪些响应。要更改密钥计算中使用的请求字符,请包含指令
proxy_cache_key:
Shellproxy_cache_key "$host$request_uri$cookie_user";指定在响应之前必须发出的具有相同密钥的最小请求数缓存时间,包括 proxy_cache_min_uses 指令:
Shellproxy_cache_min_uses 5;如果您想使用 GET 和 HEAD 以外的方法来缓存请求响应,请将它们与 GET 和 HEAD 一起指定为 proxy_cache_methods 指令的参数:
Shellproxy_cache_methods GET HEAD POST;5.限制或绕过缓存 默认情况下,回复将无限期保留在缓存中。仅当缓存超过最大配置大小以及最后一个请求的长度时,才会删除它们。您可以通过在上下文
http、server或location 中包含指令来设置缓存响应被视为有效的时间长度,甚至是否要使用它们。 。? 分钟,带有代码404的答案有效期为1分钟。要指定所有状态代码的响应的有效时长,请将any指定为第一个参数:
Shellproxy_cache_valid any 5m;要定义 NGINX 不会向客户端发送缓存响应的条件,请包括
proxy_cache_bypass指令。每个参数指定一个条件并由多个变量组成。如果至少有一个参数不为空且不等于“0”(空),NGINX 不会在缓存中查找响应,而是立即将请求转发到后端服务器。
Shellproxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;要定义 NGINX 根本不缓存响应的条件,请包含 proxy_no_cache 指令,该指令以与
proxy_cache_bypass指令相同的方式定义参数。
Shellproxy_no_cache $http_pragma $http_authorization;6.清除缓存内容
NGINX 可以从缓存中删除过期的缓存文件。删除过期的缓存内容,以防止显示旧版本和新版本的网页。在收到包含自定义 HTTP 标头或 HTTP“PURGE”方法的特殊“
purge”请求后,缓存将被清除。6.1 缓存清除配置
我们设置一个配置来使用 HTTP“PURGE”方法识别请求并删除匹配的 URL。
- 在
http块级别,创建一个新变量,例如:$purge_method,它将取决于$request_method变量: 外壳在位置配置缓存,包括指定缓存清除请求条件的 proxy_cache_purge 指令。在我们的示例中,它是在上一步中配置的$purge_method:
Shellserver { listen 80; server_name www.example.com; location / { proxy_pass http://localhost:8002; proxy_cache mycache; proxy_cache_purge $purge_method; } }6.3 发送清除命令
配置
proxy_cache_purge 根据说明,您需要发送特殊的清除请求缓存以清除缓存。您可以使用各种工具发出清理请求,例如命令curl:
Shell$ curl -X PURGE -D – "http://www.example.com/*" HTTP/1.1 204 No Content Server: nginx/1.5.7 Date: Sat, 01 Dec 2015 16:33:04 GMT Connection: keep-alive在这种情况下,具有 URL 公共部分(由星号通配符指定)的资源将被删除。 。但是,这些缓存条目不会从缓存中完全删除:它们将保留在磁盘上,直到它们作为非活动状态(非活动参数
proxy_cache_path)被删除,或者被缓存清理进程或尝试访问它们的客户端删除。 。6.4 限制对清理命令的访问
建议配置有限数量的允许发送缓存清理请求的 IP 地址:
Shellgeo $purge_allowed { default 0; # deny from other 10.0.0.1 1; # allow from localhost 192.168.0.0/24 1; # allow from 10.0.0.0/24 } map $request_method $purge_method { PURGE $purge_allowed; default 0; }在这种情况下,NGINX 会检查是否“
请求中使用了 PURGE”。 ”,如果是,则解析客户端IP地址。如果该IP地址在白名单中,则$purge_method设置为$purge_allowed: "1"允许清除,"0”表示清除。 | 匹配条目。在块级别http,将参数purger添加到指令proxy_cache_path:
Shell 6.6 配置示例缓存刷新proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;
Shellhttp { ... proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on; map $request_method $purge_method { PURGE 1; default 0; } server { listen 80; server_name www.example.com; location / { proxy_pass http://localhost:8002; proxy_cache mycache; proxy_cache_purge $purge_method; } } geo $purge_allowed { default 0; 10.0.0.1 1; 192.168.0.0/24 1; } map $request_method $purge_method { PURGE $purge_allowed; default 0; } }7 字节缓存 有时,初始缓存填充操作可能需要一些时间,尤其是对于大文件。当第一个请求开始下载部分视频文件时,下一个请求将不得不等待整个文件被加载。下载并缓存。
NGINX 允许像这样缓存范围请求,并用缓存切片模块增量填充缓存。文件被分为更小的“切片”。每个范围请求选择将覆盖一个如果该范围尚未缓存,则对所请求范围的特定切片进行缓存。对这些切片的所有其他请求都将收到来自缓存的响应。
要启用字节范围缓存:
- 确保您的 NGINX 是使用切片模块进行编译的。
- 使用切片命令指定切片的大小:
Shelllocation / { slice 1m; }切片的大小应相应调整,以便快速传输切片。大小太小可能会导致内存消耗过多和打开大量文件描述符,而值太大可能会导致处理请求延迟。 - 在缓存键中包含变量
$slice_range:
Shellproxy_cache_key $uri$is_args$args$slice_range;- 启用状态代码为 206 的响应缓存:
Shellproxy_cache_valid 200 206 1h; - ,通过
范围在标头字段中传递变量$slice_range以设置代理范围请求:
Shellproxy_set_header Range $slice_range;字节范围缓存示例:
Shelllocation / { slice 1m; proxy_cache cache; proxy_cache_key $uri$is_args$args$slice_range; proxy_set_header Range $slice_range; proxy_cache_valid 200 206 1h; proxy_pass http://localhost:8000; }请注意,如果切片缓存是 (
slice) 上,不得修改初始文件。8。组合配置示例
以下配置示例组合了上述一些缓存选项。
Shellhttp { ... proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200 max_size=200m; server { listen 8080; proxy_cache one; location / { proxy_pass http://backend1; } location /some/path { proxy_pass http://backend2; proxy_cache_valid any 1m; proxy_cache_min_uses 3; proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment; } } }在这种情况下,两个位置使用相同的缓存,但方式不同。
由于服务器响应
backend1很少发生变化,因此不包括缓存控制指令。响应在第一次请求时被缓存,并无限期保持有效。相比之下,对
backend2服务的请求的响应经常变化,因此它们仅被认为在1分钟内有效,并且在发出相同请求3次之前不会被缓存。此外,如果请求满足proxy_cache_bypass指令指定的条件,NGINX 会立即将请求转发到backend2,而不查找缓存。 - 缓存管理器会定期激活以检查缓存的状态。如果缓存大小超过由
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网