如何使用 Apache 虛擬主機將特定埠連結到特定域?
我們有一個執行 Apache HTTP 伺服器的前向 linux 機器,它充當多個後端伺服器的反向代理。這些伺服器通過特定的域名和埠訪問,並在 Apache 中設置為虛擬主機,如下所示:
Listen 8001 Listen 8002 <Virtualhost *:8001> ServerName service.one.mycompany.com ProxyPass / http://internal.one.mycompany.com:8001/ ProxyPassReverse / http://internal.one.mycompany.com:8001/ RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] </Virtualhost> <Virtualhost *:8002> ServerName service.two.mycompany.com ProxyPass / http://internal.two.mycompany.com:8002/ ProxyPassReverse / http://internal.two.mycompany.com:8002/ RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] </Virtualhost>
代理伺服器只有一個 IP 地址,兩個域都指向它。通過 service.one 訪問 internal.one 可以正常工作,通過 service.two 訪問 internal.two 也是如此。
現在的問題是 Apache 在訪問虛擬主機時沒有考慮請求域。我的意思是兩個域都適用於兩個埠:對 service.one:8002 的請求是對 internal.two:8002 的代理,對 service.two:8001 的請求是對 internal.one:8001 的代理,理想情況下,這兩個請求都應該是否認。
我可以通過創建更多明確拒絕這些請求的虛擬主機來解決這個問題:
NameVirtualHost *:8001 NameVirtualHost *:8002 <Virtualhost *:8001> ServerName service.two.mycompany.com Redirect permanent / http://errorpage.mycompany.com/ </Virtualhost> <Virtualhost *:8002> ServerName service.one.mycompany.com Redirect permanent / http://errorpage.mycompany.com/ </Virtualhost>
但這不是一個理想的解決方案,因為我們計劃向代理添加更多服務,並且每個新埠都需要在所有其他域上被明確拒絕,並且每個新域都需要在所有埠上被明確拒絕不利用。隨著我們添加更多服務,虛擬主機的數量會很快失控。
那麼,我的問題是,是否有更好的方法?我們是否可以將特定埠顯式綁定到虛擬主機中的特定域,以便只處理該域-埠組合,而不處理所有其他組合?
我嘗試過的事情:
- 添加 NameVirtualHost *:8001 等,無需額外的虛擬主機。
- 設置 ProxyRequests On 和 Off,以及 ProxyPreserveHost On 和 Off
- 將伺服器名稱或 IP 地址添加到虛擬主機標頭,例如 <VirtualHost service.one.mycompany.com:8001>
- 在虛擬主機指令中使用 <proxy> 指令。
- 很多很多的Google搜尋。
代理伺服器執行 CentOS 6.2 64 位,Apache HTTPD 伺服器 2.2.15。如前所述,代理伺服器只有一個 IP 地址,我們使用的所有域都指向它。
Apache 總是需要給定埠的預設回退,這就是您現在所看到的。因此,即使伺服器名稱不匹配,它也是最後/唯一的手段。這就是為什麼將 000-default 包羅萬像作為標準的原因。
您可以
mod_rewrite
在 vhost 配置中使用顯式阻止/重定向任何不匹配的域。RewriteCond %{SERVER_NAME} !my.domain.com RewriteRule (.*)$ http://my.domain.com$1 [L,R=301]