Apache-2.4

“沒有對 URL 有效的協議處理程序”與 httpd mod_proxy_balancer

  • March 3, 2020

我正在嘗試為具有本地主機靜態資源副本的反向代理伺服器設置故障轉移,這些資源通常由內容管理系統提供服務。我曾經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 在 URL 中有一個額外/site/的 URL,所以我認為它正在增加一倍,因為我正在嘗試提供一個 URL 空間,包括/site/來自包含的目錄,/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 的正常指令按預期工作(啟用時)。

我確定這是我想念的一個相當簡單的事情,但我似乎無法弄清楚。任何幫助將不勝感激。

掌心

ProxyPass事實證明,我的指令中缺少一個斜杠:

ProxyPass "/site/" "balancer://cms"

本來應該:

ProxyPass "/site/" "balancer://cms/"

(注意右引號前的斜杠。)

這從字面上解決了一切。

如果人們想將它作為“簡單的印刷錯誤”關閉,我很樂意刪除這個問題和答案,但我暫時先保留它。如果我對此答案投贊成票,我將刪除此註釋並將其視為任何可能犯相同錯誤的人的公共服務。

引用自:https://serverfault.com/questions/773449