servername 是反向代理中匹配虚拟主机的关键字段,必须与用户访问域名一致(如 go.local),否则请求无法正确路由;需配合 serveralias、proxypreservehost on 及路径级 proxypass 实现多服务隔离与 host 头透传。

ServerName 必须与实际访问域名一致
用户浏览器访问 go.local,你就必须在对应 `ServerName go.local
不能写成 ServerName localhost 或 ServerName 127.0.0.1——否则 Apache 不会匹配该虚拟主机,请求可能被主站或默认虚拟主机接管,导致 404 或代理失效。
常见做法:
- 开发环境:在本地 hosts 文件添加映射(如
127.0.0.1 go.local node.local java.local) - 测试/生产环境:确保 DNS 解析指向运行 Apache 的服务器 IP
- 支持多域名时,可用
ServerAlias补充别名,例如:ServerName api.example.comServerAlias www.api.example.com
ServerName 和 ProxyPass 路径要协同设计
一个 `ServerName` 对应一组代理规则,路径前缀需明确区分不同服务,避免冲突。例如:
-
ServerName node.local→ 代理/api/到 Node.js(3000) -
ServerName go.local→ 代理/service/到 Go(8080) -
ServerName java.local→ 代理/app/到 Java(8081)
这样即使所有服务都跑在 localhost,也能靠域名 + 路径双重路由,互不干扰。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
不要遗漏 ProxyPreserveHost On
后端服务(尤其是 Node.js/Express、Spring Boot)常依赖 Host 请求头做路由或生成绝对链接。若不开启:
- 后端收到的 Host 是
localhost:3000,而非用户访问的node.local - 可能导致重定向错乱、静态资源 404、JWT issuer 校验失败等问题
务必在每个需要传递原始 Host 的 `
ProxyPreserveHost On
多个服务共用同一域名时,用路径区分
如果所有服务都走 example.com,就不用多个 `ServerName`,改用单一虚拟主机 + 多组 `ProxyPass`:
ProxyPass /api/ http://localhost:3000/api/ProxyPass /service/ http://localhost:8080/service/ProxyPass /admin/ http://localhost:8081/admin/- 注意:静态资源(
/static/、/images/)建议由 Apache 直接服务,不走代理










