nginx通过location匹配版本路径(如/v1/、/v2/)精准路由至对应后端服务,并透传x-forwarded-for、host等头信息,配合proxy_redirect修正重定向、proxy_cookie_path隔离cookie,实现多版本并行与灰度发布。

配置 Nginx 代理支持后端服务器的版本控制,关键在于将 API 版本路径(如 /v1/、/v2/)精准映射到对应版本的后端服务,同时避免路径错位、头信息丢失或重定向失效等问题。
按版本路径分流到不同后端
最常用且清晰的方式是用 location 匹配版本前缀,分别指向独立部署的版本服务:
-
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/
统一入口 + upstream 动态路由(适合灰度发布)
当需在运行时切换版本或做 A/B 测试,可结合 upstream 和变量路由:
- 定义多个 upstream,如
upstream api_v1 { server 127.0.0.1:8081; }、upstream api_v2 { server 127.0.0.1:8082; } - 用
map指令提取路径版本号:map $uri $backend_upstream { ~^/v1/ v1; ~^/v2/ v2; default v1; } - 在 location 中引用:
proxy_pass http://api_$backend_upstream/;
保持版本一致性与兼容性细节
版本代理不是只改路径,还需保障请求上下文完整传递:
- 必须透传
X-Forwarded-For和X-Real-IP,否则后端日志和限流无法识别真实客户端 - 显式设置
Host $host,避免后端生成跳转链接时误用内部地址(如http://127.0.0.1:8081/login) - 若后端返回 302 重定向,加
proxy_redirect ~^http://[^/]+(/.*)$ $scheme://$host$1;修正 Location 头 - 对带 Cookie 的会话型接口,加上
proxy_cookie_path / /v1/;或/v2/,防止跨版本 Cookie 冲突
可选:自动降级与默认版本兜底
未匹配任何版本路径时,应导向稳定版而非报错:
- 把
location / { proxy_pass http://backend-v1/; }放在所有版本规则之后,作为默认入口 - 配合
error_page 404 = @fallback;和location @fallback { proxy_pass http://backend-v1/; }做更细粒度兜底 - 生产环境建议启用健康检查:
upstream中加max_fails=3 fail_timeout=30s,自动屏蔽异常版本节点











