NGINX大全 第四章 可大规模扩展的内容缓存
第四章 可大规模扩展的内容缓存
4.0 介绍
缓存通过存储将来会再次提供的请求响应来加速内容服务。内容缓存减少了对上游服务器的负载,它缓存了完整响应,而不是为同一请求再次运行计算和查询。缓存可提高性能并减少负载,这意味着您可以用更少的资源更快地提供服务。在战略位置扩展和分发缓存服务器会对用户体验产生巨大影响。为了获得最佳性能,最好将内容托管在靠近消费者的位置。您还可以将内容缓存在用户附近。这就是内容传递网络的模式或叫做CDN。使用NGINX,您可以在任何可以放置NGINX服务器的地方缓存您的内容,从而有效地创建您自己的CDN。通过NGINX缓存,您还可以在发生上游故障时被动地缓存并提供缓存响应。
4.1 缓存区域
问题
您需要缓存内容并需要定义缓存的存储位置。
解决方案
使用proxy_cache_path
指令定义共享内存缓存区域和内容的位置:
proxy_cache_path /var/nginx/cache
keys_zone=CACHE:60m
levels=1:2
inactive=3h
max_size=20g;
proxy_cache CACHE;
缓存定义示例在文件系统上的/var/nginx/cache路径为被缓存的响应创建一个目录,并创建一个名为CACHE
的共享内存空间,内存为60兆字节。此示例设置目录结构级别,定义了释放3小时内未被请求的缓存响应,并定义了20 GB的最大缓存大小。proxy_cache
指令通知特定的上下文使用缓存区。proxy_cache_path
在HTTP上下文中有效,而proxy_cache
指令在HTTP,server和location上下文中有效。
讨论
要在NGINX中配置缓存,有必须声明使用的路径和区域。使用指令proxy_cache_path
创建NGINX中的缓存区。proxy_cache_path
指定了存储缓存信息的位置和存储活动键和响应元数据的共享存储空间。此指令的可选参数提供了对如何维护和访问缓存的更多控制。levels
参数定义了文件结构如何被创建的。该值是以冒号分隔的值,用于声明子目录名称的长度,最多包含三个级别。NGINX基于缓存键来缓存,缓存键是一个散列值。然后NGINX将结果存储在提供的文件结构中,使用缓存键作为文件路径,并根据levels
的值分解目录。inactive
参数可以控制缓存项在上次使用后的托管时间有多长。缓存的大小也可以使用max_size
参数进行配置。其他参数与缓存加载过程有关,缓存加载过程将缓存键从磁盘上缓存的文件中加载到共享内存区域。
4.2 缓存哈希键
问题
您需要控制内容如何被缓存和查找的方式。
解决方案
使用proxy_cache_key
指令和变量来定义是什么决定缓存是否命中:
proxy_cache_key "$host$request_uri $cookie_user";
此缓存哈希键将指示NGINX根据请求的主机,URI以及定义用户的cookie来缓存页面。通过此功能,您可以缓存动态页面,而无需提供为另一个用户生成的内容。
讨论
适用于大多数用例的默认的proxy_cache_key
是"$scheme$proxy_host$request_uri"
。使用的变量包括scheme,HTTP或HTTPS,发送请求的proxy_host
和request URI。总之,这反映了NGINX代理请求的URL。您可能会发现还有许多其他因素可以定义每个应用程序的唯一请求,例如请求参数,headers,session标识符等,您可以在其中创建自己的哈希键。
选择一个好的哈希键非常重要,应该通过理解应用程序来考虑。为静态内容选择缓存键通常非常简单; 使用主机名和URI就足够了。为相当动态的内容(像仪表板应用程序的页面)选择缓存键需要更多地了解用户如何与应用程序交互以及用户体验之间的差异程度。出于安全考虑,您可能不希望在没完全理解上下文的情况下,将缓存数据从一个用户那里展现给另一个用户。proxy_cache_key
指令配置了要作为缓存键进行哈希处理的字符串。可以在HTTP,server和location块的上下文中设置proxy_cache_key
,从而灵活地控制请求被缓存的方式。
4.3 缓存绕过
问题
您需要能够绕过缓存。
解决方案
使用非空或非零值的proxy_cache_bypass
指令。 一种方法是在您不希望缓存的location块中设置一个变量等于1:
proxy_cache_bypass $http_cache_bypass;
如果名为cache_bypass
的HTTP请求header设置为任何非0值,则配置会告知NGINX绕过缓存。
讨论
有许多场景要求不缓存请求。为此,NGINX公开了一个proxy_cache_bypass
指令,这样当值为非空或非零时,请求将被发送到upstream服务器而不是从缓存中提取。绕过缓存的不同需求和场景将由您的应用程序用例决定。绕过缓存的技术可以很简单,比如使用请求或响应header,也可以很复杂,比如多个map块一起工作。
出于多种原因,您可能希望绕过缓存。一个重要原因是故障排除和调试。如果您一直在拉缓存页面,或者缓存键具体到了某个用户标识符,则重现问题可能很难。能够绕过缓存是至关重要的。可选方法包括但不限于设置特定的cookie,header或请求参数来绕过缓存。您还可以通过设置proxy_cache
为off来完全关闭给定上下文(例如location块)的缓存。
4.4 缓存性能
问题
您需要通过在客户端缓存来提高性能。
解决方案
使用客户端缓存控制headers:
location ~* \.(css|js)$ {
expires 1y;
add_header Cache-Control "public";
}
此location块指定客户端可以缓存CSS和JavaScript文件的内容。expires
指令指示客户端其缓存资源将在1年后不再有效。add_header
指令将HTTP响应header Cache-Control
添加到响应中,其值为public,允许一路上的任何缓存服务器缓存资源。如果我们指定private,则只有客户端被允许缓存该值。
讨论
缓存性能有很多因素,其中磁盘速度很重要。您可以使用NGINX配置中的许多内容来协助缓存性能。一种方式是设置响应headers,这样子客户端实际商缓存了响应且根本不向NGINX发出请求,而只是从自己的缓存中提供响应。
4.5 清洗
只能在NGINX Plus中使用。下略。
4.6 缓存切片
问题
您需要通过将文件切分为片段来提高缓存效率。
解决方案
使用NGINX slice
指令及其内置变量将缓存结果切分成片段:
proxy_cache_path /tmp/mycache keys_zone=mycache:10m;
server {
...
proxy_cache mycache;
slice 1m;
proxy_cache_key $host$uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_http_version 1.1;
proxy_cache_valid 200 206 1h;
location / {
proxy_pass http://origin:80;
}
}
讨论
此配置定义缓存区域并为server块启用它。然后使用slice
指令指示NGINX将响应切片为1 MB的文件段。缓存文件根据proxy_cache_key
指令被存储。注意名为slice_range
的内置变量的用法。在向http://origin发出请求时,该变量被用作header,并且该请求HTTP版本升级到HTTP/1.1,因为1.0不支持字节范围请求。缓存有效性被设置为一小时,响应代码是200或206,然后定义了location块和http://origin。
缓存切片模块是为传输HTML5视频而开发的,它使用byte-range请求伪流内容到浏览器。默认情况下,NGINX能够从其缓存提供byte-range请求。如果对未缓存的内容请求byte-range,NGINX将从源请求整个文件。使用缓存切片模块时,NGINX仅从源请求必要的分段。大于切片大小(包括整个文件)的范围请求,会触发每个所需分段的子请求,然后这些分段会被缓存。当所有分段被缓存时,响应被组合到一起并发送到客户端,这使NGINX能够更有效地缓存并提供范围中被请求的内容。缓存切片模块应仅用于不会改动的大型文件。每次从源接收分段时,NGINX都会验证ETag。如果源上的ETag发生变化,NGINX将中止该事务,因为缓存不再有效。
猜你喜欢
NGINX大全 第十五章 性能调优
阅读 3358本章还介绍了连接调优,以保持连接对客户端和上游服务器的开放性,并通过调整操作系统来提供更多连接。
NGINX大全 第二章 高性能负载平衡
阅读 2071我们需要一个与基础架构一样动态的负载平衡解决方案。 NGINX以多种方式满足了这一需求,例如HTTP,TCP和UDP负载平衡,我们将在本章中介绍。
NGINX大全 第九章 复杂的媒体流
阅读 1826本章介绍使用MPEG-4或Flash视频格式的NGINX的流媒体。NGINX被广泛用于向大众分发和传输内容。NGINX支持行业标准格式和流技术,本章将对其进行介绍。
NGINX大全 第十三章 高级活动监控
阅读 2207本章详细介绍了NGINX Plus仪表板,NGINX Plus API和开源存根状态模块的功能。
NGINX大全 第十二章 高可用性部署模式
阅读 2142本章详细介绍了如何运行多个NGINX服务器以确保负载均衡层中的高可用性的技术。
NGINX大全 第六章 验证
阅读 2119NGINX能够验证客户端。通过NGINX验证客户端请求降低了工作量,并可以阻止未经身份验证的请求到达应用程序服务器。
NGINX大全 第十四章 使用访问日志,错误日志和请求跟踪进行调试和故障排除
阅读 4439在本章中,我们将讨论访问和错误日志,通过Syslog协议进行流传输以及使用NGINX生成的请求标识符来端到端地跟踪请求。
NGINX大全 第十六章 实用操作提示和结论
阅读 3389在本章中,我将介绍如何确保配置文件简洁明了以及调试配置文件。