虛擬主機(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)基於名稱的虛擬主機(Name-based)
IP 使用每個網站使用不同的 IP多個網站共用同一個 IP
安全性提供更高的安全性,適合 SSL 憑證需要 SNI 技術來支援 HTTPS
適用場景電子商務、銀行、API 服務、郵件伺服器共享主機、部落格、企業網站
成本需要額外購買 IP,成本較高無需額外 IP,成本較低
設定方式依據 IP 來區分網站依據 Host Header 來區分網站
是否受 IP 限制需要獨立 IP,每個網站都需分配 IP不需要額外 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 [email protected]
    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 [email protected]
    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 [email protected]
    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 [email protected]
    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 伺服器的設定,你可以在單一伺服器上託管多個獨立網站,而不需要額外購買伺服器資源。

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

Similar Posts