Apache下将两个子域名反向代理至单服务器的配置问题
解决Apache反向代理多子域名配置异常问题
我之前也踩过类似多子域名反向代理的坑,结合你的环境(三台Raspbian Stretch+Apache2.4服务器)来看,sub1正常但sub2异常,大概率是配置细节遗漏或者网络/虚拟主机匹配的问题,给你梳理几个排查和解决的方向:
第一步:检查服务器#1的sub2反向代理配置
先去服务器#1上找到sub2.otherdomain.com的虚拟主机配置文件(一般在/etc/apache2/sites-available/目录下),对比sub1的配置,重点核对以下几点:
ServerName是否准确设置为sub2.otherdomain.com,别写错了子域名- 必须加上
ProxyPreserveHost On,这条指令会把原始请求的Host头传递给后端的服务器#3,否则服务器#3可能会把请求匹配到默认虚拟主机(比如跳转到otherdomain.com) ProxyPass和ProxyPassReverse的目标地址是否正确指向服务器#3的IP,路径是否为/(如果不是根路径代理的话另说,但sub1正常的话应该是一致的)
正确的配置示例大概是这样:
<VirtualHost *:80> ServerName sub2.otherdomain.com # 关键:保留原始Host头传递给后端 ProxyPreserveHost On # 反向代理到服务器#3的IP ProxyPass / http://xxx.xxx.xxx.xxx/ ProxyPassReverse / http://xxx.xxx.xxx.xxx/ ErrorLog ${APACHE_LOG_DIR}/sub2.otherdomain.com-error.log CustomLog ${APACHE_LOG_DIR}/sub2.otherdomain.com-access.log combined </VirtualHost>
修改后记得重启Apache生效:sudo systemctl reload apache2
第二步:检查服务器#3的sub2虚拟主机配置
既然sub1在服务器#3上能正常运行,说明基础的proxy模块是启用的,但还是要确认sub2的虚拟主机配置没问题:
- 确认sub2的配置文件已经被启用:执行
sudo a2ensite sub2.otherdomain.com.conf(如果还没启用的话),然后重启Apache - 检查
ServerName是否准确设置为sub2.otherdomain.com,DocumentRoot是否指向正确的网站目录,权限是否配置正确(比如Require all granted) - 确保服务器#3上的Apache没有把sub2的请求误匹配到其他虚拟主机(比如otherdomain.com的配置),可以把sub2的虚拟主机配置放在其他配置文件的前面,或者给默认虚拟主机设置明确的
ServerName避免捕获其他请求
第三步:排查DNS和网络连通性
- 确认sub2.otherdomain.com的DNS解析是否正确指向服务器#1的IP,可以用
nslookup sub2.otherdomain.com或者dig sub2.otherdomain.com验证,别解析到服务器#2或者#3了 - 检查服务器#1和#3之间的网络是否通畅:在服务器#1上执行
curl http://服务器#3的IP,看能不能正常获取sub2网站的内容;如果不通,检查服务器#3的防火墙(比如ufw或者iptables)是否允许来自服务器#1的80端口(如果是HTTPS则是443端口)请求
第四步:查看日志定位具体错误
如果上面几步都没问题,就去看日志找线索:
- 服务器#1的sub2错误日志:
tail -f /var/log/apache2/sub2.otherdomain.com-error.log,看有没有代理连接失败、超时或者配置错误的提示 - 服务器#3的sub2访问日志和错误日志:
tail -f /var/log/apache2/sub2.otherdomain.com-access.log,看有没有收到来自服务器#1的请求;如果没收到,说明#1的代理配置有问题;如果收到了但返回错误码(比如404、500),再对应排查网站目录、权限或者程序问题
额外:如果用了HTTPS的注意事项
如果你的子域名用了HTTPS,还要补充检查:
- 服务器#1上的SSL虚拟主机要加上
SSLProxyEngine On,否则无法反向代理HTTPS请求 ProxyPass和ProxyPassReverse的目标地址要改成https://服务器#3的IP/- 确保服务器#3的SSL证书有效,或者在服务器#1上加上
SSLProxyVerify None(测试用,生产环境不建议)跳过证书验证
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

