servername 仅用于匹配请求头中的 host 字段以选择虚拟主机,不参与负载均衡;必须与访问域名完全一致,配合 serveralias、proxypreservehost on 及独立 virtualhost 配置实现正确代理与后端路由。

ServerName 不参与负载均衡转发,只决定 Apache 用哪个虚拟主机响应请求。它本身不“解析代理传递的域名”,而是由客户端发起的 HTTP 请求头中的 Host 字段来匹配——Apache 拿这个 Host 值和每个 <virtualhost></virtualhost> 里的 ServerName(及 ServerAlias)比对,选中对应配置块执行后续指令(如 ProxyPass)。所以关键不是“让 ServerName 解析代理来的域名”,而是确保它写得准、配得全、用得对。
ServerName 必须与用户实际访问的域名完全一致
比如用户浏览器打开的是 https://app.example.com,那么对应虚拟主机的 ServerName 就必须写成:
-
ServerName app.example.com(不能写成 IP、localhost或泛域名*) - DNS 或本地
/etc/hosts要能将app.example.com解析到这台 Apache 服务器的 IP,否则连接根本建立不了 - 如果还支持
www.app.example.com,就得加ServerAlias www.app.example.com
多个域名需独立 VirtualHost + 各自 ServerName
不能在一个 <virtualhost></virtualhost> 里靠判断 Host 来分流。正确做法是为每个业务域名建一个虚拟主机:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
api.example.com→ 单独<virtualhost></virtualhost>,ServerName api.example.com,后端指向 API 集群 -
admin.example.com→ 另一个<virtualhost></virtualhost>,ServerName admin.example.com,后端指向管理后台 - 每个块内再配自己的
ProxyPass和balancer://规则
ProxyPreserveHost On 是保持 Host 头透传的关键
默认情况下,Apache 代理转发时会把原始 Host 头删掉,换成后端地址(如 192.168.1.10:8080),导致后端收不到真实域名。必须启用:
-
ProxyPreserveHost On—— 把客户端发来的Host: app.example.com原样传给后端 - 这对后端做虚拟主机路由、生成绝对 URL、日志记录域名都至关重要
- 该指令要放在
<virtualhost></virtualhost>块内,且在ProxyPass之前生效
负载均衡场景下,ServerName 还影响 ProxyPassReverse 和会话粘性
当使用 balancer:// 时:
-
ProxyPassReverse / balancer://mycluster/依赖ServerName的值来重写响应头中的Location、Set-Cookie等 URL,确保浏览器跳转或 Cookie 域名正确 - 若开启
stickysession=JSESSIONID,Apache 从 Cookie 提取 route 值并绑定节点,但前提是整个流程基于正确的ServerName匹配启动,否则虚拟主机都没进对,后续全失效










