需使用 $upstream_cache_status 变量并确保 proxy_cache 已启用:在 http 块定义 proxy_cache_path,location 中配置 proxy_cache、proxy_cache_valid,响应头允许缓存,log_format 显式包含该变量且 access_log 置于 location 内,按路径分离日志,可加 add_header 调试,六种状态(HIT/MISS/EXPIRED/BYPASS/STALE/UPDATING)均应计入命中率统计。

要在 Nginx 日志中记录 proxy_cache 的缓存命中状态,核心是使用内置变量 $upstream_cache_status,并确保它被正确采集和输出。这个变量会在每次代理请求结束时自动填充为 HIT、MISS、EXPIRED 等状态值,但前提是缓存功能已实际启用且作用域匹配。
必须先启用 proxy_cache 并正确定义缓存区
变量 $upstream_cache_status 仅在启用了 proxy_cache 的 location 中有效。如果该字段在日志里大量显示为 - 或空,说明缓存未真正生效。需确认:
- 在 http 块中已用 proxy_cache_path 定义缓存区,例如:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off; - 目标 location 中明确启用了缓存:
proxy_cache mycache;proxy_cache_valid 200 302 10m; - 后端响应头未阻止缓存(如不含
Cache-Control: no-store、Set-Cookie或Vary: *)
在 log_format 中加入 $upstream_cache_status
该变量需显式写入自定义日志格式,且 log_format 必须定义在 http 块中(全局可用)。示例:
log_format cache_log '$remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_cache_status $request_time $upstream_response_time';
然后在对应 location 中引用:
access_log /var/log/nginx/api_cache.log cache_log;
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
注意:不要把 access_log 放在 server 或 http 块顶层,否则可能因作用域不匹配导致变量为空。
按路径分离日志,避免混杂干扰分析
不同业务路径的缓存行为差异大,混在同一个日志文件里会掩盖问题。建议为关键路径单独配置日志:
location /static/ { access_log /var/log/nginx/static_cache.log cache_log; }location /api/v1/ { access_log /var/log/nginx/api_v1_cache.log cache_log; }
同时可加调试响应头便于单次验证:add_header X-Cache-Status $upstream_cache_status;
理解六种常见状态含义,支撑后续分析
日志中可能出现的值不止 HIT 和 MISS,每种代表不同缓存逻辑:
- HIT:缓存命中,直接返回
- MISS:无缓存,转发请求并缓存响应
- EXPIRED:缓存过期,转发请求并异步更新缓存
- BYPASS:命中但被 proxy_cache_bypass 规则跳过
- STALE:缓存过期但仍返回(因配置了 proxy_cache_use_stale)
- UPDATING:缓存正在后台更新,当前返回旧内容
统计命中率时,分母应为这六类之和,而非仅 HIT+MISS —— 这样才能真实反映缓存系统的整体效率。

















