什么是网页缓存?
网页缓存是存在于网页应用服务器及客户端之间的数据副本,当用户对第一次对网页资源进行访问时,经过网页服务器处理后返回客户端同事将会缓存一份数据在缓存服务器上,当下一个用户对同样的网页资源进行访问时则直接从缓存服务器总进进行相应,而不用再次对源网页服务器进行请求。有效的降低对源网页服务器的性能消耗,以及减少了网络延迟,提供了用户访问的相应速度。
缓存工作流程
- 浏览器发起请求到Nginx,Nginx根据用户的请求查找是否有本地缓存。
- Nginx没有找到本地缓存,则将请求转发至源站网页服务器,缓存到本地并返回请求给客户端浏览器(http status code:200)。
- Nginx找到本地缓存,首先验证缓存是否过期(Cache-Control:max-age=?),如果过期,则将请求转发至源站网页服务器,缓存到本地并返回请求给客户端浏览器(http status code:200)。如果文档没有过期,即if-modified-since与缓存的last-modified匹配,则返回缓存给浏览器(http status code:304)。
如何配置页面缓存
http {
#指定缓存的时临时文件的位置
proxy_temp_path /usr/local/nginx/proxy_temp_path;
#指定缓存的存放目录,levels: 缓存hash目录层级,keys_zone缓存区名称及内存缓存空间大小,inactive: 未被使用的缓存过期时间,max_size: 最大磁盘缓存空间
proxy_cache_path /usr/local/nginx/proxy_cache_path levels=1:2 keys_zone=zone_frist:100m inactive=1d max_size=100g;
server {
listen 80;
server_name nginx.yekangming.com;
location / {
# 指定该location段缓存区名称
proxy_cache zone_frist;
# 指定不同的http状态码的缓存时间
proxy_cache_valid 200 304 7d;
proxy_cache_valid 301 302 12h;
proxy_cache_valid any 1m;
# 指定缓存的key为域名、uri、参数的hash值
proxy_cache_key $host$uri$is_args$args;
# 增加http头部关于缓存命中信息
add_header Nginx-Cache "$upstream_cache_status";
# 代理至源站网页服务器
proxy_pass http://static.yekangming.com;
}
# 清除缓存的站点设置
location ~ /purge(/.*) {
#设置只允许指定的IP或IP段才可以清除URL缓存
allow 127.0.0.1;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args ;
}
# 模拟源网页服务器
server {
listen 80;
server_name projectr.yekangming.com;
location / {
root /data/webroot/projct;
}
}
}
upstream_cache_status状态:
MISS: 未命中,请求被传送到后端
HIT: 缓存命中
EXPIRED: 缓存已经过期请求被传送到后端
UPDATING: 正在更新缓存,将使用旧的应答
STALE: 后端将得到过期的应答
缓存命中率统计
为了能够统计缓存的命中率,我们需要在日志中记录缓存命中状态
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
# 需要增多记录缓存命中状态,并在上一句后面加空格隔开参数
'$upstream_cache_status';
# 开启日志记录功能
access_log logs/access.log main;
使用shell统计命中率
awk '{if($NF=="HIT") hit++} END {printf "%.2f%\n",hit/NR*100 }' access.log
查看缓存命中情况
通过curl命令及浏览器查看缓存命中前后区别
小技巧
- 一般我们在对网页资源进行页面缓存时,可以按照不同的业务场景定义多种缓存区域及策略来更好的应用到我们的业务中带来更好的性能提升及用户体验。
- 一般proxy_temp临时缓存功能是不打开的,在高并发的业务情况下会造成性能下降。