NGINX会忽略所有/images/下的Cache-Control头。命令强制规定缓存数据的过期时间,如果忽略Cache-Control头,则该命令是十分必要的。NGINX不会缓存没有过期时间的文件。
当在头部设置了Set-Cookie之后NGINX还能缓存内容吗?可以,使用proxy_ignore_headers命令,参见之前的解答。
NGINX能否缓存POST 请求?可以,使用命令:
proxy_cache_methods GET HEAD POST;
这个例子中可以缓存POST请求。其他附加的方法可以依次列出来的,如PUT。
NGINX 可以缓存动态内容吗?可以,提供的Cache-Control头部可以做到。缓存动态内容,甚至短时间内的内容可以减少在原始数据库和服务器中加载,可以提高第一个字节的到达时间,因为页面不需要对每个请求都生成一次。
我可以再缓存中打个洞(Punch a Hole)吗?可以,使用proxy_cache_bypass命令:
location /{
proxy_cache_bypass $cookie_nocache $arg_nocache;
...
}
这个命令定义了哪种类型的请求需要向服务器请求而不是尝试首先在缓存中查找。有些时候又被称作在内存中“打个洞”。在上面的例子中,NGINX会针对nocache cookie或者参数进行直接请求服务器,如: ?nocache=true。NGINX依然可以为将那些没有避开缓存的请求缓存响应结果。
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;
}
}
按照上面的配置, 的缓存键被计算为md5(“:80/my_image.jpg”)。
注意,变量用于哈希之后的值而不是实际的主机名()。$proxy_host被定义为中指定的代理服务器的主机名和端口号。
为了改变变量(或其他项)作为基础键,可以使用proxy_cache_key命令(下面的问题会讲到)。
可以使用Cookie作为缓存键的一部分吗?可以,缓存键可以配置为任意值,如:
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
NGINX使用Etag头部吗?在NGINX 1.7.3和NGINX Plus R5及之后的版本,配合使用If-None-Match, Etag是完全支持的。
NGINX 如何处理字节范围请求?如果缓存中的文件是最新的,NGINX会对客户端提出的字节范围请求传递指定的字节。如果文件并没有被提前缓存,或者是陈旧的,那么NGINX会从服务器上下载完整文件。如果请求了单字节范围,NGINX会尽快的将该字节发送给客户端,如果在下载的数据流中刚好有这个字节。如果请求指定了同一个文件中的多个字节范围,NGINX则会在文件下载完���时将整个文件发送给客户端。
一旦文件下载完毕,NGINX将整个数据移动到缓存中,这样一来,无论将来的字节范围请求是单字节还是多字节范围,NGINX都可以在缓存中找到指定的内容立即响应。
NGINX 支持缓存清洗吗?