Nginx虚拟主机本身不实现负载均衡,需配合upstream模块:每个server块通过proxy_pass指向独立upstream组,实现多域名各自负载均衡;upstream定义后端集群及算法,server_name区分域名,二者协同完成流量分发与隔离。

Virtual Host 与 upstream 必须协同使用
Virtual Host 负责识别请求属于哪个站点(比如 shop.example.com 还是 api.example.com),而每个 server 块里通过 proxy_pass 指向一个预先定义好的 upstream 组——这才是负载均衡的执行单元。
- 不能在 server 块里直接写多个 backend 地址,必须先在 http 块外层定义 upstream
- 每个 Virtual Host 可绑定不同的 upstream,互不影响
- 同一个 upstream 可被多个 server 共享,也可单独定义
按域名分发到不同负载集群
例如:把用户前台和后台 API 的流量完全隔离,各自走自己的服务器池:
-
shop.example.com → 转发到
upstream shop_backend { ... } -
api.example.com → 转发到
upstream api_backend { ... } - 两组 upstream 可配置不同策略(如 shop 用 ip_hash 保持登录态,api 用 least_conn 处理长连接)
典型配置结构示意
在 /etc/nginx/conf.d/vhosts.conf 中:
http {
upstream shop_backend {
server 10.0.1.10:8080 weight=2;
server 10.0.1.11:8080 weight=1;
max_fails=3 fail_timeout=30s;
}
upstream api_backend {
least_conn;
server 10.0.2.20:3000;
server 10.0.2.21:3000;
}
server {
listen 80;
server_name shop.example.com;
location / {
proxy_pass http://shop_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
注意几个易错细节
-
upstream 名称不能含下划线(如
shop_backend合法,shop_back_end在某些旧版本会报错) -
proxy_pass 末尾斜杠影响路径重写:写成
http://shop_backend/会剥离 location 匹配前缀;写成http://shop_backend则原样透传 - 多个 Virtual Host 共用同一端口时,server_name 必须唯一且 DNS 已解析到该 Nginx 服务器
- 若启用 HTTPS,需在每个 server 块中配置 ssl_certificate 和 ssl_certificate_key,并监听 443 端口


















