nginx通过location路径匹配+proxy_pass斜杠控制实现同域名微服务分发:带/自动截断前缀,不带则原样拼接;需显式设置host、x-real-ip、x-forwarded-proto等请求头,并用proxy_redirect修正后端重定向。

路径前缀路由:最常用也最稳妥的方式
所有微服务共用一个域名(如 api.example.com),靠 URL 路径区分后端,比如:
-
/api/user/ → 用户服务(
http://127.0.0.1:8081) -
/api/order/ → 订单服务(
http://127.0.0.1:8082) -
/api/product/ → 商品服务(
http://127.0.0.1:8083)
关键在 proxy_pass 末尾的 斜杠:
- 写成
proxy_pass http://127.0.0.1:8081/;(带斜杠)→ 自动剥离/api/user/前缀,把/api/user/profile转为/profile发给后端 - 写成
proxy_pass http://127.0.0.1:8081;(不带斜杠)→ 原样拼接,/api/user/profile会变成/api/user/profile,后端若没配对应路由就 404
正则匹配:支持动态提取和透传信息
当路径含版本号、租户 ID 或需灵活映射时,用正则更合适。例如:
- 把
/v2/users/123中的v2提取为请求头传给后端 - 将
/t-abc123/orders映射到订单服务,并透传租户标识
配置示例:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
location ~ ^/v(?<ver>\d+)/users/(.*)$ {
proxy_set_header X-API-Version $ver;
proxy_pass http://user-service:8081/$2;
}</ver>
注意:$2 是正则捕获的路径部分,proxy_pass 后必须带变量或路径,不能只写地址加斜杠。
必须设置的关键请求头
微服务通常依赖原始请求信息做鉴权、日志、跳转或生成绝对链接。Nginx 默认不传递,必须显式声明:
-
proxy_set_header Host $host;—— 避免后端看到user-service或内网 IP -
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for;—— 确保真实客户端 IP 可用 -
proxy_set_header X-Forwarded-Proto $scheme;—— 告诉后端原始是 HTTP 还是 HTTPS,防止重定向跳到 http://
避免重定向失败:加上 proxy_redirect
如果后端返回 302 重定向(比如登录跳转、OAuth 回调),默认会带上自己的地址(如 http://127.0.0.1:8081/login)。用户访问不到,页面白屏。
解决方法是重写响应头中的 Location:
- 简单场景:
proxy_redirect http://127.0.0.1:8081/ /api/user/; - 通用写法:
proxy_redirect ~^http://[^/]+(/.*)$ $1;—— 把后端重定向地址里的 host 部分去掉,只留路径










