You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Nginx记录其代理/负载均衡请求至的应用服务器IP或本地端口?

实现Nginx负载均衡并记录转发目标端口

嘿,这需求很明确,我来一步步帮你搞定:

1. 配置Nginx上游服务器组

首先得把你的三个Express应用注册成Nginx的上游节点。打开Nginx的配置文件(比如/etc/nginx/nginx.conf,或者在/etc/nginx/conf.d/下新建express_lb.conf,单独管理更清爽),添加上游配置:

upstream express_nodes {
    server localhost:3000;
    server localhost:3001;
    server localhost:3002;
    # 默认是轮询策略,要是需要其他策略(比如按IP哈希、最少连接数)直接加在这里就行,比如加个`ip_hash;`
}

2. 配置反向代理监听80端口

接下来配置server块,把80端口的请求转发到上面的上游组,同时要传递目标端口的信息:

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://express_nodes;
        # 传递必要的请求头,同时带上目标服务器的端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 自定义一个请求头,把上游服务器的端口带过去,方便后续日志记录
        proxy_set_header X-Target-Port $upstream_port;
    }
}

3. 自定义日志格式,记录目标端口

默认的Nginx日志不会包含上游端口,所以得自定义日志格式。在http块里添加新的日志格式定义,然后指定用这个格式记录日志:

http {
    # ...保留其他默认配置...

    # 定义包含目标端口的日志格式
    log_format lb_log '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      'target_port: $upstream_port';

    # 把访问日志切换成这个新格式
    access_log /var/log/nginx/lb_access.log lb_log;

    # 上面的upstream和server配置也要放在http块里哦
}

要是不想改全局日志,也可以在刚才的server块里单独指定access_log,比如:

server {
    listen 80;
    server_name localhost;
    access_log /var/log/nginx/express_lb.log lb_log;

    location / {
        # ...之前的proxy配置...
    }
}

4. 验证配置并重启Nginx

改完配置别忘检查语法是否正确:

sudo nginx -t

如果输出nginx: configuration file /etc/nginx/nginx.conf test is successful,就可以重启Nginx生效了:

sudo systemctl restart nginx
# 老系统可能用这个:sudo service nginx restart

5. 测试并查看日志

现在可以运行你的ab测试命令了:

ab -c 10 -n 2000 http://localhost/

测试完成后,查看日志就能看到每条请求转发到的端口了:

tail -f /var/log/nginx/lb_access.log
# 或者你指定的日志文件路径

日志里的target_port: XXXX就是转发到的3000/3001/3002端口。

另外,要是你想在Express应用里也拿到这个端口,直接通过req.headers['x-target-port']就能获取,方便应用自身记录。

内容的提问来源于stack exchange,提问作者benSooraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:59:58