使用 httpd mod_proxy_balancer 时出现“没有适用于该 URL 的协议处理程序”

使用 httpd mod_proxy_balancer 时出现“没有适用于该 URL 的协议处理程序”

我正在尝试为反向代理服务器设置故障转移,该服务器具有通常由内容管理系统提供的资源的本地主机静态副本。我曾经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肯定已启用,因为ProxyPassCMS 的正常指令按预期工作(启用时)。

我确信这是我忽略的一个相当简单的事情,但我似乎无法弄清楚。任何帮助都将不胜感激。

答案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 服务器。

相关内容