Nginx微服务网关中虚拟主机核心是按域名路由流量至不同后端服务,每个server块绑定独立server_name(如api.example.com),配合upstream实现服务解耦与负载均衡,并支持通配符、多域名及路径级灰度路由。

Nginx 在微服务网关中配置虚拟主机,核心目标不是托管静态网站,而是按域名或子域名把不同业务流量精准路由到对应后端服务(如 user-svc、order-svc、admin-api 等),同时保持轻量、统一入口和可扩展性。关键不在于“多个网站”,而在于“一个 IP + 多个服务域名”的逻辑隔离。
按域名区分服务(最常用)
这是微服务网关中最主流的虚拟主机用法。每个 `server` 块绑定一个 `server_name`,代表一个独立的服务入口。server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://user-svc/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name orders.example.com;
location / {
proxy_pass http://order-svc/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}-
server_name支持通配符(如*.api.example.com)和多域名逗号分隔(如admin.example.com, dashboard.example.com) - 每个
server块可独立配置 SSL、限流、鉴权等策略,适合多租户或多团队场景
配合 upstream 实现服务解耦
虚拟主机本身不直接写后端地址,而是通过 `upstream` 抽象服务集群,便于后续加负载均衡或健康检查。upstream user-svc {
server 10.0.1.10:8081;
server 10.0.1.11:8081;
# 可加 weight、max_fails、fail_timeout 等
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://user-svc/;
# 其他 proxy_* 配置...
}
}-
upstream定义在http块里,全局生效,server块只负责路由决策 - 修改后端实例只需改
upstream,无需动每个server
路径前缀 + 虚拟主机混合路由(灵活补充)
当域名资源有限,或需灰度/版本控制时,可在同一域名下用路径区分服务,但需注意与虚拟主机协同。server {
listen 80;
server_name api.example.com;
# v1 用户服务
location /v1/users/ {
proxy_pass http://user-svc-v1/;
}
# v2 用户服务(灰度)
location /v2/users/ {
proxy_pass http://user-svc-v2/;
}
# 订单服务(同域名不同路径)
location /orders/ {
proxy_pass http://order-svc/;
}
}-
location优先级高于server_name匹配,路径规则越具体越先匹配 -
proxy_pass末尾斜杠/决定是否剥离前缀,务必保持一致(如/v1/users/→proxy_pass http://svc/会转发为/)
注意事项与避坑点
- `server_name` 必须与客户端请求头中的 `Host` 字段完全匹配(忽略端口),DNS 或 hosts 文件需提前配置好 - 若使用 Docker + nginx-proxy,`VIRTUAL_HOST` 环境变量会自动生成多个 `server` 块,无需手写 - 所有 `server` 块必须共用相同 `listen` 端口(如都 `listen 80`),否则不算同一层虚拟主机 - 避免 `server_name _;` 或空值,会导致默认匹配抢占其他域名配置不复杂但容易忽略


















