Nginx实现API路径到微服务分发的核心是location匹配+proxy_pass转发,需按业务前缀(如/user/、/order/)精准配置,注意proxy_pass末尾斜杠对路径截取的影响,并透传X-Real-IP、Host等关键请求头,配合upstream分组实现健康隔离。

用 Nginx 实现不同 API 路径到不同微服务的分发,核心是靠 location 块做路径匹配 + proxy_pass 指向对应后端,再辅以关键请求头透传和路径处理逻辑。不需要改微服务代码,也不依赖统一网关组件。
按业务路径精准配置 location 规则
每个微服务应有明确、互不重叠的路径前缀,比如用户服务用 /user/,订单服务用 /order/,避免都走 /api/ 引发冲突:
-
location /user/ { proxy_pass http://192.168.1.10:8081; }→ 请求/user/profile转发为http://192.168.1.10:8081/user/profile -
location /order/ { proxy_pass http://192.168.1.11:8082/; }→ 末尾带/,会截掉/order/,转发为http://192.168.1.11:8082/profile - 未匹配路径统一返回 404:
location / { return 404; },防止意外回退到默认静态目录
确保后端能识别原始请求信息
微服务常依赖 Host、客户端 IP 或协议类型做鉴权或日志,必须显式透传或标准化这些头:
- 保留原始 Host:
proxy_set_header Host $http_host;(比$host更准确,含端口) - 传递真实客户端 IP:
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;,方便后端判断是否 HTTPS
适配异构服务的路径与协议差异
老系统可能只认 /rest/ 开头,或要求固定 Host;gRPC 服务需启用 HTTP/2 支持:
- 路径重写示例:把
/legacy/xxx改成/rest/xxx再转发:rewrite ^/legacy/(.*)$ /rest/$1 break;,然后接proxy_pass http://old-svc; - 强制指定 Host 头(如后端校验白名单):
proxy_set_header Host "legacy-api.internal"; - 代理 gRPC 服务时,在
server块启用 HTTP/2:listen 443 http2 ssl;,并确认 Nginx 版本 ≥ 1.13.10
用 upstream 分组管理后端稳定性
不同微服务健康度差异大,不能共用一套探测策略。为每套服务定义独立 upstream,便于隔离故障和灰度发布:
upstream user_svc { server 192.168.1.10:8081 max_fails=2 fail_timeout=30s; }-
upstream order_svc { server 192.168.1.11:8082 max_fails=1 fail_timeout=10s; }(对脆弱服务更敏感) - 在 location 中引用:
proxy_pass http://user_svc;,而非直写 IP


















