设置nginx缓存
nginx代理缓存
proxy cache属于服务端缓存,主要实现 nginx 服务器对客户端数据请求的快速响应。nginx 服务器在接收到被代理服务器的响应数据之后,一方面将数据传递给客户端,另一方面根据proxy cache的配置将这些数据缓存到本地硬盘上。当客户端再次访问相同的数据时,nginx服务器直接从硬盘检索到相应的数据返回给用户,从而减少与被代理服务器交互的时间。
配置说明
直接上配置示例
user nginx;
events{
worker_connections 1024;
}
http {
#设置缓存路径和相关参数(必选)
proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=10g;
server {
listen 80;
location /cache {
proxy_pass http://192.168.1.135:8080;
#引用缓存配置(必选)
proxy_cache mycache;
#对响应状态码为200 302的响应缓存100s
proxy_cache_valid 200 302 100s;
#对响应状态码为404的响应缓存200
proxy_cache_valid 404 200s;
#请求参数带有nocache或者comment时不使用缓存
proxy_cache_bypass $arg_nocache $arg_comment;
#忽略被代理服务器设置的"Cache-Control"头信息
proxy_ignore_headers "Cache-Control";
#对GET HEAD POST方法进行缓存
proxy_cache_methods GET HEAD POST;
#当缓存过期时,当构造上游请求时,添加If-Modified-Since和If-None-Match头部,值为过期缓存中的Last-Modified值和Etag值。
proxy_cache_revalidate on;
#当被代理服务器返回403时,nginx可以使用历史缓存来响应客户端,该功能在一定程度上能能够为客户端提供不间断访问
proxy_cache_use_stale http_403;
#默认开启,开启代理缓冲区(内存)
proxy_buffering on;
#设置响应头的缓冲区设为8k
proxy_buffer_size 8k;
#设置网页内容缓冲区个数为8,单个大小为8k
proxy_buffers 8 8k;
#设置当nginx还在读取被代理服务器的数据响应的同时间一次性向客户端响应的数据的最大为16k
proxy_busy_buffers_size 16k;
#临时文件最大为1024m
proxy_max_temp_file_size 1024m;
#设置一次往临时文件的大小最大为16k
proxy_temp_file_write_size 16k;
#设置临时文件存放目录
proxy_temp_path /tmp/proxy_temp;
#设置和被代理服务器连接的超时时间为60s
proxy_connect_timeout 60;
#设置向被代理服务器发送请求的超时时间为60s
proxy_send_timeout 60;
#设置从被代理服务器读取响应的超时时间为60s
proxy_read_timeout 60;
#添加缓存状态参数,方便测试是否命中缓存
add_header Nginx-Cache $upstream_cache_status;
}
}
}
proxy_cache_path
proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=10g;
- /tmp/nginx/cache:缓存文件存放的路径。
- levels : 默认所有缓存文件都放在同一个目录下时,会影响缓存的性能,大部分场景推荐使用2级目录来存储缓存文件,1和2表示用1位和2位16进制来命名目录名称。第一级目录用1位16进制命名,如b;第二级目录用2位16进制命名,如2b。所以一级目录有16个,二级目录有1616=256个,总目录数为16256=4096个。
- key_zone : 在共享内存中设置一块存储区域来存放缓存的key字符串,这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key;
- max_size(可选) : 最大cache空间,如果不指定,会使用掉所有磁盘空间。当达到配额后,会删除最少使用的cache文件。
- inactive(可选) : 未被访问文件在缓存中保留时间,本配置中如果60秒未被访问则不论状态是否为expired,缓存控制程序会删掉文件,默认为10分钟。
然后在http,server或者location上下文中通过proxy_cache引用前面定义的proxy_cache_path:
add_header XXX $upstream_cache_status;
add_header可以添加缓存状态参数,方便测试是否命中缓存。此示例在响应客户端时添加Nginx-Cache
HTTP标头。以下是$ upstream_cache_status的可能值:
- MISS - 在缓存中找不到响应,因此从原始服务器获取。然后可以缓存响应。
- BYPASS - 响应是从原始服务器获取的,而不是从缓存中提供的,因为请求与proxy_cache_bypass指令匹配(请参阅下面的“我可以通过我的缓存打孔吗?”)然后可以缓存响应。
- EXPIRED - 缓存中的条目已过期。响应包含来自源服务器的新内容。
- STALE - 内容过时,因为原始服务器未正确响应,并且已配置proxy_cache_use_stale。
- UPDATING- 内容过时,因为当前正在更新条目以响应先前的请求,并且配置了proxy_cache_use_stale更新。
- REVALIDATED - 启用了proxy_cache_revalidate指令,NGINX验证当前缓存的内容仍然有效(If-Modified-Since或If-None-Match)。
- HIT - 响应包含直接来自缓存的有效新鲜内容。
验证缓存是否生效
通过观察返回头中Nginx-Cache的值,可以观察缓存状态,其中值为HIT代表命中缓存。
通过curl url -I 的方式也能观察返回头Nginx-Cache的值
eg:
curl http://ip:port/cache/ -I