ServerName仅用于虚拟主机路由匹配,不参与流量调度;真正实现负载均衡、灰度分流等需配合mod_proxy_balancer、mod_rewrite与ProxyPass等机制协同工作。

ServerName 本身不参与流量调度,它只是 Apache 配置中用于标识虚拟主机的逻辑名称,作用是匹配请求中的 Host 头,决定由哪个 <VirtualHost> 块处理该请求。真正实现流量调度(比如负载均衡、灰度分流、动静分离)需要配合其他机制,不能单靠 ServerName。
下面分几个关键场景说明怎么写和怎么配合:
ServerName 是虚拟主机路由的起点
Apache 通过 ServerName(和可选的 ServerAlias)判断“这个域名该交给谁处理”。例如:
<VirtualHost *:80>
ServerName app.example.com
ServerAlias www.example.com
DocumentRoot /var/www/app
</VirtualHost>
<VirtualHost *:80>
ServerName api.example.com
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>这里 ServerName 不做调度,只做请求分拣:浏览器访问 app.example.com 就走静态文件,访问 api.example.com 就反向代理到后端服务。
想做基于域名的流量调度?用 mod_proxy + ProxyPass 组合
比如把不同子域指向不同集群:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<VirtualHost *:80>
ServerName v1.example.com
ProxyPass / http://backend-v1/
ProxyPassReverse / http://backend-v1/
</VirtualHost>
<VirtualHost *:80>
ServerName v2.example.com
ProxyPass / http://backend-v2/
ProxyPassReverse / http://backend-v2/
</VirtualHost>前提是 backend-v1 和 backend-v2 已在 ProxyPass 的 BalancerMember 或 DNS/hosts 中定义好,或配合 mod_proxy_balancer 使用。
真正的负载均衡调度要靠 mod_proxy_balancer
ServerName 仍负责入口识别,调度逻辑在 ProxyPass 指向的 balancer:// 上:
<Proxy "balancer://mycluster">
BalancerMember http://192.168.1.10:8080 route=server1
BalancerMember http://192.168.1.11:8080 route=server2 loadfactor=2
ProxySet lbmethod=bytraffic
</Proxy>
<VirtualHost *:80>
ServerName app.example.com
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>-
lbmethod=bytraffic表示按流量权重调度 -
loadfactor=2让第二台机器多承接一倍请求 -
route=支持会话粘滞(配合JSESSIONID或 cookie)
如果要用 Apache 做灰度或条件分流,得结合 mod_rewrite
ServerName 可作为 RewriteCond 的一个判断维度,再配合 IP、Header、Cookie 等做精细化调度:
<VirtualHost *:80>
ServerName example.com
# 内部测试用户走新版本
RewriteEngine On
RewriteCond %{HTTP_COOKIE} version=new [NC]
RewriteRule ^/(.*)$ http://new-backend/$1 [P,L]
# 默认走老版本
ProxyPass / http://old-backend/
ProxyPassReverse / http://old-backend/
</VirtualHost>注意:[P] 标志表示使用 mod_proxy 转发,不是简单重定向。
小结关键点
-
ServerName是“谁来处理这个域名”的开关,不是调度器 - 流量分配靠
ProxyPass+balancer://或mod_rewrite+[P]实现 - 要支持健康检查、权重、会话保持,必须启用
mod_proxy、mod_proxy_balancer、mod_proxy_http等模块 - 生产环境建议搭配
mod_status查看 balancer 状态,或用BalancerManager页面管理
不复杂但容易忽略:ServerName 必须和 DNS 解析一致,否则 HTTPS 证书校验或反向代理 Host 头传递可能出问题。

















