当第一个用户(蓝)访问网站,他的请求首先会到NGINX PROXY SERVER,随后NGNIX发往后端服务器(灰),后端会将请求的响应首先发往NGINX,由其返回给用户(蓝色),如果这个响应是可以缓存的,则NGINX会保留一份响应副本,当其他用户(橙色)发起相同的request请求时,NGINX会根据request请求的内容是否存在于缓存中,来直接返回给用户,不再经过后端。
这个场景同样适用于浏览器,CDN,用于缓存静态资源。
后端服务器会通过响应包头来定义缓存特性
缓存服务器可通过设置一些参数来忽略或重写后端服务器的缓存特性,但后端服务器的缓存特性也是极其重要的。
首先看下nginx proxy cache最基本的配置:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
set $upstream http://ip:port
location / {
proxy_cache my_cache;
proxy_pass $upstream; }
}
/path/to/cache : 本地路径,缓存文件存放地址; levels : 默认所有缓存文件都放在同一个/path/to/cache下,从而影响缓存的性能,大部分场景推荐使用2级目录来存储缓存文件; key_zone : 在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key; max_size : 最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件; inactive : 未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件,默认为10分钟;“需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件”; use_temp_path : 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝; proxy_cache : 启用proxy cache,指定key_zone; 附:缓存和代理中常用的配置项 上文讲述了如何配置最基础的proxy cache,接下来,会对常用的高级配置项进行梳理。
proxy_no_cache string;
Default: —
Context: http , server , location
config example:
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;
cookie_nocache a r g n o c a c h e . . . 皆 为 变 量 , 可 以 根 据 你 访 问 的 匹 配 策 略 来 设 置 , 其 值 只 有 2 类 , 0 和 非 0 ; 访 问 匹 配 策 略 例 如 : i f ( arg_nocache...皆为变量,可以根据你访问的匹配策略来设置,其值只有2类,0和非0; 访问匹配策略例如: if ( argnocache...皆为变量,可以根据你访问的匹配策略来设置,其值只有2类,0和非0;访问匹配策略例如:if(request_uri ~ ^/(login|register|password/reset)/) { set cookie_nocache 1; } 如果在此链式配置中,只要有一个值不为0,则不会cache;例如:proxy_no_cache cookie_nocache(0) arg_nocache(1) arg_comment(0),不会被cache。` 注:一般会配合proxy_cache_bypass共同使用;
proxy_cache_bypass string;
Default: —
Context: http , server , location
config example:
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;
定义在哪些情况下不从cache读取,直接从backend获取资源;配置方式同proxy_no_cache。
proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
自定义cache key,例如: proxy_cache_key “ h o s t host hostrequest_uri $cookie_user”; 默认值为: proxy_cache_key s c h e m e scheme schemeproxy_host u r i uri uriis_args$args;
proxy_cache_methods GET| HEAD|POST…; Default: proxy_cache_methods GET HEAD; Context: http, server, location
指定客户端那些方法被缓存,默认为GET|HEAD。
proxy_cache_purge string ...;
Default: —
Context: http, server, location
config example:
proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m;
map $request_method $purge_method {
PURGE 1;
default 0;
}
server {
...
location / {
proxy_pass http://backend;
proxy_cache cache_zone;
proxy_cache_key $uri;
proxy_cache_purge $purge_method;
}
}
定义缓存清除场景,同proxy_no_cache,proxy_cache_bypass链式配置方式,只要又一个不为0,则清除对应的cache key则会被清除,并返回204 response。注意,这里是删除内存中的cache key,而不是disk上的cache文件!!!disk的cache文件是由inactive控制; 当purege request的cache key以通配符*结束时,所有匹配到通配符的cache入口的cachekey都会被删除。
proxy_cache_valid *[code...] time *;
Default: —
Context: http, server, location
设置不同相应码的缓存时间,当不指定响应码的时候,例如 proxy_cache_valid 5m; 只对响应码为200,301,302的访问请求资源设置缓存时间,此外可以个性化定制,例如: proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid 404 1m; proxy_cache_valid any 1m; 此外,还可以在相应header里设置优先级更高的缓存有效时间:
“X-Accel-Expires”,设置响应的缓存过期时间,以秒为单位;0为不缓存; 如果没有设置“X-Accel-Expires” header,则关于缓存的配置策略可能会在“Expires”或者“Cache-Control” header中; 如果header含有“Set-Cookie”,则响应不会被缓存,类似的配置可以在“proxy_ignore_header”中可见; header包含“Vary”并且设置为“*”,则请求不会被缓存,如果“Vary”有具体的值,则对应的请求会被缓存; proxy_ignore_headers field; Default: — Context: http, server, location
不缓存包含在field的响应header,可以设置的值有:“X-Accel-Redirect”, “X-Accel-Expires”, “X-Accel-Limit-Rate”,“X-Accel-Buffering”, “X-Accel-Charset”, “Expires”, “Cache-Control”, “Set-Cookie” (0.8.44), and “Vary”。 如果上述的header field没有设置为忽略,则header filed中有“X-Accel-Expires”, “Expires”, “Cache-Control”, “Set-Cookie”, and “Vary”的话,响应会被缓存。
proxy_pass_headers field;
proxy_hide_headers field;
Default: —
Context: http, server, location
参考
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有