NGINX Plus 功能:内容缓存

NGINX Plus 最受欢迎的用例之一是内容缓存,它既可为本地源服务器加速,也可为内容分发网络 (CDN) 创建边缘服务器。根据内容的可缓存性和用户流量特征,缓存可以大幅减少源服务器的负载。

NGINX Plus 可缓存从上游 HTTP 服务器检索的内容,以及 FastCGISCGIuwsgi 服务返回的响应。

NGINX Plus 扩展了 NGINX 开源版的内容缓存功能,在实时活动监控仪表板上增加了对缓存清除的支持,并提供更丰富的缓存状态可视化功能:

内容缓存-状态-R7

内容缓存的优势何在?

内容缓存可缩短网页的加载时间,减少上游服务器的负载,并在源服务器发生故障时将缓存内容用作备份,从而提高可用性:

  • 提高网站性能:NGINX Plus 以与静态内容相同的速度提供各种类型的缓存内容,从而减少延迟,提高网站响应速度。
  • 容量增加:NGINX Plus 可卸载源服务器上的重复性任务,从而腾出性能资源,为更多用户提供服务并运行更多应用。
  • 更高的可用性:NGINX Plus 可在源服务器停机时提供缓存内容(即使是内容已过时),从而使用户免受严重错误的影响。

NGINX Plus 和 NGINX 可以为 Web 基础设施提供一个综合解决方案,将用于源内容的 HTTP 服务器、用于 FastCGI 和其他协议的应用网关以及用于上游服务器的 HTTP 代理整合在一起。NGINX Plus 还有企业级应用负载均衡功能,可以整合 Web 基础设施中的前端负载均衡器

详细介绍:使用 NGINX Plus 进行内容缓存

被缓存的内容被存储在磁盘上的持久缓存中, NGINX Plus 和 NGINX 会以和原始内容相同的方式来提供这类缓存内容。

要启用内容缓存,则需在配置中包含 proxy_cache_pathproxy_cache 指令:

# Define a content cache location on disk
proxy_cache_path /tmp/cache keys_zone=mycache:10m inactive=60m;

server {
    listen 80;
    server_name localhost;
 
    location / {
        proxy_pass http://localhost:8080;
 
       # reference the cache in a location that uses proxy_pass
       proxy_cache mycache;
    }
}

默认情况下,NGINX Plus 和 NGINX 采用安全谨慎的方式进行内容缓存。它们会缓存通过 GETHEAD 请求检索的内容,而不使用 Set-Cookie 响应。缓存时间由源服务器标头(X-Accel-ExpiresCache-ControlExpires)确定。NGINX Plus 遵循 RFC 5861 中定义的 Cache-Control 扩展,即 stale-while-revalidatestale-if-error

上述每种行为都可通过一系列指令进行扩展和微调。如需了解全文,请参阅《NGINX Plus 管理指南》

检测缓存

NGINX Plus 的实时活动监控 API 可提供一系列统计数据,用于衡量内容缓存的利用率和有效性:

来自实时活动监控 API 的 JSON 数据示例

这些 JSON 数据包括该缓存行为的全部信息。

管理过期内容

默认情况下,只要缓存内容有效,NGINX Plus 和 NGINX 就会一直使用该缓存内容。有效期是可配置的,也可由源服务器设置的 Cache-Control 标头控制。超过有效期后,缓存内容将被视为过期内容,且必须通过检查缓存内容是否仍与源服务器上的内容相同来重新验证其有效性。

过期内容可能永远不会被客户端请求,因此 NGINX Plus 和 NGINX 只有在客户端请求时才会重新验证过期内容。NGINX Plus 和 NGINX 开源版会在后台执行这一操作,同时先提供过期内容,以防中断客户端请求或延迟客户端请求。当源服务器不可用时也会提供过期内容,从而在峰值负载或源服务器长时间中断时提供高可用性。

NGINX 和 NGINX Plus 提供过期内容的条件可通过指令进行配置,或通过遵循源服务器的 Cache-Control请求头、stale-while-revalidatestale-if-error 中的值进行配置。

从缓存中清除内容

内容缓存的副作用之一是,源服务器上的内容更新不一定会立即传到缓存中,这意味着客户端可能会在一段时间内获取到的都是旧内容。如果更新操作同时更改了许多资源(例如,更改了 CSS 文件和引用的图片),客户端就有可能同时获得旧版资源和新版资源,从而导致呈现不一致的问题。

利用 NGINX Plus 的缓存清除功能,您可以轻松解决这个问题。proxy_cache_purge 指令可让您立即删除 NGINX Plus 内容缓存中与配置值匹配的条目。通过使用自定义的 HTTP 请求头或方法即可轻松使用此功能。

例如,以下配置可识别使用了PURGE HTTP 方法的请求,并删除匹配的 URL:

proxy_cache_path /tmp/cache keys_zone=mycache:10m levels=1:2 inactive=60s;

map $request_method $purge_method {
    PURGE 1;
    default 0;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://localhost:8002;
        proxy_cache mycache;

        proxy_cache_purge $purge_method;
    }
}

您可以使用一系列方式发出缓存清除请求,例如下方示例中的 curl 命令:

$ curl -X PURGE -D – "http://www.example.com/*"
HTTP/1.1 204 No Content
Server: nginx/1.5.12
Date: Sat, 03 May 2014 16:33:04 GMT
Connection: keep-alive

如示例所示,只要在 URL 上添加星号 (*) 通配符,就可以清除具有公共 URL 字段的整个资源集。

更多信息

NGINX Plus 沿用了 NGINX 的所有缓存功能。如需了解详情,请参阅《NGINX Plus 管理指南》和参考文档

后续步骤