如何在 Nginx 中配置基于域名的虚拟主机实现多项目负载均衡

文章导读
在 Nginx 中配置基于域名的虚拟主机结合 upstream 模块可实现多项目负载均衡,其中 max_fails 参数默认值为 1,超过该次数后请求将转发至 backup 服务器。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

如何在 Nginx 中配置基于域名的虚拟主机实现多项目负载均衡

核心结论:在 Nginx 中配置基于域名的虚拟主机结合 upstream 模块可实现多项目负载均衡,其中 max_fails 参数默认值为 1,超过该次数后请求将转发至 backup 服务器。

原因分析

Nginx 的负载均衡功能依赖于 ngx_http_upstream_module 模块,该模块允许定义一组或多组节点服务器组。与 LVS 等硬件负载均衡不同,Nginx 反向代理是接收用户请求后重新发起请求到后端节点服务器,在节点服务器看来,访问的客户端是反向代理服务器而非真实网络用户。基于域名的虚拟主机通过 server_name 指令区分不同域名请求,配合 upstream 实现流量分发。

解决方案

步骤一:配置基于域名的虚拟主机

在 nginx.conf 的 http 节点中添加多个 server 块,每个 server 对应一个域名。参考配置示例(来源:2026 年 4 月 13 日资料):

server {
    listen 80;
    server_name www.iyangyi.com iyangyi.com;
    root /Users/yangyi/www/www.iyangyi.com/;
    index index.php index.html index.htm;
    access_log /usr/local/var/log/nginx/www.iyangyi.access.log main;
    error_log /usr/local/var/log/nginx/www.iyangyi.error.log error;
    location ~\.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

对于多站点场景,可将每个域名的配置拆分为独立文件如 example1.com.conf、example2.com.conf,放置于/usr/local/nginx/vhosts/目录,然后在 nginx.conf 中使用 include 语句批量引入。

步骤二:配置 upstream 负载均衡

在 http 节点中定义 upstream 模块,指定后端服务器池。参考配置(来源:2024 年 8 月 19 日资料):

upstream www_server_pool {
    server 192.168.78.134:8080 weight=5;
    server 192.168.78.135:8080 weight=3;
    server 192.168.78.136:8080 backup;
}

关键参数说明:weight 默认为 1,数值越大分配请求越多;max_fails 允许请求失败次数默认为 1;fail_timeout 指定失败后暂停时间;backup 标记备用服务器,仅当其他服务器 down 或忙时使用。

步骤三:在 server 块中引用 upstream

将虚拟主机与负载均衡关联(来源:2025 年 8 月 18 日资料):

如何在 Nginx 中配置基于域名的虚拟主机实现多项目负载均衡
server {
    listen 192.168.78.132:80;
    server_name aaa.test.com;
    location / {
        proxy_pass http://www_server_pool;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

步骤四:配置同步与验证(负载均衡环境)

在多实例负载均衡环境中,配置必须统一同步(来源:2026 年 3 月 26 日资料):

  • 文件内容一致性:在所有节点执行 ssh node1 'sha256sum /etc/nginx/sites-enabled/*.conf' 比对摘要值
  • 语法有效性:批量运行 nginx -t,失败节点立即告警
  • 运行时加载状态:检查 nginx -T | grep "server_name example.com" 输出是否包含预期域名
  • HTTPS 证书路径可达性:确认私钥和证书文件权限为 600,SELinux 上下文无冲突

推荐同步方案:中小规模使用 Ansible Playbook,动态服务发现场景使用 Consul + consul-template,云原生架构使用 GitOps 工具(Argo CD / Flux)。

注意事项

1. 常见陷阱:同步后仍出现 502 或证书错误,往往是因为证书文件在每台机器上真实存在性、权限(600)、SELinux 上下文未统一校验(来源:2026 年 3 月 26 日资料)。

2. hosts 文件配置:测试时需修改本地 hosts 文件,Windows 系统路径为 C:\Windows\System32\drivers\etc,添加如 192.168.78.132 aaa.test.com 的映射(来源:2024 年 7 月 7 日资料)。

3. 端口冲突:Apache 默认端口 88,Tomcat 默认端口 8080,Nginx 默认端口 80,配置时需避免端口冲突(来源:2018 年 1 月 14 日资料)。

如何在 Nginx 中配置基于域名的虚拟主机实现多项目负载均衡

4. rewrite 执行顺序:先执行 server 下的 rewrite,再执行 location 匹配,最后执行 location 下的 rewrite。flag 参数中 last 表示完成 rewrite 后继续匹配新 location,break 表示终止匹配(来源:2024 年 5 月 21 日资料)。

5. 手动复制 conf 文件极易出错且无法审计,应建立单点可信配置源,所有配置文件纳入 Git 仓库,禁用直接编辑线上配置(来源:2026 年 3 月 26 日资料)。

参考来源

来源:技术博客 - Nginx 的配置、虚拟主机、负载均衡和反向代理 (2026 年 4 月 13 日)

来源:技术博客 - Nginx 中基于域名的虚拟主机在负载均衡环境下的配置同步 (2026 年 3 月 26 日)

来源:博客园 - Nginx 总结 (四) 基于域名的虚拟主机配置 (2024 年 7 月 7 日)

来源:技术博客 - Nginx 负载均衡简单配置【详解】(2024 年 8 月 19 日)