apache shenyu 网关不支持也不使用 apache http server 的 virtualhost 配置;其“类虚拟主机”功能需通过内置 host 条件路由实现,配合域名匹配插件完成按 host 头的流量分发。

微服务网关(如 Apache ShenYu)和 Apache HTTP Server 的虚拟主机(VirtualHost)是两类完全不同的东西,不能混用,也不需要配。
Apache ShenYu 是一个API 网关,基于 Netty 构建,用于路由、鉴权、限流等微服务治理;
而 Apache HTTP Server(常简称 Apache)是一个传统 Web 服务器,它的 VirtualHost 是用来托管多个网站(多域名/多端口/多IP)的机制。
所以——
✅ ShenYu 网关本身不使用、也不支持 Apache 的 VirtualHost 配置。
❌ 你不需要、也不能在 ShenYu 里写 <virtualhost></virtualhost> 这类配置。
那微服务场景下,“类似虚拟主机”的需求(比如按域名路由到不同后端服务)该怎么实现?答案是:用 ShenYu 的路由规则 + 域名匹配插件。
域名级流量分发:用 ShenYu 实现“类虚拟主机”效果
ShenYu 支持通过 Host 请求头做条件路由,相当于用域名区分服务,效果接近 Apache 的基于名称的 VirtualHost。
1. 启用 Host 匹配插件
确保 sign, rewrite, proxy 插件已启用,并确认 host 条件匹配功能可用(ShenYu 2.6+ 默认支持)。
2. 配置路由规则(以 YAML 或 Admin UI 设置)
shenyu:
route:
rules:
- id: service-a-by-domain
name: route to service-a via a.example.com
enabled: true
condition: "&& {#host == 'a.example.com'}"
selectorId: "selector-a-id"
upstreamUrl: http://service-a:8080
- id: service-b-by-domain
name: route to service-b via b.example.com
enabled: true
condition: "&& {#host == 'b.example.com'}"
selectorId: "selector-b-id"
upstreamUrl: http://service-b:8080
✅ 这里
#host是 ShenYu 内置的上下文变量,取自 HTTP 请求头中的Host字段。
✅ 所有请求先经过 ShenYu,它根据Host值决定转发到哪个后端服务,无需 Apache 参与。
3. 配合反向代理(可选但推荐)
实际部署中,通常把 ShenYu 放在 Nginx/Apache 后面,由它们处理 HTTPS 终结、静态资源、负载均衡等:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
用户 → [Nginx] → (HTTPS/SSL) → [ShenYu] → (HTTP 路由) → [微服务]
↑
Nginx 可配 VirtualHost:
server_name a.example.com;
proxy_pass http://shenyu:9195;
server_name b.example.com;
proxy_pass http://shenyu:9195;
此时 Apache/Nginx 才真正用 VirtualHost,只负责“把不同域名的请求统一打到 ShenYu”,真正的服务路由由 ShenYu 完成。
如果你真想用 Apache 做前置网关(不推荐但可行)
仅当 ShenYu 未接入、或你坚持用 Apache 做简单路由时,可这样模拟:
<virtualhost> ServerName a.example.com ProxyPreserveHost On ProxyPass / http://shenyu-server:9195/ ProxyPassReverse / http://shenyu-server:9195/ </virtualhost><virtualhost> ServerName b.example.com ProxyPreserveHost On ProxyPass / http://shenyu-server:9195/ ProxyPassReverse / http://shenyu-server:9195/ </virtualhost>
⚠️ 注意:这只是 Apache 把请求转给 ShenYu,不是 ShenYu 自身支持 VirtualHost,且丧失了 ShenYu 的动态路由、插件能力。
总结关键点
- Apache VirtualHost 是 Web 服务器特性,ShenYu 是独立网关,二者无从属关系;
- 微服务中“按域名分发”应通过 ShenYu 的
host条件路由实现; - 若需 HTTPS、WAF、静态文件等,建议用 Nginx/Apache 做前置反代,再连 ShenYu;
- 不要试图在 ShenYu 配置文件里写
<virtualhost></virtualhost>——它根本不会识别。
不复杂,但容易忽略这个根本区别。










