如何让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
相关产品推荐
相关产品推荐

