servername 不参与负载均衡但决定虚拟主机匹配、proxypassreverse 重写及会话粘性解析,必须设为真实可解析域名且唯一;配合 balancermember route 和后端 jvmroute 才能实现节点识别与 stickysession。

ServerName 本身不参与负载均衡逻辑,但它决定了 Apache 如何匹配请求、启用对应 <virtualhost></virtualhost> 块,并影响 ProxyPassReverse 的重写行为和会话粘性(如 stickysession)的正确解析。在负载均衡场景中,它必须与实际访问域名严格一致,且需配合后端节点路由机制使用。
ServerName 必须唯一且可解析
- 每个
<virtualhost></virtualhost>块中的ServerName应设为用户真实访问的域名(如app.example.com),不能写 IP 或泛域名*(除非配合ServerAlias显式声明别名)。 - DNS 或本地 hosts 必须能解析该域名到当前 Apache 服务器的 IP,否则浏览器无法建立连接或虚拟主机匹配失败。
- 若配置了多个负载均衡站点(如
api.example.com和admin.example.com),每个都需独立的<virtualhost></virtualhost>和对应的ServerName。
配合后端节点识别:route + jvmRoute 是关键
仅靠 ServerName 无法让后端知道“是谁转发来的请求”。真正实现节点识别和会话保持,依赖以下组合:
- 在
BalancerMember中显式指定route=参数(如route=worker1) - 后端 Tomcat 的
server.xml中<engine></engine>标签设置jvmRoute="worker1" - 前端
ProxyPass启用stickysession=JSESSIONID|PHPSESSID,Apache 会自动从 Cookie 提取route值并只转发给匹配节点
示例片段:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName api.example.com
<proxy balancer:>
BalancerMember http://192.168.1.10:8080 route=worker1
BalancerMember http://192.168.1.11:8080 route=worker2
ProxySet stickysession=JSESSIONID|jsessionid
</proxy>
ProxyPass / balancer://api_cluster/
ProxyPassReverse / balancer://api_cluster/
</virtualhost>
不要混淆 ServerName 和后端地址
-
ServerName api.example.com是客户端访问入口,不是后端服务地址。 - 后端地址(如
http://192.168.1.10:8080)应是内网可达的 IP+端口,无需可公开解析。 - 若后端也用域名(如
backend1.internal),确保 Apache 服务器能 DNS 解析它,否则加/etc/hosts映射。
多域名共用同一集群时的写法
如果 site-a.com 和 site-b.com 共享同一组后端,但需隔离路径或 Header,可分别定义 ServerName,复用同一 balancer:// 名(只要 <proxy></proxy> 块内容一致):
<virtualhost>
ServerName site-a.com
ProxyPass /api/ balancer://shared_api/
ProxyPassReverse /api/ balancer://shared_api/
</virtualhost><virtualhost>
ServerName site-b.com
ProxyPass /v2/ balancer://shared_api/
ProxyPassReverse /v2/ balancer://shared_api/
</virtualhost>
# 全局或任一 VirtualHost 内定义一次即可
<proxy balancer:>
BalancerMember http://10.0.1.10:8080 route=node1
BalancerMember http://10.0.1.11:8080 route=node2
</proxy>
注意:<proxy></proxy> 块放在哪个 <virtualhost></virtualhost> 内,作用域就限于该块;若需跨虚拟主机复用,建议放在主配置文件或 conf.d/ 公共 include 文件中,避免重复定义。









