Nginx 配置页面缓存
Posted reghao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 配置页面缓存相关的知识,希望对你有一定的参考价值。
Web 缓存是指一个 Web 资源(html 页面、JS、图片以及数据等)存在于 Web 服务器和客户端(浏览器)之间(此处即是代理服务器)的副本。
缓存会根据客户端的请求保存响应的副本,当下一个请求到来时,若是相同的 URL,那么缓存会根据缓存机制来决定是直接使用副本响应请求,还是向源服务器再次发送请求。
比较常见的就是浏览器会缓存访问过的网页,当再次访问这个 URL 的时候,若网页没有更新,那么不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会重新下载网页。
配置页面缓存
nginx 中页面缓存的配置如下所示:
http {
...
proxy_cache_path /www/nginx/ng/cache/webservers levels=1:2 keys_zone=webservers:20m max_size=1g;
proxy_cache_key "$host$request_uri";
server {
...
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
location / {
proxy_pass http://webservers;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache webservers;
proxy_cache_valid 200 10m;
}
}
upstream webservers {
server 192.168.0.214 weight=1 max_fails=2 fail_timeout=2;
server 192.168.0.22 weight=1 max_fails=2 fail_timeout=2;
}
}
proxy_cache_path 指令(http 上下文),指定缓存的路径和参数。
levels 参数,指定多级目录结构(最多三级目录,每级目录的名字最多为 2 个字符)。1:2 表示创建两级目录,第一级目录名取 proxy_cache_key MD5 值的最后一个字符,第二级目录名取倒数 2-3 字符。如下所示:
/www/nginx/ng/cache/webservers/c/b3/887f906f2c6e20eb22bbe45294a1cb3c
keys_zone 参数,指定缓存区域的名称及缓存的大小。名称用于 proxy_cache 指令设置缓存放置的位置。
max_size 参数,指定缓存的最大值,若缓存大小超过此值,那么最少使用数据(通过 LRU 替换算法)将被删除。
proxy_cache_key 指令(http、server 或 location 上下文),设置以何种参数的 MD5 值得到缓存的文件名。
此处以主机名、请求 URI(包含参数)字符串的 MD5 值作为缓存的文件名。
默认是 $scheme$proxy_host$request_uri。
proxy_cache 指令(http、server 或 location 上下文),指定一个缓存区域或使用 off(不缓存,默认)。
当放置在 location 上下文中时,匹配此 location 的 URL 才会被缓存。
proxy_cache_valid 指令(http、server 或 location 上下文),设置 HTTP 状态码的缓存时间。
若只设置时间,那么只会为 200、301 以及 302 的响应进行缓存。
使用 any 参数则会为所有响应进行缓存。
X-Via 首部,设置代理服务器的地址。
$server_addr 表示服务器的的地址,通过一次系统调用可确定此值。
若要绕开系统调用,则需在 listen 指令中指定地址并且使用 bind 参数。
listen 127.0.0.1:8000;
X-Cache 首部,设置缓存的命中状态。
$upstream_cache_status 表示代理的缓存命中状态,其值可能为:
MISS,未命中。响应在缓存中未找到,需在服务器中获取,然后可能会被缓存。
HIT,命中。响应包含来自缓存的最新内容。
EXPIRED,缓存中的某项过期,来自原始服务器的响应将包含最新的内容。
UPDATING,内容过期,因为相对于之前的请求,响应的入口已经更新,并且 proxy_cache_use_stale 的 updating 已被设置。
STALE,内容陈旧的原因是原始服务器不能正确响应,需配置 proxy_cache_use_stale。
BYPASS,由于请求匹配了一个 proxy_cache_bypass,响应将来自原始服务器而非缓存。该响应之后可能会被缓存。
REVALIDATED,使用了 proxy_cache_revalidate 指令,Nginx 检测得知当前的缓存内容依然有效(If-Modified-Since 或 If-None-Match)。
缓存命中
设置页面缓存后,第一次请求返回的响应首部如下:
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sat, 24 Feb 2018 16:51:09 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 23
Connection: keep-alive
Last-Modified: Sat, 24 Feb 2018 06:40:12 GMT
ETag: "5a9108cc-17"
X-Via: 192.168.0.99
X-Cache: MISS
Accept-Ranges: bytes
第一次访问,通过 X-Cache 首部可看到缓存未命中。
后续请求(直到缓存失效之前)返回的响应首部如下:
HTTP/1.1 304 Not Modified
Server: nginx/1.12.2
Date: Sat, 24 Feb 2018 16:51:35 GMT
Connection: keep-alive
Last-Modified: Sat, 24 Feb 2018 06:40:12 GMT
ETag: "5a9108cc-17"
X-Via: 192.168.0.99
X-Cache: HIT
后续访问,通过 X-Cache 首部可看到缓存命中。
以上是关于Nginx 配置页面缓存的主要内容,如果未能解决你的问题,请参考以下文章
Nginx——nginx作为静态资源web服务(浏览器缓存示例演示)
Nginx设置expires设定页面缓存时间 不缓存或一直使用缓存