nginx通过proxy_pass实现反向代理的核心是正确处理路径拼接与透传关键请求头:proxy_pass以/结尾时截去location前缀再拼接,否则原样转发;必须配置host、x-real-ip、x-forwarded-for和x-forwarded-proto等头信息以保障后端获取真实客户端信息。

使用 proxy_pass 实现基础反向代理,核心是让 Nginx 接收客户端请求后,把请求转发给后端服务(比如本地的 Node.js、Python 或另一个 Web 服务器),再把响应原样返回给客户端。关键在于路径匹配、协议处理和头信息传递是否正确。
配置 location 块并指定 proxy_pass 目标
在 server 块中定义一个 location,用 proxy_pass 指向后端地址。注意末尾斜杠的影响:
- 如果
proxy_pass以/结尾(如http://127.0.0.1:3000/),Nginx 会去掉匹配的 location 路径前缀,再拼接转发 - 如果不带结尾斜杠(如
http://127.0.0.1:3000),则整个原始 URI 都会被转发过去
例如:
location /api/ {
proxy_pass http://127.0.0.1:3000/;
}
访问 /api/users 会被转发为 http://127.0.0.1:3000/users;而写成 proxy_pass http://127.0.0.1:3000; 则转发为 http://127.0.0.1:3000/api/users。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
补充必要代理头,避免后端丢失原始信息
默认情况下,Nginx 不会透传客户端真实 IP 和协议类型,后端可能看到的是 Nginx 本机地址或认为是 HTTP 请求。需手动设置几个关键 header:
-
proxy_set_header 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
处理 WebSocket 或长连接需要额外指令
如果后端支持 WebSocket(如某些 API 网关或实时服务),默认 HTTP 代理会断开升级请求。需显式启用:
-
proxy_http_version 1.1;:必须设为 1.1 才支持 upgrade -
proxy_set_header Upgrade $http_upgrade;:透传 Upgrade 头 -
proxy_set_header Connection "upgrade";:确保连接不被关闭
这三行通常一起出现,缺一不可。
验证与调试小技巧
配置完成后别急着 reload,先检查语法:nginx -t。确认无误再执行 nginx -s reload。调试时可临时开启 access_log 和 error_log 的 debug 级别,或在后端打印收到的请求头,重点核对 Host、X-Real-IP、X-Forwarded-Proto 是否符合预期。遇到 502 错误,优先检查后端是否已启动、端口是否监听、防火墙是否放行。










