正确配置nginx代理非标准端口需同步处理四环节:显式声明后端地址与端口(如http://127.0.0.1:3000/)、透传host/x-real-ip/x-forwarded-for/x-forwarded-proto四大请求头、为websocket长连接启用proxy_http_version 1.1及upgrade/connection头、确认后端监听0.0.0.0且防火墙放行。

要让 Nginx 正确代理到后端集群的非标准端口(比如 3000、8080、9001),不能只改 proxy_pass 地址,得同步处理端口透传、请求头、连接稳定性、后端可达性这四个关键环节。
明确声明后端地址与端口(含协议)
集群中的每个节点或 upstream 定义,都必须显式带上端口号。Nginx 不会自动补全非 80/443 端口:
-
proxy_pass http://127.0.0.1:3000/;✅ 剥离 location 前缀,适合本地单节点 -
proxy_pass http://backend-cluster:8080/;✅ 使用 upstream 名称时仍需写端口 -
upstream backend-cluster { server 192.168.1.10:9001; server 192.168.1.11:9001; }✅ 每个 server 行必须带端口 -
proxy_pass http://127.0.0.1;❌ 默认走 80,后端收不到请求
透传必要请求头(尤其 Host 和协议)
后端集群常依赖 Host 头做路由或租户识别,缺了就容易 404 或跳转异常:
-
proxy_set_header Host $host;—— 最常用,透传域名 -
proxy_set_header Host $host:$server_port;—— 若后端需感知 Nginx 监听端口(如重定向生成 URL) -
proxy_set_header X-Real-IP $remote_addr;—— 传递真实客户端 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 支持多级代理链路还原 -
proxy_set_header X-Forwarded-Proto $scheme;—— 告诉后端当前是 http 还是 https,避免强制跳 http
为长连接和 WebSocket 启用升级机制
如果集群里跑的是前端开发服务、实时日志、SSE 或 gRPC,缺这三行就会在 60 秒后静默断连:
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
这三行必须同时存在,且放在对应 location 块内,不能只写在 server 级别。
确认集群节点监听范围与网络可达性
配置写对 ≠ 请求能通,常见卡点在后端自身:
- 用
ss -tlnp | grep :9001检查每个节点是否真在监听0.0.0.0:9001,不是仅127.0.0.1:9001 - 检查节点防火墙(ufw/firewalld)是否放行该端口,云服务器还要看安全组规则
- Nginx 所在机器能否
curl -v http://192.168.1.10:9001/health直连成功 - 若用域名指向集群(如
backend-cluster),确保 DNS 或 /etc/hosts 解析正确
不复杂但容易忽略的是 Host 头和后端监听范围——多数 502 错误其实不是 Nginx 配置问题,而是集群节点根本没准备好接收这个 Host 或没监听在可访问的地址上。











