nginx提供了$upstream_cache_status這個變量來顯示緩存的狀態,我們可以在配置中添加一個http頭來顯示這一狀態,達到類似squid的效果。
- nginx location 中加入 add_header Nginx-Cache "$upstream_cache_status";
image.png
通過nginx 日志或者curl 查看
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