Code前端首页关于Code前端联系我们

Nginx 教程:启用和配置从代理服务器接收的响应的缓存

terry 2年前 (2023-09-28) 阅读数 57 #未命名

如何启用和配置从代理服务器接收的响应的缓存。主要包括以下内容 -

  • 缓存简介
  • 启用响应缓存
  • 启用缓存的 NGINX 进程
  • 指定缓存要求
  • 限制或绕过缓存 清除缓存内容
    • 配置缓存清理
    • 发送清理命令
    • 访问限制清理命令
    • 完全删除缓存文件
    • 缓存清理配置示例
  • 字节缓存
  • 组合配置示例
  • 1.简介

    启用缓存后,NGINX 将响应存储在磁盘缓存中,并使用它们来响应客户端,而不必每次都转发对相同内容的请求。

    2。启用响应缓存

    要启用缓存,请将 proxy_cache_path 指令包含在 http 顶级上下文中。所需的第一个参数是缓存内容的本地文件系统路径,所需的参数 keys_zone 指定用于存储有关缓存项目的元数据的共享内存区域的名称和大小:

    http {
        ...
        proxy_cache_path /data/nginx/cache keys_zone=one:10m;
    }
    
    Shell

    然后将指令 proxy_cache 添加到要缓存服务器响应的上下文(协议类型、虚拟服务器或位置),指定由 keys_zone 参数定义的区域名称 as proxy_cache_path 指令(本例中为一个):

    http {
        ...
        proxy_cache_path /data/nginx/cache keys_zone=one:10m;
    
        server {
            proxy_cache one;
            location / {
                proxy_pass http://localhost:8000;
            }
        }
    }
    
    Shell

    请注意,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 项:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
    
    Shell

    4。指定缓存要求

    默认情况下,首先是 NGINX。从代理服务器收到此类响应后,它会缓存对 HTTP GETHEAD 方法的请求的所有响应。 NGINX 使用请求字符串作为请求的密钥(标识符)。如果请求与缓存的响应具有相同的密钥,NGINX 会将缓存的响应发送给客户端。您可以在 httpserverlocation 上下文中包含各种指令来控制缓存哪些响应。

    要更改密钥计算中使用的请求字符,请包含指令 proxy_cache_key

    proxy_cache_key "$host$request_uri$cookie_user";
    
    Shell

    指定在响应之前必须发出的具有相同密钥的最小请求数缓存时间,包括 proxy_cache_min_uses 指令:

    proxy_cache_min_uses 5;
    
    Shell

    如果您想使用 GET 和 HEAD 以外的方法来缓存请求响应,请将它们与 GET 和 HEAD 一起指定为 proxy_cache_methods 指令的参数:

    proxy_cache_methods GET HEAD POST;
    
    Shell

    5.限制或绕过缓存​​ 默认情况下,回复将无限期保留在缓存中。仅当缓存超过最大配置大小以及最后一个请求的长度时,才会删除它们。您可以通过在上下文 httpserverlocation 中包含指令来设置缓存响应被视为有效的时间长度,甚至是否要使用它们。 。? 分钟,带有代码 404 的答案有效期为 1 分钟。要指定所有状态代码的响应的有效时长,请将 any 指定为第一个参数:
    proxy_cache_valid any 5m;
    
    Shell

    要定义 NGINX 不会向客户端发送缓存响应的条件,请包括 proxy_cache_bypass指令。每个参数指定一个条件并由多个变量组成。如果至少有一个参数不为空且不等于“0”(空),NGINX 不会在缓存中查找响应,而是立即将请求转发到后端服务器。

    proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
    
    Shell

    要定义 NGINX 根本不缓存响应的条件,请包含 proxy_no_cache 指令,该指令以与 proxy_cache_bypass 指令相同的方式定义参数。

    proxy_no_cache $http_pragma $http_authorization;
    
    Shell

    6.清除缓存内容

    NGINX 可以从缓存中删除过期的缓存文件。删除过期的缓存内容,以防止显示旧版本和新版本的网页。在收到包含自定义 HTTP 标头或 HTTP“PURGE”方法的特殊“purge”请求后,缓存将被清除。

    6.1 缓存清除配置

    我们设置一个配置来使用 HTTP“PURGE”方法识别请求并删除匹配的 URL。

    1. http 块级别,创建一个新变量,例如:$purge_method,它将取决于 $request_method 变量: 外壳位置配置缓存,包括指定缓存清除请求条件的 proxy_cache_purge 指令。在我们的示例中,它是在上一步中配置的 $purge_method
      server {
       listen      80;
       server_name www.example.com;
      
       location / {
           proxy_pass  http://localhost:8002;
           proxy_cache mycache;
      
           proxy_cache_purge $purge_method;
       }
      }
      
      Shell

      6.3 发送清除命令

    配置 proxy_cache_purge 根据说明,您需要发送特殊的清除请求缓存以清除缓存。您可以使用各种工具发出清理请求,例如命令 curl

    $ 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
    
    Shell

    在这种情况下,具有 URL 公共部分(由星号通配符指定)的资源将被删除。 。但是,这些缓存条目不会从缓存中完全删除:它们将保留在磁盘上,直到它们作为非活动状态(非活动参数proxy_cache_path)被删除,或者被缓存清理进程或尝试访问它们的客户端删除。 。

    6.4 限制对清理命令的访问

    建议配置有限数量的允许发送缓存清理请求的 IP 地址:

    geo $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;
    }
    
    Shell

    在这种情况下,NGINX 会检查是否“请求中使用了 PURGE”。 ”,如果是,则解析客户端IP地址。如果该IP地址在白名单中,则$purge_method设置为$purge_allowed: "1" 允许清除,"0”表示清除。 | 匹配条目。在块级别 http,将参数 purger 添加到指令 proxy_cache_path :

    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;
    
    Shell 6.6 配置示例缓存刷新
    http {
        ...
        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;
        }
    }
    
    Shell

    7 字节缓存​​ 有时,初始缓存填充操作可能需要一些时间,尤其是对于大文件。当第一个请求开始下载部分视频文件时,下一个请求将不得不等待整个文件被加载。下载并缓存。

    NGINX 允许像这样缓存范围请求,并用缓存切片模块增量填充缓存。文件被分为更小的“切片”。每个范围请求选择将覆盖一个如果该范围尚未缓存,则对所请求范围的特定切片进行缓存。对这些切片的所有其他请求都将收到来自缓存的响应。

    要启用字节范围缓存:

    1. 确保您的 NGINX 是使用切片模块进行编译的。
    2. 使用切片命令指定切片的大小:
      location / {
       slice  1m;
      }
      
      Shell

      切片 的大小应相应调整,以便快速传输切片。大小太小可能会导致内存消耗过多和打开大量文件描述符,而值太大可能会导致处理请求延迟。

    3. 在缓存键中包含变量$slice_range
    proxy_cache_key $uri$is_args$args$slice_range;
    
    Shell
    1. 启用状态代码为 206 的响应缓存:
      proxy_cache_valid 200 206 1h;
      
      Shell
    2. ,通过范围 在标头字段中传递变量 $slice_range 以设置代理范围请求:
    proxy_set_header  Range $slice_range;
    
    Shell

    字节范围缓存示例:

    location / {
        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;
    }
    
    Shell

    请注意,如果切片缓存是 ( slice) 上,不得修改初始文件。

    8。组合配置示例

    以下配置示例组合了上述一些缓存选项。

    http {
        ...
        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;
            }
        }
    }
    
    Shell

    在这种情况下,两个位置使用相同的缓存,但方式不同。

    由于服务器响应backend1很少发生变化,因此不包括缓存控制指令。响应在第一次请求时被缓存,并无限期保持有效。

    相比之下,对 backend2 服务的请求的响应经常变化,因此它们仅被认为在 1 分钟内有效,并且在发出相同请求 3 次之前不会被缓存。此外,如果请求满足 proxy_cache_bypass 指令指定的条件,NGINX 会立即将请求转发到 backend2,而不查找缓存。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门