我正在尝试为反向代理服务器设置故障转移,该服务器具有通常由内容管理系统提供的资源的本地主机静态副本。我曾经wget
抓取动态站点的静态副本以用于故障转移目的。
我尝试使用类似配置Apache 的 ProxyPass 指令的后备位置?开始做这件事,这相当简单,但我在标题中发现了错误。
这是我的(已清理的)代理配置:
DocumentRoot /var/www/www.example.com/htdocs
ProxyRequests Off
ProxyPreserveHost On
ProxyPass "/site/" "balancer://cms"
ProxyPassReverse "/site/" "balancer://cms"
ProxyPassReverse "/site/" "http://ip-10-1-1-229.ec2.internal/site/"
<Proxy "balancer://cms">
#BalancerMember "http://ip-10-1-1-229.ec2.internal/site/" loadfactor=1
# For localhost services, a backup of the CMS's site
BalancerMember "http://127.0.0.1/site-backup/www.example.com/site/" loadfactor=10 status=+H
</Proxy>
<Directory "/var/www/www.example.com/htdocs/site-backup">
Order allow,deny
Allow from all
Options Indexes FollowSymlinks
DirectoryIndex index.html
</Directory>
(在这里,我注释掉了进入真实 CMS 系统的平衡器成员——该部分运行良好——以便我可以测试本地的静态副本。)
中有一个index.html
文件/var/www/www.example.com/site-backup/www.example.com/
,当我尝试点击时它确实被加载http://www.example.com/site/
,但页面的其他资源(CSS、图像等)均未加载。它们在页面中的 URL 如下:
我有一个文件,foo.png
位于以下位置:
/var/www/www.example.com/htdocs/site-backup/www.example.com/site/sites/default/files/foo.png
但是当浏览器加载该图像时,我收到了响应500 Internal Server Error
,并且在 httpd 的错误日志中看到了以下内容:
[proxy:warn] [pid 3182:tid 2838395712] [client 71.127.40.115:38208] AH01144:没有对 URL /site/site/sites/default/files/foo.png 有效的协议处理程序。如果您使用的是 mod_proxy 的 DSO 版本,请确保使用 LoadModule 将代理子模块包含在配置中。,引用者:http://test.example.com/site/
我注意到错误消息中显示的 URL/site/
中有一个多余的内容,因此我认为它被加倍了,因为我试图/site/
从包含 和 的目录中提供包含的 URL 空间/site/
,wget
现在可能还不完美,所以我从 创建了一个符号链接/var/www/www.example.com/site-backups/www.example.com/site/site/sites
->
/var/www.www.example.com/site-backups/www.example.com/site/sites
。这应该已经解决了由于 URL 混淆而导致的任何愚蠢行为。
但这似乎并没有解决任何问题;mod_proxy
仍然在抱怨协议。mod_proxy_http
肯定已启用,因为ProxyPass
CMS 的正常指令按预期工作(启用时)。
我确信这是我忽略的一个相当简单的事情,但我似乎无法弄清楚。任何帮助都将不胜感激。
答案1
捂脸
事实证明,我的ProxyPass
指令中缺少一个尾部斜杠:
ProxyPass "/site/" "balancer://cms"
本来应该:
ProxyPass "/site/" "balancer://cms/"
(请注意结束引号前的斜杠。)
这确实解决了所有问题。
如果有人想以“简单的印刷错误”为由关闭此问题和答案,我很乐意删除它,但我现在会保留它。如果我得到一些向上对这个答案进行投票,我将删除此注释,并将其视为对任何可能犯同样错误的人的公共服务。
答案2
就我而言,我需要proxy_ajp
模块。
a2enmod proxy proxy_http proxy_ajp
答案3
与 kujiy 一样,我必须添加mod_ajp
。
我正在使用 apache4。
我的日志显示如下消息:
No protocol handler was valid for the URL /jira.
If you are using a DSO version of mod_proxy,
make sure the proxy submodules are included in
the configuration using LoadModule
因此我在 httpd.conf 中添加了(我是说取消注释)以下行:
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
保存,然后重新启动 apache 服务器。