46.4. 虛擬主機

虛擬主機一詞,是指 Apache 從相同一部實體電腦提供多個 URI (資源識別字串,Universal Resource Identifier)。這是指同時由一部實體電腦的單一網頁伺服器來執行多個領域 (例如,www.example.com 和 www.example.net)。

使用虛擬主機的目的,經常是為了節省管理工作 (只需要維護一部網頁伺服器) 和硬體成本花費 (不需要將各個領域安裝在特定伺服器)。虛擬主機可以使用名稱、IP 或是連接埠作為基礎。

虛擬主機可以透過 YaST 進行設定 (請參閱 預設主機),或是手動編輯 httpd.confVirtual Host 區段 (請參閱 節 46.3.2, "手動設定 Apache")。

依預設,在 SUSE Linux 中執行的 Apache,已經在 /etc/apache2/vhosts.d/ 準備好虛擬主機的組態檔案。這個目錄 (vhost.template) 也會提供虛擬主機的基本樣板。虛擬主機組態也可以加入到其他位置,例如加入到一個檔案,再接著將其包含到組態中。

[Important]重要

使用 httpd2 -S 指令,便可方便地檢查虛擬主機的設定。這個指令會輸出 Apache 可理解的虛擬主機設定,並協助您確認有得到預期結果。如果在執行 Apache 時有使用例如 -DSSL 的旗標,您就必須在測試時使用相同的旗標,例如 httpd2 -S -DSSL

46.4.1. 以名稱為基礎的虛擬主機

使用以名稱為基礎的虛擬主機時,每個 IP 位址可以為超過一個網站提供服務。Apache 會使用用戶端所傳送 HTTP 標題中的主機欄位,將其要求傳送連線到符合其中一個虛擬主機宣告的 ServerName 項目。如果沒有找到相符的 ServerName,就會預設使用第一個指定的 VirtualHost

NameVirtualHost 會啟動 Apache 組態的 Virtual Host (虛擬主機) 區段。

46.4.1.1. NameVirtualHost

NameVirtualHost 會判斷 Apache 網頁伺服器的所在 IP 位址,以及 (選擇性) 要用哪個連接埠來傾聽已在 HTTP 標題中包含領域名稱的用戶端要求。

第一個引數可以是完整領域名稱 (Fully Qualified Domain Name),但是建議最好使用 IP 位址。第二個引數是連接埠 (選擇性)。根據預設會使用連接埠 80,而且可以透過 Listen 指示詞 (網路設備選擇) 來設定。

IP 位址和連接埠號碼都可以使用萬用字元 *,來接收所有介面上的要求。IPv6 位址必須包在方括號中。

範例 46.8. 以名稱為基礎的 VirtualHost 項目變化

# NameVirtualHost IP-address[:Port]
NameVirtualHost 192.168.1.100:80
NameVirtualHost 192.168.1.100
NameVirtualHost *:80
NameVirtualHost *
NameVirtualHost [2002:c0a8:164::]:80
                

46.4.1.2. <VirtualHost></VirtualHost> 以名稱為基礎的內容

<VirtualHost></VirtualHost> 區塊包含了特定領域所套用的資訊。Apache 會使用這個區段所包含的指示詞,來接收已定義 VirtualHost 的用戶端要求。這裡也可以使用 VirtualHost 內容所允許的任何 Apache 指示詞。開啟 VirtualHost 標籤,就可採用以名稱為基礎之虛擬主機組態中的下列引數:

  • 先前使用 NameVirtualHost 指示詞所宣告的 IP 位址 (或是完整領域名稱)。

  • 先前使用 NameVirtualHost 指示詞所宣告的選擇性連接埠號碼。

允許使用萬用字元 * 作為 IP 位址的替代符號。這個語法只適用於在 NameVirtualHost * 結合使用萬用字元。如果是使用 IPv6 位址,該位址就必須用方括號包住。

範例 46.9. 以名稱為基礎的 VirtualHost 指示詞

<VirtualHost 192.168.1.100:80>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.1.100:80>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin webmaster@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>

<VirtualHost [2002:c0a8:164::]>
    # 2002:c0a8:164:: is the IPv6 equivalent to 192.168.1.100
    ServerName www.example.org
    DocumentRoot /srv/www/htdocs/example.org
    ServerAdmin webmaster@example.org
    ErrorLog /var/log/apache2/www.example.org-error_log
    CustomLog /var/log/apache2/www.example.org-access_log common
</VirtualHost>
                

在這個範例中,www.example.com 和 www.example.net 等領域,都是裝載在 IP 位址 192.168.1.100 的電腦上。所有傳入到網頁伺服器的要求,都會以第一個 VirtualHost 作為預設虛擬主機。

ErrorLog (已說明於 節 46.3.2.3.4, "ErrorLog 檔案 | "|指令" ") 與 CustomLog (請參閱 http://httpd.apache.org/docs-2.0/mod/mod_log_config.html#customlog) 等指示詞則不需要包含領域名稱。在此,使用您選擇的名稱。

46.4.2. 以 IP 為基礎的虛擬主機

這項替代虛擬主機組態方法需要為一台機器設定多個 IP。一個 Apache 例項可裝載多個領域,每個領域都會指定不同的 IP。

[Important]IP 位址與以 IP 為基礎的虛擬主機

實體伺服器必須為每部以 IP 為基礎的虛擬主機設定一個 IP 位址。當該電腦沒有安裝多張網路卡時,也可以使用虛擬網路介面 (IP 別名)。

46.4.2.1. 設定 IP 別名

如果要讓 Apache 裝載多個 IP,該實體電腦必須可以接受多個 IP 的要求。此稱為多重 IP 裝載。此外還必須啟動核心中的 IP 別名。這是 SUSE Linux 中的預設值。

當核心的 IP 別名設定好之後,就可以使用指令 ifconfigroute 來設定主機上的其他 IP。這些指令必須以 root 身份執行。

在下列範例中,我們假設已經主機已經將 IP 192.168.0.10 指定給網路設備 eth0。輸入指令 ifconfig,檢視主機 IP。使用下列的指令,可以新增其他 IP 位址:

ip addr add 192.168.0.20/24 dev eth0
ip addr add 192.168.0.30/24 dev eth0
            

所有 IP 位址都已指定給相同的實體網路設備 (eth0)。

46.4.2.2. <VirtualHost></VirtualHost> 以 IP 為基礎的內容

當系統設定好 IP 別名 (或者主機已經裝置多張網路卡) 之後,就可以設定 Apache。每部虛擬伺服器都必須具備個別的 VirtualHost 區塊。

下列範例將示範,Apache 正執行於 IP 192.168.1.10 的電腦上,其中還另外裝載了 IP 192.168.0.20192.168.0.30 的兩個領域。這個特殊範例只能應用於內部網路,因為從 192.168.0.0192.168.0.255 之間的 IP,不會傳送經過公用網際網路。

範例 46.10. 以 IP 為基礎的 VirtualHost 指示詞

<VirtualHost 192.168.0.20>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.0.30>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin tux@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>
                

這裡出現的 VirtualHost 指示詞,只能指定給 192.168.0.10 以外的其他介面。如果 192.168.0.10 也設定 Listen 指示詞 (已說明於 網路設備選擇),這時就必須建立以 IP 為基礎的個別虛擬伺服器,為該介面或是已套用在 /etc/apache2/httpd.confMain Server (主要伺服器) 區段所找到的指示詞 (請參閱 節 46.3.2.3, "在 /etc/apache2/httpd.conf: Main Server 區段中的 Apache 指示詞 ") 回應 HTTP 要求。