直接用 $server_port 变量可区分同路径在不同端口下的响应状态,关键在于日志格式中显式记录该变量,并配合后续按端口+路径聚合统计、租户映射及多维监控实现精准分析与告警。

直接用 $server_port 变量即可区分同路径在不同端口下的响应状态,关键在于日志格式设计和后续分析逻辑的配合。
在 Nginx 日志格式中显式记录端口
Nginx 的 $server_port 是内置变量,表示当前请求实际监听的端口(非 $remote_port)。需将其写入 access log,便于后续按端口切分分析:
- 在
http或server块中定义自定义日志格式,例如:log_format tenant_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $server_port'; - 确保每个租户对应的
server块使用该格式并绑定明确端口(如 8081、8082),而非仅靠 host 或 path 区分 - 避免混用
$port_in_redirect或$server_addr,它们不反映请求入口端口
按端口 + 路径聚合统计状态码
日志有了端口字段后,可用标准工具快速下钻分析。例如用 awk 统计某路径在各端口的 5xx 分布:
-
awk '$7 == "8081" && $4 ~ /^\/api\/order/ {count[$5]++} END {for (c in count) print c, count[c]}' access.log($7 是 $server_port,$4 是 request,$5 是 status) - 用 Loki + Promtail 时,在 pipeline 中提取
server_port为 label,再通过sum by (server_port, path, status) (count_over_time(...))实现多维监控 - 注意:若使用 HTTPS 重定向,$server_port 记录的是实际处理请求的端口(如 443),不是原始 80;若做了端口转发,需确认 Nginx 是否运行在真实端口上
告警与租户隔离的关键逻辑
单纯统计不够,需结合租户上下文触发精准告警:
- 将
$server_port与租户 ID 映射关系固化(如配置文件或数据库),避免硬编码在日志脚本中 - 对同一路径(如
/health),若端口 A 的 503 率突增而端口 B 正常,说明该租户网关实例异常,而非全局故障 - 在 Grafana 中用变量下拉选择
server_port,联动显示对应租户的路径状态趋势,避免所有租户日志堆叠干扰判断
规避常见误用陷阱
几个容易导致端口信息失效的典型问题:
- 反向代理后未开启
proxy_set_header X-Real-Port $server_port,且后端服务又覆盖了日志字段 —— 此时应确保日志采集点在 Nginx 边界 - 容器化部署中多个租户共享一个 Nginx 实例但用不同 server_name,却共用同一端口 —— 这时
$server_port失去区分意义,应改用$server_name或自定义 header - 日志轮转未同步更新解析规则,导致新旧日志中
$server_port字段位置偏移,awk 或 grok 解析失败











