Nginx技术咨询:请求发送端口查询及正向代理端口日志配置
Nginx正向代理:记录出站请求端口的解决方案
Great question! Let's break this down step by step:
1. Nginx请求由哪个端口发送?
当Nginx作为正向代理通过$server_port监听端口接收客户端请求后,它会和上游服务器建立新的出站连接——这个连接使用的是系统随机分配的临时端口(ephemeral port),而非监听端口$server_port。临时端口来自操作系统预设的端口范围,专门用于发起主动连接,和负责接收请求的监听端口作用完全不同。
2. 如何将出站连接的端口记录到access.log中?
Nginx从1.11.0版本开始提供了$upstream_local_port变量,这个变量正好存储了Nginx连接上游服务器时使用的本地出站端口。你可以通过以下步骤配置日志记录:
第一步:检查Nginx版本
先确认你的Nginx版本支持$upstream_local_port,执行命令:nginx -v如果版本低于1.11.0,建议升级到较新版本(直接升级是最简便的方案),旧版本没有这个变量的原生支持。
第二步:自定义日志格式
在Nginx配置的http块中,定义包含$upstream_local_port的日志格式。比如:http { # 自定义代理日志格式,新增出站端口字段 log_format proxy_custom '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$upstream_addr" "local_outbound_port:$upstream_local_port"'; # 其他http块配置(如DNS解析器、全局参数等)... }第三步:在代理server块中应用日志格式
找到你的正向代理server配置块,指定access_log使用刚才定义的格式:server { listen 8080; # 你的正向代理监听端口 resolver 8.8.8.8; # 配置DNS解析器,正向代理必备 location / { proxy_pass http://$http_host; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; # 其他代理相关配置... # 应用自定义日志格式 access_log /var/log/nginx/proxy_access.log proxy_custom; } }第四步:重启Nginx生效
保存配置后,重启Nginx使更改生效:# 适用于systemd系统(如Ubuntu 16.04+、CentOS 7+) systemctl restart nginx # 适用于SysVinit系统 service nginx restart
完成后,查看/var/log/nginx/proxy_access.log时,就能看到每条请求对应的出站端口信息了。
内容的提问来源于stack exchange,提问作者KangBing




