Apache多租户域名隔离关键在于VirtualHost按域名精准分流、ProxyPreserveHost透传Host头、SSL配置中用ProxySet ssl_hostname=$http_host动态设置SNI,实现租户网络与实例隔离。
apache 反向代理处理多租户域名隔离,关键在于让不同租户域名(如 tenant-a.example.com、tenant-b.example.com)各自独立路由到对应后端服务,同时避免 sni 冲突、host 头错乱和证书误配。它不依赖应用层改代码,而靠 apache 的虚拟主机匹配 + 请求头透传 + tls 协商控制来实现。
用 VirtualHost 按域名精准分流
每个租户分配独立的 <VirtualHost> 块,通过 ServerName 或 ServerAlias 绑定其专属域名,确保请求一进来就被打到正确的配置段:
- 必须启用
NameVirtualHost *:443(Apache 2.4+ 默认开启,但需确认) - 每个块内写明
ServerName tenant-a.example.com,不可共用通配符或模糊匹配 - 后端地址可指向不同 IP、端口或内部服务名(如
http://tenant-a-api:8080),天然实现租户间网络与实例隔离
透传原始 Host 并禁用默认覆盖
租户识别常依赖 Host 头,若 Apache 自动重写为后端地址,后端就无法区分租户:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在每个 VirtualHost 中加
ProxyPreserveHost On,强制把客户端请求的 Host 值原样传给后端 - 避免手动写
ProxySetHeader Host ...覆盖该行为;如需额外头字段(如X-Tenant-ID),再单独添加 - 配合后端逻辑(如从 Host 解析租户名),即可跳过修改业务代码
HTTPS 场景下解决 SNI 和证书问题
当后端也是 HTTPS(如多租户 SaaS API 网关),Nginx 有 proxy_ssl_name,Apache 则靠 ProxyAddHeaders 和模块协同:
- 确保启用
mod_proxy_http和mod_ssl - 在 VirtualHost 的 SSL 配置段中,使用
ProxySet ssl=on显式声明上游为 HTTPS - 若后端按 SNI 选证(如单 IP 多域名证书),Apache 2.4.12+ 支持
ProxySet ssl_hostname=$http_host动态设置 SNI 值(等效于 Nginx 的proxy_ssl_name $host) - 必要时加
SSLProxyVerify none和SSLProxyCheckPeerCN off(仅限内网可信环境),绕过对后端证书 CN 的校验
统一入口 + 路径级租户路由(备选方案)
若无法为每个租户申请独立域名,也可用路径前缀隔离(如 example.com/tenant-a/):
- 用
ProxyPass /tenant-a/ http://tenant-a-api:8080/实现路径映射 - 搭配
ProxyPassReverse /tenant-a/ http://tenant-a-api:8080/重写响应头中的重定向与 Cookie 路径 - 注意:此方式需后端支持路径前缀(如 Spring Boot 的
server.servlet.context-path),且无法完全规避 Host 头歧义,适合开发或过渡阶段

















