在互聯網中,我們經常看到一臺服務器上運行着多個網站,比如公司可能同時有官網、博客、產品展示站等。如果爲每個網站單獨準備一臺服務器,成本會很高。而Nginx的虛擬主機功能可以讓我們在一臺服務器上輕鬆部署多個網站,每個網站看起來就像獨立運行在自己的服務器上一樣。
一、什麼是虛擬主機?¶
簡單來說,虛擬主機是通過技術手段,讓一臺物理服務器模擬出多個“虛擬服務器”的效果。每個虛擬主機可以獨立配置域名、網站文件和訪問規則,互不干擾。
Nginx實現虛擬主機主要有三種方式:
- 基於域名:最常用,通過不同的域名訪問不同網站(比如 www.abc.com 和 www.xyz.com)。
- 基於端口:通過不同的端口號區分網站(比如 www.abc.com:80 和 www.abc.com:8080)。
- 基於IP:通過不同的服務器IP地址區分網站(如果服務器綁定了多個IP)。
二、準備工作¶
在開始配置前,需要確保:
1. 服務器已安裝Nginx:如果還沒安裝,可通過以下命令安裝(以Ubuntu爲例):
sudo apt update && sudo apt install nginx
安裝後啓動Nginx:sudo systemctl start nginx,並設置開機自啓:sudo systemctl enable nginx。
-
網站內容準備:爲每個虛擬主機準備一個網站目錄和首頁文件(比如
index.html)。
示例:
- 網站1目錄:/var/www/site1,index.html內容:Welcome to Site 1!
- 網站2目錄:/var/www/site2,index.html內容:Welcome to Site 2! -
測試域名(可選):如果用真實域名,需確保域名已解析到服務器IP(比如將
site1.com和site2.com的A記錄指向服務器IP1.2.3.4)。
三、基於域名的虛擬主機(最常用)¶
假設服務器IP是 1.2.3.4,需要部署兩個網站:site1.com 和 site2.com。
步驟1:創建Nginx配置文件¶
Nginx的配置文件通常在 /etc/nginx/ 目錄下,推薦在 sites-available 目錄中創建新配置文件(Ubuntu/Debian系統):
sudo nano /etc/nginx/sites-available/site1.com
步驟2:配置第一個網站(site1.com)¶
在配置文件中寫入以下內容:
server {
listen 80; # 監聽80端口(HTTP默認端口)
server_name site1.com www.site1.com; # 匹配的域名,可多個用空格分隔
root /var/www/site1; # 網站根目錄
index index.html; # 默認首頁文件
# 可選:配置網站訪問日誌
access_log /var/log/nginx/site1_access.log;
error_log /var/log/nginx/site1_error.log;
}
步驟3:配置第二個網站(site2.com)¶
同樣創建配置文件 site2.com:
server {
listen 80;
server_name site2.com www.site2.com;
root /var/www/site2;
index index.html;
access_log /var/log/nginx/site2_access.log;
error_log /var/log/nginx/site2_error.log;
}
步驟4:啓用配置並測試¶
- 將配置文件軟鏈接到
sites-enabled目錄(讓Nginx加載):
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
- 測試配置是否有語法錯誤:
sudo nginx -t
如果顯示 syntax is ok 和 test is successful,則配置正確。
- 重啓Nginx使配置生效:
sudo systemctl restart nginx
步驟5:驗證訪問¶
用瀏覽器分別訪問 site1.com 和 site2.com,應該能看到各自的首頁內容。
四、基於端口的虛擬主機¶
如果沒有多餘域名,可通過不同端口區分網站(比如80和8080端口)。
示例:80端口和8080端口的兩個網站¶
- 網站1(80端口):配置同上,
listen 80;,server_name可留空(或用_匹配任意域名)。
server {
listen 80;
server_name _; # 匹配任意域名
root /var/www/site1;
index index.html;
}
- 網站2(8080端口):新增配置:
server {
listen 8080;
server_name _;
root /var/www/site2;
index index.html;
}
- 重啓Nginx後,訪問:
-http://服務器IP(80端口)
-http://服務器IP:8080(8080端口)
五、基於IP的虛擬主機(需多IP服務器)¶
如果服務器綁定了多個IP(比如 1.2.3.4 和 1.2.3.5),可通過不同IP區分網站:
# 網站1綁定IP 1.2.3.4
server {
listen 1.2.3.4:80;
server_name site1.com;
root /var/www/site1;
}
# 網站2綁定IP 1.2.3.5
server {
listen 1.2.3.5:80;
server_name site2.com;
root /var/www/site2;
}
六、常見問題與解決¶
-
訪問404或空白頁面:
- 檢查網站目錄權限:sudo chown -R www-data:www-data /var/www/site1(Ubuntu默認用戶是www-data)。
- 確認root路徑是否正確,且index.html文件存在。 -
Nginx啓動失敗:
- 運行sudo nginx -t檢查配置語法錯誤,根據提示修改。
- 檢查日誌:tail -n 100 /var/log/nginx/error.log。 -
域名解析未生效:
- 確保域名A記錄已指向服務器IP,可通過ping site1.com檢查是否解析正確。
總結¶
通過Nginx的虛擬主機功能,一臺服務器可以輕鬆部署多個網站。核心是通過 server 塊配置不同的域名、端口或IP,每個網站獨立設置根目錄和訪問規則。初學者建議從基於域名的方式開始練習,掌握後再嘗試其他方式。記住每次修改配置後,用 nginx -t 測試並重啓服務,避免出錯。