nginx中virtual host本身不直接配置负载均衡,而是通过server块识别域名,并用proxy_pass指向http块中定义的upstream组,实现多域名独立负载均衡;upstream负责后端分发,server_name区分域名,二者协同完成流量分流与集群调度。

Nginx 中 Virtual Host(虚拟主机)本身不直接“配置负载均衡”,而是通过与 upstream 模块配合,在每个 server 块内用 proxy_pass 指向一个已定义的 upstream 组,从而实现按域名分流 + 后端负载均衡的效果。换句话说:Virtual Host 负责识别请求属于哪个域名,upstream 负责把该域名的流量分发到多个后端服务器。
下面分三部分讲清楚怎么实操:
Virtual Host 和负载均衡如何协同工作
- 每个
server { ... }块就是一个 Virtual Host,靠server_name区分不同域名(如a.example.com、b.example.com)。 - 在每个
server块里,不直接写死后端地址,而是proxy_pass http://xxx_upstream;,其中xxx_upstream是在http块顶层用upstream定义的服务器组。 - 这样,不同域名可指向不同的 upstream 组,实现“多域名独立负载均衡”。
配置多个域名、各自负载均衡
假设你要让 shop.example.com 和 api.example.com 分别走自己的后端集群:
http {
# 第一组:电商站点后端
upstream shop_backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# 第二组:API服务后端
upstream api_backend {
server 192.168.2.20:3000;
server 192.168.2.21:3000;
# 可加权重或健康检查参数
server 192.168.2.22:3000 weight=2;
}
# Virtual Host 1:shop.example.com
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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# Virtual Host 2:api.example.com
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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
关键细节和常见调整
-
域名解析前提:确保
shop.example.com和api.example.com都已 DNS 解析或 hosts 映射到这台 Nginx 服务器 IP。 -
upstream 必须在 http 块顶层:不能放在
server或location内,否则会报错。 -
支持多种调度策略:
- 默认轮询(无需额外配置)
- 加权轮询:
server 192.168.1.10:8080 weight=3; - IP 哈希保持会话:在 upstream 块开头加
ip_hash; - 最小连接数:加
least_conn;
-
健康检查基础支持:Nginx 开源版不支持主动心跳检测,但可通过
max_fails=3 fail_timeout=30s实现被动摘除。 -
配置分离建议:生产环境推荐把每个 Virtual Host 单独存为
/etc/nginx/conf.d/shop.conf、/etc/nginx/conf.d/api.conf,主配置中用include /etc/nginx/conf.d/*.conf;加载,更清晰易维护。
不复杂但容易忽略











