/etc/hosts 中具有不同 IP 位址的多個主機名稱條目的預期行為是什麼?

/etc/hosts 中具有不同 IP 位址的多個主機名稱條目的預期行為是什麼?

我知道這已經被討論過 一些 地方,但似乎還沒有明確的答案 - 至少對於 RHEL 6 沒有。如何它正在工作,所以我可以挖掘一點。

簡潔版本:我有一個具有公用 IP 位址的 OpenVZ 主機節點,它充當一堆具有私人 IP 位址的 OpenVZ 容器的反向代理。我創建了 2 個具有相同名稱的容器(如果您想知道原因,請跳到下面的長版本),並且 HN 的 中也包含這些條目(以及其他條目)/etc/hosts

# Generated by make_clone.sh
10.0.0.130 testbackup.xxx.yy
10.0.0.131 testbackup.xxx.yy

我可以使用 OpenVZ 透過 ID 掛起/恢復這些主機中的任何一個,並且反向代理似乎神奇地將請求路由到正在運行的主機(例如 IP 位址10.0.0.130或 )10.0.0.131。在做這個? 是HN 的網路系統中的什麼嗎?應該根本不工作。需要明確的是,我在這裡並不是在尋找循環或負載平衡。只需簡單地手動從一個 OpenVZ 容器切換到另一個。

洛姆格版本:在設定一些腳本來建立和管理一系列 OpenVZ 容器時,我建立了一個名為 的腳本,make_clone.sh該腳本採用模板並建立一個新容器。此腳本採用 2 個參數 - 容器 ID 和所需的主機名稱。它所做的事情之一是10.0.0.*為容器分配一個新的 IP 位址並配置一些網絡,其中一個元素是將一個條目放入主機節點的/etc/hosts檔案中。

在測試這些容器的一些備份/還原腳本時,我想「假裝」一個特定的容器已經死亡,啟動另一個同名的容器並恢復備份。我只是vzctl stop 130將其脫機,而不是實際刪除原始容器。然後,我建立了一個 ID 為 131 但名稱相同的新容器。一旦啟動,我恢復了 MySQL 資料庫並檢查(透過瀏覽器)我是否可以訪問它 - 它正在運行 Joomla 並進行了一些自訂 - 一切都很好。

但後來我注意到在主機節點中/etc/hosts,我有這兩個條目(除其他外):

# Generated by make_clone.sh
10.0.0.130 testbackup.xxx.yy
10.0.0.131 testbackup.xxx.yy

主機節點也充當反向代理。只有主機節點具有外部 IP 位址,其 Apache 配置有效地將子網域對應到容器上。因此,除了 /etc/hosts 中的上述條目之外,httpd 配置中也有以下部分:

` 伺服器名稱 testbackup.xxx.yy

    ProxyRequests Off
    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyPass /server-status !
    ProxyPass / http://testbackup.xxx.yy/
    ProxyPassReverse / http://testbackup.xxx.yy/

    <Location />
            Order allow,deny
            Allow from all
    </Location>

`

在我描述的場景中,由於腳本的原因,它實際上會以其中 2 個部分結束,但它們是相同的 - 它通過主機名稱而不是 IP 引用容器,這讓我認為不是 Apache 本身在選擇“工作”容器。我現在可以瀏覽http://testbackup.xxx.yy/(顯然使用真實域名),Apache 似乎很樂意將請求路由到10.0.0.13010.0.0.131中的任何一個。我可以透過簡單地暫停/恢復 OpenVZ 容器來在它們之間進行切換。

我沒想到它能起作用——但它能起作用真是太好了。我的問題是,應該嗎?可以依靠嗎?或者這只是一個僥倖,當其他配置檔案中的任何一點內容被清理乾淨時,它就會停止工作?

答案1

由於主機可以有多個 IP 位址,因此您看到的是預期行為。這就像有多個暱稱,例如:bossman、haus、jungle-jim 等等……每個認識我的人都知道這些是我的暱稱(儘管它們實際上不是我的暱稱)。

除非您嘗試透過 IP 位址存取資源,否則您的系統應該像什麼都沒發生一樣運作。 (從技術上講,在容器上產生新的IP 位址不應該影響您的服務,只要這些服務不與IP 位址綁定即可。在您的情況下,您可能只是幸運地讓您的應用程式順利運行。

範例:我可以為一台主機指派 4 個 IP 位址:

10.0.0.130 testbackup.xxx.yy
10.0.0.131 testbackup.xxx.yy
10.0.0.132 testbackup.xxx.yy
10.0.0.133 testbackup.xxx.yy

範例1

所有這些IP位址都指向測試備份.xxx.yy,這意味著,如果我嘗試訪問測試備份.xxx.yy,我將訪問其中任何一個,具體取決於在我請求時哪個 IP 位址處於活動/回應狀態。同樣,只有當您嘗試存取的服務未專門綁定到該 IP 位址時,此方法才有效。

但是,如果您取下10.0.0.133,並且您嘗試存取該資源具體來說從 10.0.0.133 (即http://10.0.0.133/)開始你會得到一個錯誤。

更新:

如果您使用 Apache 虛擬主機:

<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example.com

# Other directives here

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example.org

# Other directives here

</VirtualHost>

此配置將允許兩個站點使用相同的 IP 位址和連接埠。如果這就是您設定 VirtualHosts 的方式,則 VirtualHosts 正在處理您的自動路由(ServerName理論上,如果您將兩個欄位列為同一主機)。

您表明您正在使用 OpenVZ。 OpenVZ 可能允許您的網站獨立運行,但實際上,它們都位於同一主機上。除非您為每個 VE 分配自己的主機名,並且您嘗試存取該主機名具體來說當網站關閉時,您將獲得網站啟動時的預期行為。

例如,如果您為 OpenVZ/IP 位址之一指派了不同的主機名稱:

10.0.0.133 mybackup.xxx.yy

如果您刪除10.0.0.133了,您將無法再從以下位置存取它mybackup.xxx.yy,但您可以從以下位置存取它testbackup.xxx.yy(因為它會通過仍處於活動狀態並與 關聯的其他 IP 位址testbackup.xxx.yy)。

在此輸入影像描述

相關內容