应使用精准的log_format区分静态资源、反向代理与缓存行为:通过$upstream_addr判别请求类型,用$http_x_forwarded_for透传真实IP,以$upstream_cache_status标记缓存状态,并结合$request_time和$upstream_response_time分析性能。

要实现对 Nginx 静态资源服务、反向代理与缓存的全量监控,核心不是堆砌日志字段,而是让 log_format 精准反映三类关键行为:资源类型归属、代理链路状态、缓存命中结果。重点在于用好变量组合,而非盲目加长日志行。
区分静态资源与动态请求的访问来源
静态资源(如 CSS/JS/图片)通常由 Nginx 直接响应,不经过后端;而反向代理请求会转发给 upstream。可通过 $request_uri 和 $sent_http_content_type 判断资源性质,再结合 $upstream_addr 是否为空来区分路径:
- 若
$upstream_addr为空,说明是本地文件响应,属于静态资源服务 - 若
$upstream_addr有值(如10.0.1.5:8080),说明已走反向代理 - 搭配
$sent_http_content_type可进一步识别是否为图片(image/jpeg)、脚本(application/javascript)等
透传并记录客户端真实 IP 与代理层级
当 Nginx 前置了 CDN 或负载均衡时,$remote_addr 只是上一跳地址。必须依赖 $http_x_forwarded_for 获取原始客户端 IP,并用它替代默认 IP 字段:
- 定义格式时优先使用
$http_x_forwarded_for,但需注意该头可能被伪造,生产环境应配合set_real_ip_from+real_ip_header X-Forwarded-For使用 - 添加
$http_x_real_ip或$http_x_cluster_client_ip(视上游设备而定)作备用字段,便于交叉校验 - 加入
$server_name和$host,可快速定位是哪个虚拟主机或域名触发了该请求
显式标记缓存行为与性能指标
缓存监控的关键是把 $upstream_cache_status 暴露在日志中,并关联耗时数据:
-
$upstream_cache_status值为HIT、MISS、EXPIRED、STALE、BYPASS等,直接反映缓存策略执行效果 - 搭配
$request_time(Nginx 接收完整请求到发出响应的总耗时)和$upstream_response_time(后端实际处理时间),可判断瓶颈在缓存层还是上游 - 对静态资源服务,
$upstream_response_time应恒为“-”,若出现数值则说明配置异常(例如误配了 proxy_pass)
推荐的一体化 log_format 示例
以下格式兼顾可读性与分析友好性,适用于 access.log:
log_format full_cache
'$http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$upstream_addr" "$upstream_cache_status" '
'$request_time $upstream_response_time '
'$sent_http_content_type $uri';
启用方式:access_log /var/log/nginx/access.log full_cache;。该格式无需额外模块,所有变量均为 Nginx 内置,部署即生效。











