Nginx反向代理需正确配置location匹配、proxy_pass路径结尾及关键代理头。/api/配proxy_pass http://127.0.0.1:3000/可去除前缀;必须设Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto头;配置后用nginx -t和curl验证。

在 Nginx 中配置基础的 proxy_pass 实现反向代理,核心是让 Nginx 接收客户端请求后,把请求原样(或稍作改写)转发给后端服务,并把响应返回给客户端。关键不在“加一行”,而在于路径匹配、协议头传递和上下文处理是否正确。
明确 location 匹配规则再写 proxy_pass
proxy_pass 必须写在 location 块中,且匹配方式直接影响转发路径:
- 如果
location /api/后面的proxy_pass以/结尾(如proxy_pass http://127.0.0.1:8080/;),Nginx 会自动去掉匹配到的/api/前缀,再拼接到目标地址 —— 这是最常用、最安全的方式 - 如果
proxy_pass http://127.0.0.1:8080/backend;(不带结尾斜杠),则不会做路径替换,整个原始 URI(含/api/xxx)会直接追加过去,后端需能处理该路径 - 避免写成
proxy_pass http://127.0.0.1:8080;(无结尾斜杠且无路径),此时 Nginx 会把原始 URI 完整透传,容易导致 404(尤其后端不期望带前缀时)
必须设置的关键代理头信息
默认情况下,Nginx 转发时不重写 Host 和真实客户端 IP,后端可能拿到错误的请求来源。务必补充以下头字段:
-
proxy_set_header Host $host;—— 把原始请求的 Host 传给后端,避免后端因 Host 不匹配拒绝请求 -
proxy_set_header X-Real-IP $remote_addr;—— 让后端知道真实用户 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 支持多层代理链路下的 IP 追溯 -
proxy_set_header X-Forwarded-Proto $scheme;—— 告知后端原始请求是 http 还是 https,对跳转或生成绝对链接很重要
简单可用的完整示例
假设本地启动了一个 Node.js 服务监听 http://127.0.0.1:3000,想通过 https://example.com/api/ 访问它:
location /api/ {
proxy_pass http://127.0.0.1:3000/;
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;
}
注意:/api/ 和 proxy_pass 末尾都带 /,这样访问 /api/users 时,实际转发的是 http://127.0.0.1:3000/users。
验证与调试小技巧
配置完别急着 reload,先检查语法并观察行为:
- 运行
nginx -t确保配置无语法错误 - 用
curl -v http://your-domain/api/test查看响应头和状态码 - 在后端日志中确认收到的
Host、X-Real-IP是否符合预期 - 若返回 502,优先检查后端服务是否真的在运行、端口是否可通、防火墙是否放行











