虛擬主機(Virtual Host)入門指南:讓你的網站輕鬆上線

最後更新:2025年3月13日
架構

當你準備架設網站時,第一步通常是選擇合適的伺服器環境。

然而,對於剛接觸網站架設的初學者來說,「虛擬主機」(Virtual Host) 這個名詞可能會讓人困惑。

本篇文章將深入探討虛擬主機的概念,解釋其運作方式,以及如何設定虛擬主機,讓你對這項技術有更清楚的認識,順利架設屬於自己的網站。


什麼是虛擬主機(Virtual Host)?

虛擬主機(Virtual Host) 是一種技術,允許 在同一台實體伺服器上運行多個網站,每個網站可以擁有獨立的網域名稱、設定和檔案資料夾,而彼此不會互相影響。

在一台實體伺服器上,透過「虛擬主機」技術,可以設定多個網站,這些網站雖然共用伺服器的硬體資源,但從外部訪問時,使用者會覺得這些網站是獨立存在的。

例如:

  • example1.comexample2.comblog.example3.com 可以都託管在同一台伺服器上,但訪客不會察覺它們其實來自相同的機器。

🔹 舉例說明

想像一棟公寓(伺服器),每個房間(虛擬主機)由不同的住戶(網站)租住。

雖然這些住戶共用同一棟建築(伺服器資源),但每間房間都有自己的門牌號碼(網域名稱)和內部設計(網站內容),互不干擾。


虛擬主機的類型

根據不同的運作方式,虛擬主機可以分為以下兩大類型:

基於 IP 的虛擬主機(IP-based Virtual Host)

🔹 運作原理

基於 IP 的虛擬主機 中,每個網站擁有獨立的 IP 地址,伺服器會根據訪客請求的 IP 來決定要顯示哪個網站的內容。

這意味著,每個網站都被指派了一個獨立的 IP,而不與其他網站共用同一個 IP。

當訪客輸入網站網址時,DNS 解析系統會將網域名稱解析成對應的 IP 地址,然後瀏覽器會向這個 IP 地址發送請求。

伺服器收到請求後,會根據 IP 來識別並回應對應的網站內容。

flowchart TD
    subgraph "網際網路"
        Client1[用戶 1] 
        Client2[用戶 2]
        Client3[用戶 3]
    end

    subgraph "單一實體伺服器"
        subgraph "網路層"
            IP1["伺服器 IP 地址: 192.168.1.10"] 
            IP2["伺服器 IP 地址: 192.168.1.20"]
            IP3["伺服器 IP 地址: 192.168.1.30"]
        end
        
        subgraph "應用層"
            Server["Web 伺服器<br>(Apache/Nginx)"]
            VH1["虛擬主機 1<br>www\.example1\.com"]
            VH2["虛擬主機 2<br>www\.example2\.com"]
            VH3["虛擬主機 3<br>www\.example3\.com"]
        end
        
        subgraph "檔案系統"
            Dir1["/var/www/html/example1"]
            Dir2["/var/www/html/example2"]
            Dir3["/var/www/html/example3"]
        end
    end
    
    %% 連接關係
    Client1 -->|"HTTP 請求到<br>192.168.1.10"| IP1
    Client2 -->|"HTTP 請求到<br>192.168.1.20"| IP2
    Client3 -->|"HTTP 請求到<br>192.168.1.30"| IP3
    
    IP1 --> Server
    IP2 --> Server
    IP3 --> Server
    
    Server -->|"基於接收IP<br>192.168.1.10"| VH1
    Server -->|"基於接收IP<br>192.168.1.20"| VH2
    Server -->|"基於接收IP<br>192.168.1.30"| VH3
    
    VH1 --> Dir1
    VH2 --> Dir2
    VH3 --> Dir3
    
    %% 樣式設定
    classDef client fill:#FFB6C1,stroke:#333,stroke-width:2px
    classDef ip fill:#FFA07A,stroke:#333,stroke-width:2px
    classDef server fill:#F0E68C,stroke:#333,stroke-width:2px
    classDef vhost fill:#98FB98,stroke:#333,stroke-width:2px
    classDef dir fill:#87CEFA,stroke:#333,stroke-width:2px
    classDef note fill:#FFFACD,stroke:#333,stroke-width:1px,font-size:14px
    
    %% 應用樣式
    class Client1,Client2,Client3 client
    class IP1,IP2,IP3 ip
    class Server server
    class VH1,VH2,VH3 vhost
    class Dir1,Dir2,Dir3 dir
    class note1 note

🔹 主要特點

每個網站擁有獨立 IP,不會與其他網站共用相同 IP。
適用於需要獨立 SSL 憑證(Secure Socket Layer) 的網站,確保 HTTPS 安全連線。
不受共享 IP 限制,可用於需要特殊伺服器設定的應用,例如需要綁定特定 IP 來進行 API 認證的服務。
相對較貴,因為每個網站都需要一個獨立的 IP 地址,IP 資源有限且可能需額外付費購買。

📌 適合情境

高安全性需求的網站(如電子商務、金融服務、政府機構網站)
企業級應用(需要獨立 IP 來設定安全性策略)
需要獨立 SSL 憑證的網站(如支付平台、銀行網站)
伺服器需要特殊設定的應用(如 API 服務、郵件伺服器)

🔹 設定範例(Apache)

假設我們有兩個網站,site1.com(IP:192.168.1.100)和 site2.com(IP:192.168.1.101),我們可以設定 Apache 來使用 IP-based 虛擬主機:

<VirtualHost 192.168.1.100:80>
    ServerName site1.com
    DocumentRoot /var/www/site1
</VirtualHost>

<VirtualHost 192.168.1.101:80>
    ServerName site2.com
    DocumentRoot /var/www/site2
</VirtualHost>

這樣,當用戶訪問 192.168.1.100 時,會進入 site1.com,而訪問 192.168.1.101 則會進入 site2.com

基於名稱的虛擬主機(Name-based Virtual Host)

🔹 運作原理

基於名稱的虛擬主機 中,多個網站共用同一個 IP 地址,但透過 網域名稱(Host Header) 來區分不同的網站。

當瀏覽器發送請求時,會在 Host 標頭中包含所請求的網域名稱,伺服器會根據這個資訊來決定應該提供哪個網站的內容。

這種方式最適合大多數共享主機服務,因為它能夠有效利用有限的 IP 資源,允許成千上萬個網站共享相同的伺服器和 IP。

flowchart TD
    subgraph "網際網路"
        Client1[用戶 1] 
        Client2[用戶 2]
        Client3[用戶 3]
    end

    subgraph "單一實體伺服器"
        subgraph "網路層"
            IP["單一伺服器 IP 地址: 192.168.1.10"] 
        end
        
        subgraph "應用層"
            Server["Web 伺服器<br>(Apache/Nginx)"]
            VH1["虛擬主機 1<br>www\.example1\.com"]
            VH2["虛擬主機 2<br>www\.example2\.com"]
            VH3["虛擬主機 3<br>www\.example3\.com"]
        end
        
        subgraph "檔案系統"
            Dir1["/var/www/html/example1"]
            Dir2["/var/www/html/example2"]
            Dir3["/var/www/html/example3"]
        end
    end
    
    %% 連接關係
    Client1 -->|"HTTP 請求到 192.168.1.10<br>Host: www\.example1\.com"| IP
    Client2 -->|"HTTP 請求到 192.168.1.10<br>Host: www\.example2\.com"| IP
    Client3 -->|"HTTP 請求到 192.168.1.10<br>Host: www\.example3\.com"| IP
    
    IP --> Server
    
    Server -->|"檢查 Host 頭<br>www\.example1\.com"| VH1
    Server -->|"檢查 Host 頭<br>www\.example2\.com"| VH2
    Server -->|"檢查 Host 頭<br>www\.example3\.com"| VH3
    
    VH1 --> Dir1
    VH2 --> Dir2
    VH3 --> Dir3
        
    %% 樣式設定
    classDef client fill:#FFB6C1,stroke:#333,stroke-width:2px
    classDef ip fill:#FFA07A,stroke:#333,stroke-width:2px
    classDef server fill:#F0E68C,stroke:#333,stroke-width:2px
    classDef vhost fill:#98FB98,stroke:#333,stroke-width:2px
    classDef dir fill:#87CEFA,stroke:#333,stroke-width:2px
    classDef note fill:#FFFACD,stroke:#333,stroke-width:1px,font-size:14px
    
    %% 應用樣式
    class Client1,Client2,Client3 client
    class IP ip
    class Server server
    class VH1,VH2,VH3 vhost
    class Dir1,Dir2,Dir3 dir
    class note1 note

🔹 主要特點

多個網站共用同一個 IP,節省 IP 資源,降低成本。
適用於大多數網站,特別是個人網站、部落格、小型企業網站等。
管理簡單,不需要為每個網站額外分配 IP。
共享 SSL 需要 SNI(Server Name Indication)技術支援,否則每個網站無法擁有獨立的 HTTPS 憑證(較舊的瀏覽器可能不支援)。

📌 適合情境

個人網站、部落格(如 WordPress、Medium 部落格)
企業形象網站(如公司官網、小型商業網站)
新聞網站(如技術部落格、媒體新聞平台)
共享主機服務(Shared Hosting)(大量客戶共用同一伺服器)

🔹 設定範例(Apache)

假設 example1.comexample2.com 共用同一個 IP 地址(192.168.1.100),我們可以設定 Apache 來使用基於名稱的虛擬主機:

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

<VirtualHost *:80>
    ServerName example2.com
    DocumentRoot /var/www/example2
</VirtualHost>

這樣,當用戶訪問 example1.com 時,會進入 /var/www/example1,而訪問 example2.com 則會進入 /var/www/example2,即使它們共用同一個 IP 地址。

基於 IP vs. 基於名稱的虛擬主機:比較總結

基於 IP 的虛擬主機(IP-based)每個網站使用不同的 IP
基於名稱的虛擬主機(Name-based)多個網站共用同一個 IP
基於 IP 的虛擬主機(IP-based)提供更高的安全性,適合 SSL 憑證
基於名稱的虛擬主機(Name-based)需要 SNI 技術來支援 HTTPS
基於 IP 的虛擬主機(IP-based)電子商務、銀行、API 服務、郵件伺服器
基於名稱的虛擬主機(Name-based)共享主機、部落格、企業網站
基於 IP 的虛擬主機(IP-based)需要額外購買 IP,成本較高
基於名稱的虛擬主機(Name-based)無需額外 IP,成本較低
基於 IP 的虛擬主機(IP-based)依據 IP 來區分網站
基於名稱的虛擬主機(Name-based)依據 Host Header 來區分網站
基於 IP 的虛擬主機(IP-based)需要獨立 IP,每個網站都需分配 IP
基於名稱的虛擬主機(Name-based)不需要額外 IP,可在相同 IP 上運行多個網站

如何設定虛擬主機?(以 Apache 伺服器為例)

如果你使用 Apache 伺服器來架設網站,可以透過 設定虛擬主機 來在同一台伺服器上管理多個網站。以下是基本的設定步驟:

安裝 Apache

在 Linux 伺服器上,可以使用以下指令來安裝 Apache 網頁伺服器:

sudo apt update
sudo apt install apache2

在設定 Apache 虛擬主機(Virtual Host)之前,首先需要建立網站的目錄,確保 Apache 能夠正確讀取網站的檔案。

1️⃣ 方式 1:先建立網站的資料夾,之後將網站內容存放在該資料夾內(適用於標準伺服器管理方式,通常使用 /var/www/ 作為網站存放目錄)。

2️⃣ 方式 2:網站內容存放在使用者自訂的目錄,最後調整 Apache 設定來指定網站資料夾位置(適用於開發環境、Docker 部署等)。

方式 1:預先建立網站目錄,之後在該目錄內存放網站資料

1. 建立網站目錄

/var/www/ 目錄下,為每個網站建立獨立的資料夾,這樣可以清楚地管理不同網站的內容。

sudo mkdir -p /var/www/example1.com/public_html
sudo mkdir -p /var/www/example2.com/public_html

-p 參數的作用是:如果 /var/www/example1.com/ 這個目錄不存在,它會自動建立。

2. 設定正確的權限

為了讓 Apache 伺服器能夠讀取這些目錄,需要將擁有權設定為 www-data(Apache 伺服器使用的用戶)。

sudo chown -R www-data:www-data /var/www/example1.com/public_html
sudo chown -R www-data:www-data /var/www/example2.com/public_html
sudo chmod -R 755 /var/www/example1.com/public_html
sudo chmod -R 755 /var/www/example2.com/public_html

方式 2:網站內容存放在伺服器的特定資料夾,之後修改 Apache 設定來對應網站資料夾

這種方式適用於開發環境或是需要將網站存放在 /home/ 目錄下的情況,例如:

  • 網站開發者 想要把網站存放在 /home/user/websites/
  • Docker 環境 可能會將網站目錄掛載到 /srv/websites/
  • 伺服器管理員 可能希望將專案放在 /opt/webapps/

1. 建立網站目錄

假設你想將網站存放在 /home/user/websites/,可以執行以下指令:

sudo mkdir -p /home/user/websites/example1.com
sudo mkdir -p /home/user/websites/example2.com

2. 設定 Apache 可存取的權限

一般來說,Apache 預設無法直接存取 /home/ 內的資料夾,因此需要設定適當的權限,確保 Apache (www-data) 可以讀取這些目錄。

sudo chown -R www-data:www-data /home/user/websites/example1.com
sudo chown -R www-data:www-data /home/user/websites/example2.com
sudo chmod -R 755 /home/user/websites/example1.com
sudo chmod -R 755 /home/user/websites/example2.com

如果你不想變更目錄的擁有者,你也可以使用 ACL(存取控制列表)來授權 Apache 存取該目錄:

sudo setfacl -R -m u:www-data:rX /home/user/websites/example1.com
sudo setfacl -R -m u:www-data:rX /home/user/websites/example2.com

建立虛擬主機設定檔(適用於兩種方式)

無論你選擇哪種方式,都需要設定 Apache 虛擬主機,讓 Apache 知道每個網站的根目錄位置。

🔹 若使用 /var/www/(方式 1)

/etc/apache2/sites-available/ 內建立 example1.com.conf 設定檔:

sudo nano /etc/apache2/sites-available/example1.com.conf

加入以下內容:

<VirtualHost *:80>
    ServerAdmin admin@example1.com
    ServerName example1.com
    ServerAlias www.example1.com
    DocumentRoot /var/www/example1.com/public_html

    <Directory /var/www/example1.com/public_html>
        Require all granted
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

同理,為 example2.com 建立另一個設定檔:

sudo nano /etc/apache2/sites-available/example2.com.conf

並加入以下內容:

<VirtualHost *:80>
    ServerAdmin admin@example2.com
    ServerName example2.com
    ServerAlias www.example2.com
    DocumentRoot /var/www/example2.com/public_html

    <Directory /var/www/example2.com/public_html>
        Require all granted
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

🔹 若使用 /home/user/websites/(方式 2)

如果你的網站存放在 /home/user/websites/,則 example1.com.conf 的設定應該是:

<VirtualHost *:80>
    ServerAdmin admin@example1.com
    ServerName example1.com
    ServerAlias www.example1.com
    DocumentRoot /home/user/websites/example1.com

    <Directory /home/user/websites/example1.com>
        Require all granted
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

同理,example2.com.conf 設定為:

<VirtualHost *:80>
    ServerAdmin admin@example2.com
    ServerName example2.com
    ServerAlias www.example2.com
    DocumentRoot /home/user/websites/example2.com

    <Directory /home/user/websites/example2.com>
        Require all granted
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

啟用虛擬主機並重新啟動 Apache

無論你選擇哪種方式,都需要執行以下指令來啟用 Apache 虛擬主機設定:

sudo a2ensite example1.com.conf
sudo a2ensite example2.com.conf
sudo systemctl restart apache2

如果你使用了 HTTPS(SSL),記得確保 Let’s Encrypt 憑證已安裝,然後執行:

sudo systemctl reload apache2

結論

虛擬主機(Virtual Host)是一種讓多個網站共用同一台伺服器的技術,特別適合網站託管與管理。

它可以分為 基於 IP 的虛擬主機基於名稱的虛擬主機,其中基於名稱的方式最為常見。

透過 Apache 或其他 Web 伺服器的設定,你可以在單一伺服器上託管多個獨立網站,而不需要額外購買伺服器資源。

希望這篇文章能幫助你更了解虛擬主機的運作方式,讓你能夠順利架設網站!🚀