Nginx反向代理本地Web应用
反向代理把域名请求转发给已经运行的Web应用。本文以Ubuntu 24.04 LTS发行版Nginx为例,上游是127.0.0.1:3000的普通HTTP服务,根路径发布,不涉及WebSocket或子路径改写。先按应用官方说明启动服务,不把临时开发服务器当生产部署。产品必须允许该用途,住宅云不能用于建站。
前置操作见Ubuntu安装Nginx并发布静态网站;面板及容器管理的Nginx不能套用本文目录。
先确认应用自身能回答请求
sudo ss -lntp
curl -i http://127.0.0.1:3000/
确认监听地址是127.0.0.1或符合设计的私网地址,并记录应用应返回的状态码和页面。某些应用根路径可能是404,应改用其明确提供的健康检查路径;不能先把上游404判断成Nginx故障。应用在本机都连不上时,先处理进程、端口和应用日志,不改公网规则。
建立域名对应的代理站点
先运行sudo nano /etc/nginx/sites-available/baole-proxy.conf,新建独立配置,在其中填入下方server块并保存。文件名已存在时先确认用途,不能覆盖正式配置。下面example.com必须改成你拥有的实际域名;已有同名域名站点时,在原站点配置内调整,不再新建重复server_name。
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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-Forwarded-Proto $scheme;
}
}
proxy_pass在这里不附加URI,保留原请求路径。带末尾路径的proxy_pass与location前缀组合可能改变转发URI,不能随意加斜杠后再假设路径不变。应用若根据代理头判断HTTPS或真实IP,应只信任你控制的代理来源,不能无条件信任任意客户端提交的X-Forwarded-*。
仅对本次新建文件建立启用链接;原站点内修改则跳过ln步骤。若链接已存在,先检查指向,不能直接覆盖。
sudo ln -s /etc/nginx/sites-available/baole-proxy.conf /etc/nginx/sites-enabled/baole-proxy.conf
sudo nginx -t
sudo systemctl reload nginx
curl -i --resolve example.com:80:127.0.0.1 http://example.com/
从本机、外网依次验证
- 比较直连上游与经过Nginx的状态码和无敏感内容的健康页,确认命中的是同一个应用。
- HTTP阶段只验证公开测试页,不发送登录密码、会话令牌或其他敏感资料。
- 先为Nginx配置有效HTTPS,再验证登录、表单、静态资源及业务路径。应用生成的链接与跳转也要正确,不能只让浏览器看到HTTPS而忽略应用循环跳转。
- 确认上游端口无需公网直连时,保持仅本机监听,并检查系统及产品访问规则没有多余开放3000。
出现502、504或跳转循环怎么办
| 现象 | 检查方向 |
|---|---|
| 502 | 检查Nginx error_log中的connect失败、上游提前断开;核对进程和协议,不能把HTTPS上游当HTTP。 |
| 504 | 记录耗时,对照应用和数据库日志;先定位慢请求,不直接无限放大超时。 |
| 静态资源404 | 检查应用基础路径和proxy_pass URI处理,不用全局rewrite碰运气。 |
| 重定向循环 | 核对TLS终止位置、X-Forwarded-Proto及应用可信代理配置。 |
回退时恢复原server块并检测后加载;如只是新建代理站点,可先停用该配置链接,保留应用数据。WebSocket、长连接和大文件另按应用要求设置,不能把此最小模板作为所有业务的通用配置。