在互聯網中,我們經常看到一臺服務器上運行着多個網站,比如公司可能同時有官網、博客、產品展示站等。如果爲每個網站單獨準備一臺服務器,成本會很高。而Nginx的虛擬主機功能可以讓我們在一臺服務器上輕鬆部署多個網站,每個網站看起來就像獨立運行在自己的服務器上一樣。

一、什麼是虛擬主機?

簡單來說,虛擬主機是通過技術手段,讓一臺物理服務器模擬出多個“虛擬服務器”的效果。每個虛擬主機可以獨立配置域名、網站文件和訪問規則,互不干擾。

Nginx實現虛擬主機主要有三種方式:
- 基於域名:最常用,通過不同的域名訪問不同網站(比如 www.abc.comwww.xyz.com)。
- 基於端口:通過不同的端口號區分網站(比如 www.abc.com:80www.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

  1. 網站內容準備:爲每個虛擬主機準備一個網站目錄和首頁文件(比如 index.html)。
    示例:
    - 網站1目錄:/var/www/site1index.html 內容:Welcome to Site 1!
    - 網站2目錄:/var/www/site2index.html 內容:Welcome to Site 2!

  2. 測試域名(可選):如果用真實域名,需確保域名已解析到服務器IP(比如將 site1.comsite2.com 的A記錄指向服務器IP 1.2.3.4)。

三、基於域名的虛擬主機(最常用)

假設服務器IP是 1.2.3.4,需要部署兩個網站:site1.comsite2.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:啓用配置並測試

  1. 將配置文件軟鏈接到 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/
  1. 測試配置是否有語法錯誤:
   sudo nginx -t

如果顯示 syntax is oktest is successful,則配置正確。

  1. 重啓Nginx使配置生效:
   sudo systemctl restart nginx

步驟5:驗證訪問

用瀏覽器分別訪問 site1.comsite2.com,應該能看到各自的首頁內容。

四、基於端口的虛擬主機

如果沒有多餘域名,可通過不同端口區分網站(比如80和8080端口)。

示例:80端口和8080端口的兩個網站

  1. 網站1(80端口):配置同上,listen 80;server_name 可留空(或用 _ 匹配任意域名)。
   server {
       listen 80;
       server_name _;  # 匹配任意域名
       root /var/www/site1;
       index index.html;
   }
  1. 網站2(8080端口):新增配置:
   server {
       listen 8080;
       server_name _;
       root /var/www/site2;
       index index.html;
   }
  1. 重啓Nginx後,訪問:
    - http://服務器IP(80端口)
    - http://服務器IP:8080(8080端口)

五、基於IP的虛擬主機(需多IP服務器)

如果服務器綁定了多個IP(比如 1.2.3.41.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;
}

六、常見問題與解決

  1. 訪問404或空白頁面
    - 檢查網站目錄權限:sudo chown -R www-data:www-data /var/www/site1(Ubuntu默認用戶是 www-data)。
    - 確認 root 路徑是否正確,且 index.html 文件存在。

  2. Nginx啓動失敗
    - 運行 sudo nginx -t 檢查配置語法錯誤,根據提示修改。
    - 檢查日誌:tail -n 100 /var/log/nginx/error.log

  3. 域名解析未生效
    - 確保域名A記錄已指向服務器IP,可通過 ping site1.com 檢查是否解析正確。

總結

通過Nginx的虛擬主機功能,一臺服務器可以輕鬆部署多個網站。核心是通過 server 塊配置不同的域名、端口或IP,每個網站獨立設置根目錄和訪問規則。初學者建議從基於域名的方式開始練習,掌握後再嘗試其他方式。記住每次修改配置後,用 nginx -t 測試並重啓服務,避免出錯。

小夜