NGINX.COM

NGINX Plus 最受欢迎的用例之一就是内容缓存——既可以加速本地源服务器,也可以为内容交付网络(CDN)创建边缘服务器。缓存可以极大地降低源服务器上的负载,这取决于内容的可缓存性和用户流量的特点。

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

NGINX Plus 添加了对缓存清除功能的支持,并且可以基于实时活动监控面板提供的更丰富的缓存状态可视化能力,从而扩展了 NGINX 开源版的内容缓存功能:

 

为什么使用内容缓存?

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

  • 提高网站性能 – NGINX Plus 能够以交付静态内容同样的速度交付所有类型的缓存内容,进而减少延迟、提高网站的响应能力。
  • 扩充资源 – NGINX Plus 能够卸载您的源服务器上的重复任务,释放更多资源,从而为更多用户提供服务以及运行更多的应用。
  • 更高的可用性 – NGINX Plus 能够通过在源服务器宕机时提供缓存内容(即使内容已经过时),让您的用户免受灾难性错误的影响。

NGINX Plus 和 NGINX 开源版为您的网络基础架构提供了一个一体化的解决方案 —— 将用于源内容的 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 Plus 和 NGINX 开源版也会提供过期内容,从而在源服务器的负载峰值或长时间停机状态下提供高可用性。

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

 

从缓存中清除内容

内容缓存的一个副作用是,源服务器上的内容更新不一定会立即传送到缓存,这意味着可能在一段时间内,客户端会继续获取旧内容。如果通过更新(update)操作同时更改了多个资源(例如,更改了 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 管理指南》和参考文档,了解更多详细信息。