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