Nginx 内容缓存

缓存是指在本地存储信息以加速客户端(例如 Web 服务器)之间的通信。缓存可以位于客户端、服务器端或两者。缓存对于处理静态或不经常更改的数据的重复请求很有用。

内容缓存驻留在客户端和源服务器之间,并保存它看到的所有内容的副本。如果客户端请求缓存已存储的内容,它会直接返回内容,而无需联系源服务器。

在 Nginx Plus 中,当启用缓存时,Nginx Plus 将响应保存在磁盘缓存中并使用它们来响应客户端,而不必每次都代理对相同内容的请求。

启用响应缓存

要启用缓存,请在顶级 http { } 上下文。重要且强制的第一个参数是缓存内容的本地文件系统路径,强制键区域参数指定用于存储有关缓存项的元数据的共享内存区域的名称和大小:

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

然后在我们想要缓存服务器响应的上下文(协议类型、虚拟服务器或位置)中添加 proxy_cache 指令,指定由 key_zone 参数定义的区域名称到 proxy_cache_path 指令。

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

参与缓存的 Nginx 进程

缓存管理器会定期激活以检查缓存的状态。如果缓存的大小超过了proxy_cache_path 指令的max_size 参数设置的限制,缓存管理器将删除最近最少访问的数据。在缓存管理器激活之间的时间内,缓存数据可能会超出限制(暂时)。

缓存加载器仅在 Nginx 启动后运行一次。它将先前缓存数据的元数据加载到共享内存区域。在启动后的最初几分钟内,一次加载整个缓存可能会消耗足够的资源来降低 Nginx 的性能。为避免此问题,请通过在 proxy_cache_path 指令中包含以下参数来配置缓存的迭代加载:

  • loader_threshold- 迭代持续时间,以毫秒为单位(默认值为 200)。
  • loader_files- 最大数量。一次迭代中加载的项目数(默认值为 100)。
  • loader_sleeps- 迭代之间的延迟,以毫秒为单位(默认值为 50)。

让我们看一个例子,

在这个例子中,迭代持续 300 毫秒或直到 200 个项目被加载:

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

指定要缓存的请求

Nginx Plus 默认缓存所有响应以 HTTP HEAD 和 HTTP GET 方法发出的请求,第一次从代理收到此类响应服务器。作为请求的键,Nginx Plus 使用请求字符串。如果请求与缓存响应具有相同的键或标识符,Nginx Plus 将缓存响应发送到客户端。我们可以在 http {}、server {} 或 location {} 上下文中添加各种指令来控制缓存哪些响应。

要更改用于计算标识符或键的请求特征,请包含 proxy_cache_key指令:

proxy_cache_key "$host$request_uri$cookie_user";

要定义在缓存响应之前必须发出具有相同标识符的请求的最小次数,请包含 proxy_cache_min_uses 指令:

proxy_cache_min_uses 5;

要使用 HEAD 和 GET 以外的方法缓存对请求的响应,请将它们与 HEAD 和 GET 一起作为 proxy_cache_methods 指令的参数列出:

proxy_cache_methods GET HEAD POST;

限制或禁用缓存

默认情况下,响应会无限期地保留在缓存中。仅当缓存超过最大配置大小时才会删除它们,然后按自上次请求以来的时间长度排序。您可以通过在 http {}、server {} 或 location {} 上下文中包含指令来设置缓存响应被视为有效的时长,甚至是否完全使用它们:

限制多长时间具有特定状态代码的缓存响应被认为是有效的,请使用 proxy_cache_valid 指令:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

在此示例中,代码为 200 或 302 的响应被认为在 10 分钟内有效,代码为 404 的响应在 1 分钟内有效。要为具有所有状态代码的响应定义有效时间,请将 any 指定为第一个参数:

proxy_cache_valid any 5m;

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

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

要定义 Nginx Plus 根本不缓存响应的条件,请添加 proxy_no_cache 指令:

proxy_no_cache $http_pragma $http_authorization;

下一章:Nginx 负载均衡

为了确保适当的速度和优化的功能,传入的网络流量分布在一组服务中。这些后端服务通常称为服务器池或服务器群。随着服务器之间的分布越多,由于服务器负载而导致速度减慢的可能性就越小。高流量网站每天为数千甚至数百万人提供服务。该 ...