Linux

如何使用 Apache 虛擬主機將特定埠連結到特定域?

  • June 27, 2012

我們有一個執行 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]

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