用 proxy_pass 隐藏后端非标准端口,核心是正确处理路径拼接(末尾斜杠决定是否截去 location 前缀)、设置四大代理头(Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto)以透传客户端信息,并按需增强 WebSocket、HTTPS 后端及静态资源优化。

用 proxy_pass 隐藏后端非标准端口(如 3000、8080、8000),核心是让外部只通过 80 或 443 端口访问域名,而 Nginx 在内部把请求安全、准确地转给本地真实服务。关键不在“加代理”,而在路径怎么截、头怎么传、协议怎么透。
一、明确 proxy_pass 路径拼接规则(最容易出错)
末尾斜杠 决定是否去掉 location 前缀,直接影响后端收到的 URL:
-
带斜杠:如
proxy_pass http://127.0.0.1:3000/;→location /api/ { ... }下访问/api/users,后端实际收到/users -
不带斜杠:如
proxy_pass http://127.0.0.1:3000;→ 同样访问/api/users,后端收到完整路径/api/users - location 用正则(如
~ ^/v1/)时,proxy_pass必须写全地址,且不能省略 URI(哪怕只写/)
二、必须设置的四个代理头(否则后端可能拿错 IP 或跳错协议)
默认 Nginx 不传递原始请求信息,后端服务依赖这些头做鉴权、日志、重定向:
-
proxy_set_header Host $host;—— 保持用户访问的域名,避免后端因 Host 不匹配返回 404 -
proxy_set_header X-Real-IP $remote_addr;—— 传最外层真实客户端 IP(尤其有 CDN 时) -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 支持多级代理链路还原 -
proxy_set_header X-Forwarded-Proto $scheme;—— 告诉后端当前是 http 还是 https,防止登录后跳回 http
三、常见增强配置(按需添加)
基础转发跑通后,这几项常立刻用上:
-
WebSocket 支持:加两行
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade"; -
HTTPS 后端(测试用):
proxy_pass https://127.0.0.1:8443/;开发环境可临时加proxy_ssl_verify off;(生产务必配好证书) -
静态资源绕过代理:在 proxy 规则前加
location ~* \.(js|css|png|jpg|gif)$ { root /var/www/static; }利用 Nginx 最长匹配优先原则,直接由 Nginx 返回,不走后端
四、宝塔面板用户建议操作路径
如果用宝塔,优先走图形界面,再按需微调配置文件:
- 网站 → 添加站点(PHP 版本选「纯静态」)→ 设置 → 反向代理 → 填目标 URL(如
http://127.0.0.1:3000/) - 若需自定义头或超时,进「配置文件」选项卡,在
location /块内手动补全proxy_set_header和proxy_pass - 改完点「保存」→ 再点「重载配置」,别忘了检查 Nginx 语法:
nginx -t - 确认后端服务已运行、防火墙放行本地 127.0.0.1 到目标端口(如
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port port="3000" protocol="tcp" accept')











