我希望有人能夠闡明這個我在其他地方沒有運氣解決的問題。我們正在運行一個用於基本負載平衡的 Apache (2.2.15) 伺服器,但最終對我們的各種後端伺服器使用 ProxyPass 指令。
問題似乎是 Apache “隨機”不再正確加載特定的虛擬主機檔案(或者更可能的是,我們在不知不覺中導致了這種情況),並且我們看到來自 Apache 的 404 或代理錯誤。
error_log 中沒有錯誤,我還確認 httpd -S 仍然顯示已加載的虛擬主機,但奇怪的是,如果我發出 httpd 重新加載,它會再次開始工作。伺服器有 ~2GB 可用記憶體。
我們的httpd.conf 檔案中有一個Include vhosts/active 指令,並且在該目錄中是指向實際虛擬主機設定檔的符號連結(不要相信這是相關的,但想透露),並且我們正在加載大約40 個不同的虛擬主機配置。以下是一個相對頻繁發生的範例(也值得一提的是,它似乎只是像這樣的某些虛擬主機檔案):
<VirtualHost 10.10.0.77:80>
ServerName url.mysite.com
ServerAlias url
Options +FollowSymLinks
ProxyPreserveHost On
ProxyPass / http://hostname.internaldomain.local:8081/
ProxyPassReverse / http://hostname.internaldomain.local:8081/
</VirtualHost>
<VirtualHost 10.10.0.77:443>
ServerName url.mysite.com
ServerAlias url
RewriteEngine On
SSLEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLCertificateFile /etc/httpd/conf/ssl/mycert.com.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/mycert.key
SSLCertificateChainFile /etc/httpd/conf/ssl/mycert_chain.crt
Options +FollowSymLinks
ProxyPreserveHost On
ProxyPass / http://hostname.internaldomain.local:8081/
ProxyPassReverse / http://hostname.internaldomain.local:8081/
</VirtualHost>
來自httpd.conf:
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
Include vhosts/active/*.active
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from .mydomain.com
</Location>
<IfModule mod_headers.c>
RequestHeader unset Expect early
</IfModule>
感謝您的幫助/想法,因為搜尋這個特定問題對我毫無幫助!
答案1
我發現有兩個可能的原因:
當 Apache 2.2 嘗試載入 ProxyPass url 後面的內容且它沒有回應時,有時會使用此 ProxyPass 的整個虛擬主機機會停止運作。在 Debian Squeeze 和 Wheezy 上使用預設 Apache 2.2 進行了測試。
您的伺服器也可能遇到 DNS 解析器的隨機問題,這會影響 ServerName 到虛擬主機的對應。
您可以嘗試透過 IP 而不是 ServerName 載入 10.10.0.77:80 來測試是否是第一個原因。