📅  最后修改于: 2021-01-07 06:15:34             🧑  作者: Mango
缓存是指在本地存储信息以加快客户端(例如Web服务器)之间的通信。缓存可以位于客户端,服务器端或两者都位于。缓存对于处理重复请求的静态或不经常更改的数据很有用。
内容缓存位于客户端和原始服务器之间,并保存其看到的所有内容的副本。如果客户端请求缓存已存储的内容,它将直接返回内容,而无需联系原始服务器。
在Nginx Plus中,启用缓存后,Nginx Plus将响应保存在磁盘缓存中,并使用它们来响应客户端,而不必每次都代理相同内容的请求。
要启用缓存,请在顶级http {}上下文中添加proxy_cache_path指令。重要且强制性的第一个参数是高速缓存内容的本地文件系统路径,而强制键zone参数指定用于存储有关高速缓存项的元数据的共享内存区的名称和大小:
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进程:
定期激活高速缓存管理器以检查高速缓存的状态。如果高速缓存的大小超过了max_size参数对proxy_cache_path指令设置的限制,则高速缓存管理器将删除最近最少访问的数据。在两次激活高速缓存管理器之间的时间内,高速缓存的数据可能会超过限制(暂时)。
NGINX将启动后,缓存加载器仅运行一次。它将先前缓存的数据的元数据加载到共享内存区域中。在启动后的最初几分钟内,一次加载整个缓存可能会消耗足够的资源以降低NGINX性能。为避免此问题,请通过在proxy_cache_path指令中包含以下参数来配置缓存的迭代加载:
让我们来看一个例子
在此示例中,迭代持续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;