Apache反向代理多目标配置失败求助
看起来你折腾好几天都没搞定这个反向代理,太闹心了!先从你给出的错误日志和配置来分析,咱们一步步找问题:
首先,错误日志里的Connection timed out是核心——这说明你的Apache服务器根本连不上后端VM的94.X.X.X对应的端口,虽然你从客户端能直接访问http://IP:PORT,但那是你的客户端和后端VM的连通性,不代表Apache所在的服务器能和后端VM打通。
第一步:先确认Apache服务器到后端VM的网络连通性
在Apache所在的服务器上,执行以下命令测试每个后端端口:
# 测试app1的端口 curl http://94.X.X.X:8082/app1 # 测试默认的8585端口 curl http://94.X.X.X:8585 # 依次测试app2、app3、app4的端口 curl http://94.X.X.X:8686/app2 curl http://94.X.X.X:8787/app3 curl http://94.X.X.X:8989/app4
如果这些命令都超时,那问题出在后端VM的防火墙规则——你可能只开放了自己客户端的IP访问这些端口,没开放Apache服务器的IP;或者是后端VM的路由设置有问题,导致它无法响应Apache服务器的请求。先把这个连通性问题解决,这是基础。
第二步:修正Apache配置里的细节问题
假设网络连通性没问题,你的配置还有几个小坑:
ProxyPassReverse的路径一致性:
你配置里的/app2和/app3的ProxyPassReverse末尾少了斜杠,比如:ProxyPassReverse /app2/ http://94.X.X.X:8686/app2 # 这里少了/应该改成和RewriteRule目标一致的路径:
ProxyPassReverse /app2/ http://94.X.X.X:8686/app2/ ProxyPassReverse /app3/ http://94.X.X.X:8787/app3/否则反向代理处理后端的重定向响应时,会出现路径错误。
推荐用ProxyPass替代RewriteRule的[P]标志:
用ProxyPass和ProxyPassReverse的组合比RewriteRule的[P]更直观,也更符合Apache反向代理的最佳实践,比如把你的RewriteRule替换成:ProxyPass /app1/ http://94.X.X.X:8082/app1/ ProxyPassReverse /app1/ http://94.X.X.X:8082/app1/ ProxyPass /app2/ http://94.X.X.X:8686/app2/ ProxyPassReverse /app2/ http://94.X.X.X:8686/app2/ ProxyPass /app3/ http://94.X.X.X:8787/app3/ ProxyPassReverse /app3/ http://94.X.X.X:8787/app3/ ProxyPass /app4/ http://94.X.X.X:8989/app4/ ProxyPassReverse /app4/ http://94.X.X.X:8989/app4/ # 默认路径转发到8585 ProxyPass / http://94.X.X.X:8585/ ProxyPassReverse / http://94.X.X.X:8585/这样配置更清晰,也不容易出错。
检查必要的Apache模块是否启用:
确保proxy和proxy_http模块已经启用,执行命令:a2enmod proxy proxy_http systemctl restart apache2虽然你的错误日志是连接超时,但模块没加载的话也会导致代理失效,确认一下没坏处。
HTTPS配置的缺失:
你在80端口的配置里做了永久跳转到HTTPS,但你没有给出443端口的VirtualHost配置。要记得在VirtualHost *:443里复制上述的代理规则,同时配置好SSL证书(比如用certbot生成Let's Encrypt证书),否则用户访问HTTPS时会没有代理规则,导致无法访问。
先按这个步骤排查,先解决网络连通性的问题,再修正配置细节,应该就能搞定了!
备注:内容来源于stack exchange,提问作者Dymas

