Nginx日志是优化缓存策略的重要数据来源,通过分析日志可以精准调整配置,提升缓存命中率并降低服务器负载。以下是具体方法和步骤:
$request_method
+ $uri
过滤GET
/HEAD
请求(通常可缓存),排除POST
/PUT
等动态请求。
awk '$6 ~ /GET|HEAD/ {print $7}' access.log | sort | uniq -c | sort -nr
$status
关注200
(成功)和304
(未修改)响应,优先缓存这些资源。
$upstream_cache_status
(需启用缓存模块)
统计缓存命中情况:
awk '{print $10}' access.log | sort | uniq -c
MISS
:未命中,需优化HIT
:命中,理想状态EXPIRED
:缓存过期但仍有价值BYPASS
:缓存被绕过缓存时间(expires
)
对静态资源(如CSS/JS/图片)设置长期缓存:
location ~* \.(js|css|png|jpg)$ {
expires 365d;
add_header Cache-Control "public";
}
代理缓存配置
根据$upstream_cache_status
调整proxy_cache_valid
:
proxy_cache_valid 200 302 10m; # 成功响应缓存10分钟
proxy_cache_valid 404 1m; # 404缓存1分钟
缓存键优化
避免因URL参数(如?utm_source
)导致缓存碎片化:
proxy_cache_key "$scheme$host$uri";
区分热门内容
通过访问频率日志分析,对高频资源延长缓存时间:
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -20
绕过缓存条件
针对特定用户代理(如爬虫)或路径禁用缓存:
map $http_user_agent $nocache {
default 0;
"~*bot" 1;
}
proxy_cache_bypass $nocache;
边缘缓存(Edge Side Includes)
对动态页面中的静态片段启用部分缓存:
ssi on;
proxy_cache_valid 200 1h;
实时日志分析工具
使用goaccess
或ELK
栈可视化缓存命中率:
goaccess access.log --log-format=COMBINED
告警机制
监控MISS
率突增情况,触发自动化配置调整。
A/B测试
对比不同缓存策略下的$upstream_cache_status
分布。
日志中发现/api/product
的MISS
率高达90%,但该接口数据变化频率低。
location /api/product {
proxy_cache_valid 200 5m; # 缓存5分钟
proxy_cache_key "$uri$is_args$args"; # 包含完整参数
proxy_cache_bypass $cookie_sessionid; # 动态会话绕过缓存
}
结果:缓存命中率提升至70%,后端负载下降60%。
通过系统化的日志分析,可以逐层优化缓存策略,平衡性能与数据实时性。建议每季度审查日志模式,适应业务变化。