nginx cache查看缓存命中率

nginx提供了$upstream_cache_status这个变量来显示缓存的状态,我们可以在配置中添加一个http头来显示这一状态,达到类似squid的效果。

  • nginx location 中加入 add_header Nginx-Cache "$upstream_cache_status";
nginx cache查看缓存命中率_第1张图片
image.png

通过nginx 日志或者curl 查看

nginx cache查看缓存命中率_第2张图片
image.png
  • $upstream_cache_status包含以下几种状态:
·MISS 未命中,请求被传送到后端
·HIT 缓存命中
·EXPIRED 缓存已经过期请求被传送到后端
·UPDATING 正在更新缓存,将使用旧的应答
·STALE 后端将得到过期的应答

nginx cache命中率统计

即然nginx为我们提供了$upstream_cache_status函数,自然可以将命中状态写入到日志中。具体可以如下定义日志格式:

gth" "$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$request_time" "$upstream_response_time" "$upstream_cache_status" "$upstream_addr"
  • 命中率统计方法:用HIT的数量除以日志总量得出缓存命中率:
awk '{if($NF==""HIT"") hit++} END {printf "%.2f%",hit/NR}' access.log
  • 了解了原理以后,也可以通过crontab脚本将每天的命中率统计到一个日志中,以备查看
# crontab -l
9 0 * * * /opt/shell/nginx_cache_hit.sh  >> /usr/local/nginx/logs/hit
  • 脚本内容
#!/bin/bash
LOG_FILE='/data/logs/nginx/logs/access.log'
LAST_DAY=$(date +%F -d "-1 day")
awk '{if($NF==""HIT"") hit++} END {printf "'$LAST_DAY': %d %d %.2f%n", hit,NR,hit/NR}' $LOG_FILE

你可能感兴趣的:(nginx cache查看缓存命中率)