nginx 实现后端多版本共存,通过 location 路径匹配(如 /v1/、/v2/)精准分流,透传请求头与重写响应头确保一致性,支持 map 动态灰度路由及默认兜底与健康检查。

按 API 路径精准分流
最直接的方式是用 location 匹配版本前缀,把 /v1/、/v2/ 请求分别代理到对应后端:
-
location /v1/ { proxy_pass http://backend-v1/; }—— 注意末尾斜杠,确保 /v1/users 转发为 /users 到 v1 服务 -
location /v2/ { proxy_pass http://backend-v2/; }—— 同理,隔离 v2 的上下文 - 后端若监听不同端口(如 v1→8081,v2→8082),可写成
http://127.0.0.1:8081/和http://127.0.0.1:8082/
透传关键请求头与修正响应
只转发路径不够,后端需要真实客户端信息和正确跳转地址:
- 必须设置:
proxy_set_header X-Forwarded-For $remote_addr;和proxy_set_header X-Real-IP $remote_addr;,否则限流、日志、风控会失效 - 显式传递 Host:
proxy_set_header Host $host;,防止后端生成http://127.0.0.1:8081/login这类内部链接 - 若后端返回 302,加
proxy_redirect ~^http://[^/]+(/.*)$ $scheme://$host$1;重写 Location 头 - 有登录态的接口,加上
proxy_cookie_path / /v1/;或/v2/,避免 v1/v2 的 Cookie 冲突
支持灰度与动态路由(非硬编码)
当需要按请求特征切换版本(比如指定用户走 v2),可用 map + upstream 动态路由:
- 定义 upstream:
upstream api_v1 { server 127.0.0.1:8081; },upstream api_v2 { server 127.0.0.1:8082; } - 用 map 提取版本标识:
map $http_x_backend_version $target_upstream { "" v1; "v2" v2; "canary" v1; } - 在 location 中使用:
proxy_pass http://api_$target_upstream/; - 前端只需加 header:
X-Backend-Version: v2,即可命中新版本,无需改 URL
默认兜底与健康保障
未匹配任何版本时不能 404,要导向稳定版:
- 把
location / { proxy_pass http://backend-v1/; }放在所有版本规则之后,作为默认入口 - 更细粒度控制可配
error_page 404 = @fallback;+location @fallback { proxy_pass http://backend-v1/; } - 生产环境建议为 upstream 加健康检查(如
check interval=3 rise=2 fall=3),自动剔除异常节点











