虛擬主機(jī)是一種在單個服務(wù)器(或服務(wù)器池)上托管多個域名(對每個名稱進(jìn)行單獨(dú)處理)的方法。這允許一臺服務(wù)器共享其資源,例如內(nèi)存和處理器周期,而無需提供的所有服務(wù)都使用相同的主機(jī)名。術(shù)語虛擬主機(jī)通常用于指代Web 服務(wù)器,但其原理確實(shí)適用于其他Internet服務(wù)。
一種廣泛使用的應(yīng)用程序是共享網(wǎng)絡(luò)托管。共享網(wǎng)絡(luò)托管的價格低于專用網(wǎng)絡(luò)服務(wù)器的價格,因為可以在單個服務(wù)器上托管許多客戶。單個實(shí)體希望在同一臺機(jī)器上使用多個名稱也很常見,這樣名稱就可以反映所提供的服務(wù),而不是這些服務(wù)的托管位置。
有兩種主要類型的虛擬主機(jī),基于名稱和基于 IP。基于名稱的虛擬主機(jī)使用客戶端提供的主機(jī)名。這節(jié)省了 IP 地址和相關(guān)的管理開銷,但所服務(wù)的協(xié)議必須在適當(dāng)?shù)狞c(diǎn)提供主機(jī)名。特別是,將基于名稱的虛擬主機(jī)與SSL/TLS一起使用存在很大的困難。基于 IP 的虛擬主機(jī)為每個主機(jī)名使用單獨(dú)的IP 地址,它可以使用任何協(xié)議執(zhí)行,但需要為每個服務(wù)的域名提供一個專用的 IP 地址。基于端口的虛擬主機(jī)原則上也是可以的,但在實(shí)踐中很少使用,因為它對用戶不友好。
可以組合基于名稱和基于 IP 的虛擬主機(jī):一臺服務(wù)器可能有多個 IP 地址,并在這些 IP 地址的部分或全部上提供多個名稱。在將 SSL/TLS 與通配符證書一起使用時,此技術(shù)非常有用。
基于名稱的虛擬主機(jī)對同一個IP 地址使用多個主機(jī)名。
基于名稱的虛擬主機(jī)所需的技術(shù)先決條件是具有HTTP /1.1 支持(今天很常見)的 Web 瀏覽器,以在請求中包含目標(biāo)主機(jī)名。這允許在一個 IP 地址后托管多個站點(diǎn)的服務(wù)器提供正確的站點(diǎn)內(nèi)容。更具體地說,它意味著設(shè)置Host HTTP header,這在 HTTP/1.1 中是強(qiáng)制性的。
例如,服務(wù)器可能正在接收對兩個域的請求,www.example.com和www.example.net,這兩個域都解析為相同的 IP 地址。對于www.example.com,服務(wù)器將從目錄/var/www/user/Joe/site/發(fā)送HTML 文件,而對www.example.net 的請求將使服務(wù)器提供來自/var/www/user 的頁面/瑪麗/網(wǎng)站/。同一域的兩個子域可以托管在一起。例如,博客服務(wù)器可能同時托管 blog1.example.com 和 blog2.example.com。
基于名稱的虛擬主機(jī)的最大問題是難以托管多個運(yùn)行SSL/TLS 的安全網(wǎng)站。因為 SSL/TLS握手發(fā)生在將預(yù)期的主機(jī)名發(fā)送到服務(wù)器之前,服務(wù)器不知道在握手中提供哪個證書。單個證書可以通過“主題名稱”字段或通配符覆蓋多個名稱,但這種方法的實(shí)際應(yīng)用受到管理考慮和通配符匹配規(guī)則的限制。TLS 有一個擴(kuò)展名為Server Name Indication,它在握手開始時顯示名稱以規(guī)避該問題,除了一些較舊的客戶端(特別是Internet Explorer在未實(shí)現(xiàn)SNI 的Windows XP或更舊的Android版本上)。
此外,如果域名系統(tǒng)(DNS) 不能正常運(yùn)行,即使 IP 地址已知,也很難訪問虛擬托管的網(wǎng)站。如果用戶嘗試回退到使用 IP 地址聯(lián)系系統(tǒng),如http://10.23.45.67/,Web 瀏覽器將發(fā)送 IP 地址作為主機(jī)名。由于 Web 服務(wù)器依賴 Web 瀏覽器客戶端告訴它要使用的服務(wù)器名稱 (vhost),因此服務(wù)器將使用默認(rèn)網(wǎng)站進(jìn)行響應(yīng)——通常不是用戶期望的網(wǎng)站。
這種情況下的解決方法是將 IP 地址和主機(jī)名添加到客戶端系統(tǒng)的hosts 文件中。使用域名訪問服務(wù)器應(yīng)該可以再次工作。但是,用戶在執(zhí)行此操作時應(yīng)小心,因為對主機(jī)名和 IP 地址之間的真實(shí)映射所做的任何更改都將被本地設(shè)置覆蓋。這種變通方法對于普通的網(wǎng)絡(luò)用戶來說并不是很有用,但在修復(fù) DNS 記錄時可能對站點(diǎn)管理員有一些用處。
基于 IP
當(dāng)使用基于 IP 的虛擬主機(jī)時,每個站點(diǎn)(一個 DNS 主機(jī)名或一組作用相同的 DNS 主機(jī)名)指向一個唯一的 IP 地址。webserver配置了多個物理網(wǎng)絡(luò)接口,同一物理接口上配置了虛擬網(wǎng)絡(luò)接口,或者一個接口上配置了多個IP地址。Web 服務(wù)器可以為每個 IP 地址打開單獨(dú)的偵聽套接字,也可以使用單個套接字偵聽所有接口,并在接受連接后獲取接收 TCP 連接的 IP 地址。無論哪種方式,它都可以使用 IP 地址來確定要提供服務(wù)的網(wǎng)站。客戶端不參與此過程,因此(與基于名稱的虛擬主機(jī)不同)不存在兼容性問題。這種方法的缺點(diǎn)是服務(wù)器需要為每個網(wǎng)站使用不同的 IP 地址。這增加了管理開銷(既向服務(wù)器分配地址,又向互聯(lián)網(wǎng)注冊機(jī)構(gòu)證明使用這些地址的合理性)并導(dǎo)致IPv4 地址耗盡。
基于端口
HTTP 的默認(rèn)端口號是 80。但是,大多數(shù) Web 服務(wù)器都可以配置為在幾乎任何端口號上運(yùn)行,前提是該端口號未被服務(wù)器上的任何其他程序使用。有需要特殊配置的HTTP Secure特殊端口 443(請參閱服務(wù)器名稱指示)。基于端口的網(wǎng)站明確綁定到唯一的端口號和 IP 地址。在這種情況下,IP 地址用于托管多個網(wǎng)站。用于公共 IP 地址的唯一端口號將單個網(wǎng)站與綁定到同一 IP 地址的其他網(wǎng)站區(qū)分開來。
用途
虛擬網(wǎng)絡(luò)托管通常在商業(yè)模式是為客戶提供低成本網(wǎng)站托管的公司中大規(guī)模使用。全球絕大多數(shù)網(wǎng)絡(luò)托管服務(wù)客戶網(wǎng)站都托管在共享服務(wù)器上,使用虛擬托管技術(shù)。許多企業(yè)將虛擬服務(wù)器用于內(nèi)部目的,其中出于技術(shù)或管理原因運(yùn)營多個獨(dú)立的網(wǎng)站,例如客戶外聯(lián)網(wǎng)網(wǎng)站、員工外聯(lián)網(wǎng)、內(nèi)部內(nèi)聯(lián)網(wǎng)和不同部門的內(nèi)聯(lián)網(wǎng)。如果網(wǎng)站架構(gòu)沒有安全問題,可以使用虛擬主機(jī)技術(shù)將它們合并到單個服務(wù)器中,從而減少管理和管理開銷以及支持業(yè)務(wù)所需的獨(dú)立服務(wù)器的數(shù)量。