虛擬主機(Virtual Host)入門指南:讓你的網站輕鬆上線
更新日期: 2025 年 3 月 13 日
本文為 HTTPS 連線 基本介紹,第 9 篇:
- 什麼是代管網域(Domain Hosting)?初學者完整指南
- 網站託管(Web Hosting)入門指南:讓你的網站輕鬆上線
- Cloudflare 介紹:讓網站更安全、更快速的關鍵服務
- 反向代理是什麼?初學者必看詳解
- Apache HTTP Server 是什麼:初學者指南
- Django 初學者指南:ALLOWED_HOSTS 設定與安全性考量
- 如何為初學者配置 HTTPS 和 SSL:Cloudflare、Let’s Encrypt 和 Apache 完整指南
- Let’s Encrypt 初學者完全指南
- 虛擬主機(Virtual Host)入門指南:讓你的網站輕鬆上線 👈進度
- 初學者指南:設定 Apache 反向代理 Django 服務(含 SSL)
- Cloudflare 設定指南:如何正確配置 SSL/TLS 加密模式
- Cloudflare Edge Certificates 入門指南
- 解決 Cloudflare 301 重定向循環問題:初學者指南
當你準備架設網站時,第一步通常是選擇合適的伺服器環境。
然而,對於剛接觸網站架設的初學者來說,「虛擬主機」(Virtual Host) 這個名詞可能會讓人困惑。
本篇文章將深入探討虛擬主機的概念,解釋其運作方式,以及如何設定虛擬主機,讓你對這項技術有更清楚的認識,順利架設屬於自己的網站。
什麼是虛擬主機(Virtual Host)?
虛擬主機(Virtual Host) 是一種技術,允許 在同一台實體伺服器上運行多個網站,每個網站可以擁有獨立的網域名稱、設定和檔案資料夾,而彼此不會互相影響。
在一台實體伺服器上,透過「虛擬主機」技術,可以設定多個網站,這些網站雖然共用伺服器的硬體資源,但從外部訪問時,使用者會覺得這些網站是獨立存在的。
例如:
example1.com
、example2.com
和blog.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.com
和 example2.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 伺服器的設定,你可以在單一伺服器上託管多個獨立網站,而不需要額外購買伺服器資源。
希望這篇文章能幫助你更了解虛擬主機的運作方式,讓你能夠順利架設網站!🚀