$remote_port 可直接用于 Nginx 日志格式,自 1.3.12 版本起原生支持,记录客户端 TCP 源端口;需确保版本 ≥1.3.12,且未经多层 TCP 代理,否则可能失效。

可以直接在 Nginx 日志格式中使用 $remote_port 变量,它代表客户端发起连接时使用的源端口号(即浏览器或客户端程序随机分配的本地端口),无需额外模块或编译。
确认 $remote_port 可用且有效
Nginx 从 1.3.12 版本起原生支持 $remote_port,用于记录客户端 TCP 连接的源端口。该变量与 $remote_addr 配对使用,反映真实发起请求的 IP 和端口组合。
- 确保 Nginx 版本 ≥ 1.3.12(可通过
nginx -v查看) - 该端口是客户端操作系统分配的临时端口(通常在 1024–65535 范围),不是服务端监听端口
- 不经过反向代理时,
$remote_port直接可用;若经多层代理(如 CDN、负载均衡器),需确认中间设备未剥离原始 TCP 层信息(此时可能失效)
在日志格式中启用 remote_port
修改 log_format 指令,在自定义日志模板中加入 $remote_port:
log_format main '$remote_addr:$remote_port - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
日志样例输出:
192.168.1.5:54321 - - [14/June/2026:20:56:33 +0000] "GET /api/user HTTP/1.1" 200 1245 "https://example.com/" "Mozilla/5.0..."配合 X-Forwarded-For 等头字段的注意事项
当 Nginx 前有 L3/L4 层代理(如四层 SLB、TCP 负载均衡器)时,$remote_port 仍指向最外层代理的源端口,而非原始客户端端口——因为 TCP 连接已重建,原始端口信息丢失。
- 七层代理(如另一台 Nginx、HAProxy 启用 PROXY 协议)可透传原始端口,但需启用
proxy_protocol并配置set_real_ip_from - 普通 HTTP 反向代理无法传递客户端源端口,
$remote_port始终是上一跳代理的出端口 - 若需严格追踪原始端口,应在接入层(如边缘 Nginx)直接记录,避免中间 TCP 终结
验证与调试方法
快速验证 $remote_port 是否正常工作:
- 添加一个调试 location,返回 JSON 包含该变量:
location /debug/port { return 200 '{"ip":"$remote_addr","port":$remote_port,"agent":"$http_user_agent"}'; } - 用 curl 或浏览器访问该路径,观察响应中的 port 字段是否为非零整数(如
"port":52187) - 对比
netstat -an | grep :80输出中的 ESTABLISHED 连接,确认远端地址和端口与日志一致


















