Nginx Stream 模块虽无原生应用层状态码及TCP握手耗时监控,但可通过自定义日志(含$upstream_connect_time)、error_log分类终态、辅以tcpdump/ss/bpftrace等工具实现连接建立、转发稳定性及异常终态的可观测性。

Nginx Stream 模块本身不提供应用层状态码或 TCP 握手耗时的原生监控能力,但可以通过组合配置与辅助手段,实现对代理服务连接建立、转发路径稳定性及异常终态的可观测性。关键在于分层设计:用 Stream 日志记录元数据、用错误日志捕获失败类型、再借助系统工具补足精度缺口。
配置基础连接日志用于路径追踪
Stream 支持自定义日志格式,可记录每次连接的关键上下文,便于后续关联分析:
- 在
stream块顶部定义日志格式,包含时间戳、客户端/服务端地址、后端目标、字节收发量等:log_format stream_log '$time_iso8601 $remote_addr → $upstream_addr ' '$bytes_sent/$bytes_received ' 'connect=$upstream_connect_time'; - 启用访问日志并指向该格式:
access_log /var/log/nginx/stream-access.log stream_log;
- 注意:
$upstream_connect_time在多数稳定版 Stream 中可用(需 Nginx ≥ 1.19),它表示从发起 connect() 到收到 SYN-ACK 的耗时(单位秒,精度毫秒),是唯一接近“建立时长”的内置变量。
通过 error_log 分类识别连接终态
Stream 不生成 HTTP 状态码,但内核级连接异常会以明确文本写入 error_log:
- 设置合理超时并启用 warn 级别日志:
proxy_timeout 3s; error_log /var/log/nginx/stream-error.log warn;
- 常见终态对应日志关键词:
-
upstream timed out→ 连接建立超时(SYN 发出后未收到 SYN-ACK) -
connection refused→ 后端端口未监听或防火墙拦截 -
connection reset by peer→ 客户端主动断连或中间设备干预 -
no live upstreams→ 所有后端不可用(健康检查触发)
-
补充手段提升监控精度
仅靠 Nginx 日志无法获取真实 TCP 握手 RTT 或区分 FIN/RST 关闭类型,需外挂工具:
- 对关键端口做轻量抓包(生产环境慎用):
tcpdump -i eth0 port 8080 -nn -c 100 -ttt | grep -E "(SYN|SYN-ACK)"
- 在后端服务侧打点(推荐):记录
accept()返回时间,与$time_iso8601差值即为“Nginx 到后端建连延迟” - 使用
ss -ti或bpftrace实时观察重传、连接建立事件(适合排查偶发高延迟)
不复杂但容易忽略


















