Nginx缓存常见问题

本节回答有关NGINX内容缓存的一些常见问题。

可以对NGINX Cache进行检测吗?

是的,使用add_header指令:

add_header X-Cache-Status $upstream_cache_status;

此示例在响应客户端时添加X-Cache-Status HTTP标头。以下是$ upstream_cache_status的可能值:

  • MISS - 在缓存中找不到响应,因此从原始服务器获取。然后可以缓存响应。
  • BYPASS - 响应是从原始服务器获取的,而不是从缓存中提供的,因为请求与proxy_cache_bypass指令匹配(请参阅下面的“我可以通过我的缓存打孔吗?”)然后可以缓存响应。
  • EXPIRED - 缓存中的条目已过期。响应包含来自源服务器的新内容。
  • STALE - 内容过时,因为原始服务器未正确响应,并且已配置proxy_cache_use_stale。
  • UPDATING- 内容过时,因为当前正在更新条目以响应先前的请求,并且配置了proxy_cache_use_stale更新。
  • REVALIDATED - 启用了proxy_cache_revalidate指令,NGINX验证当前缓存的内容仍然有效(If-Modified-Since或If-None-Match)。
  • HIT - 响应包含直接来自缓存的有效新鲜内容。

NGINX如何确定是否缓存某些东西?

默认情况下,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不会缓存没有过期的文件。

NGINX可以在标头中使用Set-Cookie缓存内容吗?

是的,使用proxy_ignore_headers指令,如上一个答案中所述。

NGINX可以缓存POST请求吗?

是的,使用proxy_cache_methods指令:

proxy_cache_methods GET HEAD POST;

此示例启用POST请求的缓存。

NGINX可以缓存动态内容吗?

是的,前提是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生成的密钥的默认形式类似于以下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指令(另请参阅以下问题)。

我可以使用Cookie作为我的缓存密钥的一部分吗?

是的,缓存键可以配置为任意值,例如:

proxy_cache_key $proxy_host$request_uri$cookie_jessionid;

此示例将JSESSIONID cookie的值合并到缓存键中。具有相同URI但具有不同JSESSIONID值的项目将作为唯一项目单独缓存

NGINX使用ETag标头吗?

在NGINX 1.7.3和NGINX Plus R5及更高版本中,完全支持ETag标头以及If-None-Match。

NGINX如何处理字节范围请求?

如果文件在高速缓存中是最新的,则NGINX遵循字节范围请求,并仅向项目客户端提供项目的指定字节。如果文件未缓存,或者文件过时,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是否支持缓存控制标头的陈旧重新验证和过时错误扩展?

是的,在NGINX Plus R12和NGINX 1.11.10及更高版本中。这些扩展做了什么:

  • 如果当前正在更新,则Cache-Control HTTP标头的stale-while-revalidate扩展允许使用陈旧的缓存响应。
  • Cache-Control HTTP标头的stale-if-error扩展允许在出现错误时使用陈旧的缓存响应。

这些头的优先级低于上面描述的proxy_cache_use_stale指令。

NGINX是否支持变化的标题?

是的,在NGINX Plus R5和NGINX 1.7.7及更高版本中。这里是Vary标题的一个很好的概述。

你可能感兴趣的:(Nginx)