虛擬主機是 Apache 實現「一機多站」的核心機制。本文詳解基於域名、端口、IP 三種虛擬主機模式的配置步驟、關鍵指令含義、常見坑點與測試驗證方法。
httpd.conf:啟用虛擬主機包含行 Include conf/extra/httpd-vhosts.conf(去掉 # 註釋)。httpd-vhosts.conf:集中管理所有站點配置,便於維護。前置條件:域名解析到同一 IP(生產環境用 A 記錄,本地測試改 C:\Windows\System32\drivers\etc\hosts 或 /etc/hosts)。
# httpd-vhosts.conf
# 站點 1:www.abc.com
<VirtualHost *:80>
ServerAdmin admin@abc.com
DocumentRoot "/usr/local/apache2/htdocs/joomla"
ServerName www.abc.com
ServerAlias abc.com *.abc.com
ErrorLog "/usr/local/apache2/htdocs/abc/error_log"
CustomLog "/usr/local/apache2/htdocs/abc/access_log" common
<Directory "/usr/local/apache2/htdocs/joomla">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
# 站點 2:www.bbs.com
<VirtualHost *:80>
ServerAdmin admin@bbs.com
DocumentRoot "/usr/local/apache2/htdocs/bbs"
ServerName www.bbs.com
ErrorLog "/usr/local/apache2/htdocs/bbs/error_log"
CustomLog "/usr/local/apache2/htdocs/bbs/access_log" common
<Directory "/usr/local/apache2/htdocs/bbs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
關鍵點:
*:80 監聽所有 IP 的 80 端口。ServerName 必須與請求 Host 匹配。ServerAlias 支援泛域名/多域名。<Directory> 權限控制(Apache 2.4+ 用 Require all granted)。適用於內網測試、特殊服務隔離,無需域名。
# httpd.conf 需先 Listen 多端口
Listen 80
Listen 8080
Listen 8081
# httpd-vhosts.conf
<VirtualHost *:8080>
DocumentRoot "/var/www/site8080"
ServerName localhost:8080
</VirtualHost>
<VirtualHost *:8081>
DocumentRoot "/var/www/site8081"
ServerName localhost:8081
</VirtualHost>
訪問 https://ip:8080、https://ip:8081 即可區分站點。
伺服器擁有多公網 IP,每站點綁定獨立 IP(需 SSL 獨立證書時常用)。
<VirtualHost 192.168.1.10:80>
DocumentRoot "/var/www/site1"
ServerName www.site1.com
</VirtualHost>
<VirtualHost 192.168.1.11:80>
DocumentRoot "/var/www/site2"
ServerName www.site2.com
</VirtualHost>
apachectl -t 或 httpd -t,顯示 Syntax OK 才能重啟。systemctl restart httpd / service apache2 restart / apachectl restart。curl -H "Host: www.abc.com" https://localhost/ 測試域名匹配。| 現象 | 原因 | 解決 |
|---|---|---|
| 所有域名指向同一站點 | 缺少 NameVirtualHost *:80 (Apache 2.2) 或首個 VirtualHost 成了默認 | 2.4 無需 NameVirtualHost;確保有默認站點或按需匹配 |
| 403 Forbidden | <Directory> 權限未放行 | 添加 Require all granted (2.4) 或 Allow from all (2.2) |
| .htaccess 不生效 | AllowOverride None | 改為 AllowOverride All |
| 端口衝突 | 未在 Listen 添加端口 | Listen 8080 在 httpd.conf |
生產環境 99% 使用基於域名的虛擬主機。掌握 httpd-vhosts.conf 結構、ServerName/ServerAlias 匹配邏輯、<Directory> 權限三要素,加上 apachectl -t 驗證習慣,即可穩健管理百站點級 Apache 叢集。