虛擬主機
一.什么是虛擬主機?
1.1 概念
-
虛擬主機(Web Hosting)
-
英文:Web Hosting / Shared Hosting
-
核心概念: 一臺服務器被切分給多個用戶,每個人只使用服務器的一部分資源(CPU、內存、帶寬、存儲),用于部署網站。
-
通俗的講 虛擬主機就是將計算機中不同文件夾進行不同命名,然后可以實現讓服務器(Apache)根據用戶的需求從不同文件夾(網站)中讀取不同內容
-
個人理解 虛擬主機就是把一臺服務器“切開”給很多人用,就好像在一個大房子里隔出很多房間,每個人都有一個屬于自己的小空間,可以放網站文件、圖片、代碼等。服務器軟件(例如 Apache、Nginx)會根據訪問的 域名 或 端口,去不同的“房間”里找對應的內容返回給用戶。
1.2 特點:
- 多個網站共享同一臺物理服務器的資源
- 用戶權限受限制(通常不能隨意安裝系統或軟件)
- 管理簡單,一般只需上傳網站文件即可
- 成本低,適合小型網站或個人博客
例子:
- 你買的便宜空間,在 cPanel 里上傳 HTML/PHP 文件,別人也在同一臺服務器上開空間
適合對象:
- 個人網站、小型公司官網、電商初創網站
1.3 虛擬主機可以分成哪幾種類型?
在Apache中,可以將虛擬主機分成兩種
1. 基于 IP 的虛擬主機(IP-based Virtual Host)
- 概念
一臺服務器可以綁定多個 IP 地址,每個 IP 地址對應一個網站。用戶訪問某個 IP 時,Apache 會根據這個 IP 來確定應該返回哪個網站的內容。 - 原理
- 一般電腦默認只有一個網卡 → 一個 IP 地址。
- 但服務器通常可以配置多個網卡,或者在同一個網卡上綁定多個 IP。
- Apache 通過監聽不同的 IP 地址,將請求分發到對應的網站目錄。
- 優點
- 配置直觀、兼容性好。
- 早期 SSL(HTTPS)環境下必須使用這種方式(因為當時還沒有 SNI 技術)。
- 缺點
- 每個網站需要單獨的 IP,資源浪費,成本高。
- 在 IPv4 地址緊缺的情況下,幾乎不會大規模使用。
-
示例配置:
<VirtualHost 192.168.1.10:80>ServerName site1.comDocumentRoot "/var/www/site1" </VirtualHost><VirtualHost 192.168.1.11:80>ServerName site2.comDocumentRoot "/var/www/site2" </VirtualHost>
補充:IP地址和IP
IP(internet Protocol) 協議 定義了地址的格式、長度、使用規則(比如 IPv4 是 32 位,IPv6 是 128 位),以及數據包如何在網絡中傳輸。
IP 地址 就是按照這個協議規范生成的一個唯一標識。
所以每個 IP 地址都遵循 IP 協議,才能在網絡上被正確識別和路由。
2. 基于域名的虛擬主機(Name-based Virtual Host)
- 一臺電腦上一個IP,一個IP下可以制作多個網站,但需要給每個網站不同名字(虛擬主機名)
-
多個網站共享同一個 IP,Apache 通過 域名(Host 頭部) 來區分訪問的是哪個網站。
-
特點:
- 節省 IP 地址(一個 IP 可以跑很多網站)。
- 現代網站普遍采用這種方式。
- 對 HTTPS(SSL)曾有過限制,但隨著 SNI 技術,現在也能支持多域名 SSL。
-
示例配置:
<VirtualHost *:80>ServerName site1.comDocumentRoot "/var/www/site1" </VirtualHost><VirtualHost *:80>ServerName site2.comDocumentRoot "/var/www/site2" </VirtualHost>
二.實操
2.1 Homebrew Apache 配置基于域名虛擬主機的完整示例
前提
- 已經通過 Homebrew 安裝 Apache:
brew install httpd
- Apache 配置文件路徑:
- Intel 芯片:
/usr/local/etc/httpd/httpd.conf
- M1/M2 芯片:
/opt/homebrew/etc/httpd/httpd.conf
- Intel 芯片:
- 默認 Homebrew Apache 監聽 8080 端口(可以改成 80,但需要 sudo)。
1. 修改 hosts 文件(本機域名映射)
sudo nano /etc/hosts
-
sudo
- 全稱 “superuser do”
- 讓你以 管理員權限(root) 執行后面的命令
- 因為
/etc/hosts
文件是系統文件,普通用戶沒有權限修改,所以必須加sudo
-
nano
- 一個終端下的 文本編輯器,簡單易用
- 用它可以打開文件、編輯內容、保存退出
- 還有其他編輯器可用,比如
vi
、vim
-
/etc/hosts
-
是系統的 本地域名映射文件
-
作用:把域名(例如
site1.local
)映射到 IP(例如127.0.0.1
) -
當你訪問一個域名時,系統會先查這個文件,看是否有對應 IP,再去 DNS 查詢
-
添加:
127.0.0.1 site1.local
127.0.0.1 site2.local
2. 創建網站目錄
mkdir -p ~/Sites/site1
mkdir -p ~/Sites/site2# 添加測試首頁
echo "<h1>Site 1</h1>" > ~/Sites/site1/index.html
echo "<h1>Site 2</h1>" > ~/Sites/site2/index.html
指令解釋:
-
mkdir
-
全稱 “make directory”
-
用來 創建一個新目錄(文件夾)
-
-
-p
參數
-
全稱 “parents”
-
作用:如果上級目錄不存在,會 自動創建上級目錄
3.啟用虛擬主機功能
編輯 Homebrew Apache 配置文件:
nano /usr/local/etc/httpd/httpd.conf # Intel
# 或者
nano /opt/homebrew/etc/httpd/httpd.conf # M1/M2
- 啟用虛擬主機配置
找到:
#Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
去掉 #
:
Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
- 設置主機名解析
確認ServerName
已設置:
ServerName localhost:8080
4. 配置虛擬主機文件
編輯 /usr/local/etc/httpd/extra/httpd-vhosts.conf
(或對應路徑):
這里m2 是/opt/homebrew/etc/httpd/extra/httpd-vhosts.conf
默認配置:
配置含義:
1.VirtualHost *:8080> ... </VirtualHost>
- 作用:定義一個虛擬主機塊,Apache 監聽
*
(所有 IP)和8080
端口的請求。 - 原理:
*
表示可以接收任意網卡的請求,端口必須匹配 Apache 當前監聽的端口。
2.ServerAdmin webmaster@site1.local
- 作用:定義網站管理員郵箱。
- 原理:當網站出錯(500/404 等)時,Apache 可以在錯誤頁顯示這個郵箱,方便用戶聯系管理員。
- 原理點:這是 元信息,不會影響請求匹配,但便于運維。
3.DocumentRoot "/Users/你的用戶名/Sites/site1"
- 作用:虛擬主機的網頁根目錄。
- 原理:Apache 根據訪問的虛擬主機,把 HTTP 請求映射到這個目錄下的文件。
- 本質:虛擬主機是目錄映射 + 域名匹配的組合。
4.ServerName site1.local
- 作用:定義這個虛擬主機的主域名。
- 原理:Apache 根據 HTTP 請求中的
Host
頭部匹配ServerName
,找到對應網站
5.ServerAlias www.site1.local
- 作用:定義別名,可以匹配多個域名。
- 原理:如果用戶訪問別名,也會指向同一個
DocumentRoot
6.<Directory "/Users/你的用戶名/Sites/site1"> ... </Directory>
- 作用:設置目錄訪問權限和選項。
- 各項原理:
Options Indexes FollowSymLinks
Indexes
:如果目錄沒有 index.html,允許顯示文件列表FollowSymLinks
:允許 Apache 跟隨符號鏈接訪問文件
AllowOverride All
- 允許目錄下的
.htaccess
文件覆蓋配置
- 允許目錄下的
Require all granted
- 允許所有用戶訪問此目錄(重要,否則會 403 禁止訪問)
7.ErrorLog
和 CustomLog
- ErrorLog:記錄錯誤日志(例如 404、500),便于排查問題
- CustomLog:記錄訪問日志(誰訪問了哪個頁面),常用格式
common
- 原理:日志是 Apache 內部模塊通過路徑寫入文件,便于運維和調試。
實操配置如下:
5. 設置目錄權限
sudo chown -R $(whoami):_www ~/Sites
chmod -R 755 ~/Sites
Apache 并不強制網站目錄必須在 /var/www
,它可以訪問任何你配置的 DocumentRoot
目錄,只要:
- Apache 進程有權限讀取目錄和文件
- Homebrew Apache 在 macOS 上通常以
_www
用戶運行 _www
用戶必須有 讀權限(和目錄執行權限)才能訪問你的 HTML/PHP 文件
- Homebrew Apache 在 macOS 上通常以
- 目錄權限和所有權設置正確
- 如果你的網站目錄在桌面或
~/Sites
下,默認權限可能是:- 所有者:你自己
- 組:staff
- 權限:700 或 755
- Apache 可能沒有權限訪問,導致 403 Forbidden
- 如果你的網站目錄在桌面或
拆解sudo chown -R $(whoami):_www ~/Sites:
1.sudo
以管理員權限執行命令,因為普通用戶可能沒有權限修改其他用戶或系統目錄的所有權。
2.chown
全稱 “change owner”
用于修改文件或目錄的 所有者(owner)和所屬組(group)
3.-R
Recursive(遞歸)
表示命令會作用于該目錄及其所有子目錄和文件
4.$(whoami)
代表當前登錄用戶
用命令替換,將當前用戶名填入,例如 user
5.:_www
冒號前是所有者(owner),冒號后是所屬組(group)
_www
是 macOS 系統默認的 Web 服務組,Apache 屬于這個組
6.~/Sites
指要修改的目錄路徑
~
代表當前用戶主目錄
拆解chmod -R 755 ~/Sites:
1.chmod
全稱 “change mode”
用于修改文件或目錄的 權限
2.-R
遞歸修改該目錄及其所有子文件和子目錄
3.755
權限數字表示法:
- 第一個數字 7 → 所有者權限:讀?+寫(w)+執行(x) = 7
- 第二個數字 5 → 所屬組權限:讀?+執行(x) = 5
- 第三個數字 5 → 其他用戶權限:讀?+執行(x) = 5
4.~/Sites
指要修改權限的目錄
6.重啟 Apache
brew services restart httpd
7. 測試
- 瀏覽器訪問:
http://site1.local:8080 → 顯示 Site 1
http://site2.local:8080 → 顯示 Site 2
8.注意
如果想用 80 端口,需要修改 httpd.conf
:
Listen 80
并用 sudo brew services restart httpd
啟動。
- 如果 Homebrew Apache 和系統自帶 Apache 沖突,建議停止系統 Apache:
sudo apachectl stop
- 以后要添加新虛擬主機,只要在
httpd-vhosts.conf
增加一個<VirtualHost>
塊即可,并更新/etc/hosts
。