带有 httpd mod_proxy_balancer 的“没有对 URL 有效的协议处理程序”

Chr*_*ltz 8 reverse-proxy mod-proxy apache-2.4

我正在尝试为具有 localhost 静态资源副本的反向代理服务器设置故障转移,这些资源通常由内容管理系统提供服务。我曾经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>
Run Code Online (Sandbox Code Playgroud)

(在这里,我已经注释掉了进入真正 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
Run Code Online (Sandbox Code Playgroud)

但是当浏览器加载该图像时,我会收到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 在 URL 中有一个额外/site/的,所以我认为它被加倍了,因为我试图提供一个 URL 空间,包括/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的正常指令按预期工作(启用时)。

我确定这是我遗漏的一件相当简单的事情,但我似乎无法弄清楚。任何帮助将不胜感激。

Chr*_*ltz 16

脸掌

事实证明,我在ProxyPass指令中遗漏了一个斜杠:

ProxyPass "/site/" "balancer://cms"
Run Code Online (Sandbox Code Playgroud)

本来应该:

ProxyPass "/site/" "balancer://cms/"
Run Code Online (Sandbox Code Playgroud)

(注意引号前的斜杠。)

这从字面上固定了一切。

如果人们想将其关闭为“简单的印刷错误”,我很高兴删除此问题和答案,但我暂时将其保留。如果我得到一些这个答案的投票,我会删除此说明,并认为这是任何人谁可能犯同样的错误公共服务。


kuj*_*jiy 6

就我而言,我需要proxy_ajp模块。

a2enmod proxy proxy_http proxy_ajp 
Run Code Online (Sandbox Code Playgroud)

  • @kujiy `a2enmod proxy_http` 帮我解决了同样的问题,谢谢 :) (3认同)