You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动