nginx官方稳定版(截至2026年5月)不支持$tcpinfo_rtt变量,因其运行在应用层,未集成内核tcp_info系统调用;可行替代方案包括tcpdump/tcprstat抓包分析、proxy protocol v2透传或客户端js上报rtt。

要在日志中记录 $tcpinfo_rtt(即 TCP 连接的平滑往返时间,SRTT),需确保 Nginx 编译时启用了 --with-http_ssl_module 且运行在支持 TCP_INFO 的系统(Linux ≥ 3.10 推荐),同时使用支持该变量的 Nginx 版本(≥ 1.13.2)。
确认 Nginx 支持 $tcpinfo_rtt
该变量仅在启用 SSL/TLS 的连接(即 HTTPS)中有效,且客户端必须完成 TLS 握手、建立真实 TCP 连接后才可获取。普通 HTTP(非 SSL)连接无法读取该值,返回空字符串或 0。
- 执行
nginx -V 2>&1 | grep -o with-http-ssl-module确认模块已编译 - 检查 Nginx 版本:
nginx -v,建议 ≥ 1.13.2 - 在配置中临时加一句
return 200 "$tcpinfo_rtt\n";测试是否输出数值
在 log_format 中直接引用 $tcpinfo_rtt
将变量嵌入自定义日志格式,即可随每次请求记录 RTT 估算值(单位:毫秒,整数):
log_format rttdemo '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$tcpinfo_rtt;
然后在 server 或 location 块中启用:
access_log /var/log/nginx/rtt.log rttdemo;
注意:该值是内核 TCP 栈维护的平滑 RTT(SRTT),非实时 ping 值,反映的是当前连接的历史加权平均,更稳定但略滞后。
配合 map 做条件记录或脱敏
为避免对非 HTTPS 请求记录空值或干扰分析,可用 map 过滤:
map $scheme $rtt_val {
https $tcpinfo_rtt;
default "-";
}
再在 log_format 中用 $rtt_val 替代 $tcpinfo_rtt,这样 HTTP 请求显示为 “-”,日志更清晰。
注意事项与常见问题
该变量依赖内核接口 TCP_INFO,部分容器环境(如某些 Docker 默认网络、旧版 Kubernetes CNI)可能禁用或不透传该信息;若始终为 0 或空,请检查:
- 是否真的走 HTTPS(
$scheme必须为 https) - 客户端是否复用连接(keepalive)——首次请求后后续请求才更可能有稳定 RTT
- 系统是否开启
net.ipv4.tcp_timestamps=1(推荐开启,有助于 RTT 计算) - 是否存在中间代理(如 CDN、WAF)终止了 TLS,导致 Nginx 实际面对的是代理到自身的连接,RTT 失去端到端意义










