本节回答有关NGINX内容缓存的一些常见问题。
是的,使用add_header指令:
add_header X-Cache-Status $upstream_cache_status;
此示例在响应客户端时添加X-Cache-Status HTTP标头。以下是$ upstream_cache_status的可能值:
默认情况下,NGINX尊重源服务器的Cache-Control标头。它不会缓存响应,缓存控制设置为Private,No-Cache或No-Store或响应头中的Set-Cookie。 NGINX仅缓存GET和HEAD客户端请求。您可以按照以下答案中的说明覆盖这些默认值。
如果proxy_buffering设置为off,NGINX不会缓存响应。它默认开启。
Cache-Control
标头吗?是的,使用proxy_ignore_headers指令。例如,使用此配置:
location /images/ {
proxy_cache my_cache;
proxy_ignore_headers Cache-Control;
proxy_cache_valid any 30m;
# ...
}
NGINX忽略/ images /下所有内容的Cache-Control标头。 proxy_cache_valid指令强制缓存数据到期,如果忽略Cache-Control标头则是必需的。 NGINX不会缓存没有过期的文件。
是的,使用proxy_ignore_headers指令,如上一个答案中所述。
是的,使用proxy_cache_methods指令:
proxy_cache_methods GET HEAD POST;
此示例启用POST请求的缓存。
是的,前提是Cache-Control标头允许它。即使在很短的时间内缓存动态内容也可以减少原始服务器和数据库的负载,从而缩短第一个字节的时间,因为不必为每个请求重新生成页面。
我可以通过我的缓存打孔吗?
是的,使用proxy_cache_bypass指令:
location / {
proxy_cache_bypass $cookie_nocache $arg_nocache;
# ...
}
该指令定义了NGINX立即从源服务器请求内容的请求类型,而不是首先尝试在缓存中找到它。这有时被称为通过缓存“打孔”。在此示例中,NGINX为具有nocache cookie或参数的请求执行此操作,例如http://www.example.com/?nocache=true。 NGINX仍然可以缓存未被绕过的未来请求的结果响应。
NGINX生成的密钥的默认形式类似于以下NGINX变量的MD5哈希:$ scheme $ proxy_host $ request_uri;使用的实际算法稍微复杂一些。
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server {
# ...
location / {
proxy_cache my_cache;
proxy_pass http://my_upstream;
}
}
对于此示例配置,http://www.example.org/my_image.jpg的缓存键计算为md5(“http:// my_upstream:80 / my_image.jpg”)。
请注意,$ proxy_host变量用于散列值而不是实际主机名(www.example.com)。 $ proxy_host定义为proxy_pass指令中指定的代理服务器的名称和端口。
要更改用作密钥基础的变量(或其他术语),请使用proxy_cache_key指令(另请参阅以下问题)。
是的,缓存键可以配置为任意值,例如:
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
此示例将JSESSIONID cookie的值合并到缓存键中。具有相同URI但具有不同JSESSIONID值的项目将作为唯一项目单独缓存
在NGINX 1.7.3和NGINX Plus R5及更高版本中,完全支持ETag标头以及If-None-Match。
如果文件在高速缓存中是最新的,则NGINX遵循字节范围请求,并仅向项目客户端提供项目的指定字节。如果文件未缓存,或者文件过时,NGINX会从源服务器下载整个文件。如果请求是针对单个字节范围的,则NGINX会在下载流中遇到该范围后立即将该范围发送到客户端。如果请求在同一文件中指定多个字节范围,则NGINX会在下载完成时将整个文件传送到客户端。
下载完成后,NGINX会将整个资源移动到缓存中,以便从缓存中立即满足所有未来的字节范围请求,无论是单个范围还是多个范围。
请注意,上游服务器必须支持NGINX的字节范围请求,以支持对该上游服务器的字节范围请求。
NGINX Plus支持选择性清除缓存文件。如果文件已在源服务器上更新但在NGINX Plus缓存中仍然有效(Cache-Control:max-age仍然有效并且inactive_cache_path指令的inactive参数设置的超时未到期),这将非常有用。 。借助NGINX Plus的缓存清除功能,可以轻松删除此文件。有关更多详细信息,请参阅从缓存中清除内容。
location /images/ {
proxy_cache my_cache;
proxy_cache_bypass $http_pragma;
# ...
}
是的,在NGINX Plus R12和NGINX 1.11.10及更高版本中。这些扩展做了什么:
这些头的优先级低于上面描述的proxy_cache_use_stale指令。
是的,在NGINX Plus R5和NGINX 1.7.7及更高版本中。这里是Vary标题的一个很好的概述。