Apache负载均衡器无法区分不同子域名,请求路由异常求助
Apache负载均衡器无法区分不同子域名,请求路由异常求助
Hi,我看了你的配置和问题描述,核心问题其实很明确——你的负载均衡器没有把客户端请求的Host头正确传递给后端服务器,导致后端Apache没法识别是哪个子域名的请求,最终都落到主站的配置上了。
问题根源
默认情况下,Apache反向代理会把请求的Host头替换成后端服务器的IP或主机名(比如你的172.16.111.10)。后端Apache收到这个Host头后,找不到对应的子域名VirtualHost配置,就会使用默认的主站配置(也就是/var/www/example),这就是为什么不管你访问哪个子域名,都返回主站内容。
解决方案
你只需要在所有涉及反向代理的VirtualHost块中添加ProxyPreserveHost On指令,这个指令会让负载均衡器把客户端实际请求的Host头(比如games.example.com)原样转发给后端服务器,这样后端就能正确匹配对应的子域名配置了。
修改后的主域名VirtualHost配置示例:
#Main domain <VirtualHost *:443> ServerAdmin webmaster@example.com ServerName www.example.com ServerAlias example.com ServerAdmin webmaster@localhost ProxyPreserveHost On # 新增这一行,关键! ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ <Location "/balancer-manager"> SetHandler balancer-manager Require host localhost </Location> <Location "/server-status"> SetHandler server-status Require host localhost </Location> </VirtualHost>
你的子域名VirtualHost已经加了ProxyPreserveHost On,保持不变即可。
额外验证步骤
- 确认必要模块已加载:运行
apache2ctl -M(Debian/Ubuntu)或httpd -M(RHEL/CentOS),检查是否存在proxy、proxy_http、proxy_balancer、slotmem_shm这些模块,没有的话需要启用它们。 - 重新加载Apache配置:修改完配置后,执行
systemctl reload apache2(或对应系统的重载命令),确保配置生效。 - 快速测试Host头传递:可以用
curl -H "Host: games.example.com" https://<负载均衡器IP>测试,看返回的内容是否是游戏站的内容,以此验证Host头是否正确传递。
备注:内容来源于stack exchange,提问作者Mohammed Yaseen Ahammed
相关产品推荐
相关产品推荐

