Apache HTTP Server 是全球最廣泛使用的 Web 伺服器軟體,其強大的虛擬主機機制讓單一伺服器可輕鬆承載數百個網站。本文系統整理 Apache 2.2/2.4 虛擬主機配置核心知識,涵蓋 IP 基礎、名稱基礎、多域名綁定、子域名泛解析、SSL 多憑證 (SNI) 等實戰場景,並提供可直接套用的配置範本。
| 模式 | 原理 | 適用場景 | 缺點 |
|---|---|---|---|
| IP 基礎 | 每個網站綁定獨立 IP | 需支援極舊瀏覽器(無 Host 標頭)、SSL 非 SNI 環境 | IP 成本高、擴展性差 |
| 名稱基礎 | 透過 HTTP Host 標頭區分網站 | 現代 Web 部署標準、單 IP 承載無限網站 | 需客戶端支援 Host 標頭(所有現代瀏覽器皆支援) |
現代部署一律採用名稱基礎虛擬主機,配合 SNI 解決多 SSL 憑證問題。
# 1. 監聽埠
Listen 80
Listen 443
# 2. 啟用名稱基礎虛擬主機 (Apache 2.4 預設已啟用)
NameVirtualHost *:80
NameVirtualHost *:443
# 3. 伺服器名稱 (建議設為主機名或主域名)
ServerName www.example.com:80
# 4. 包含獨立站點配置目錄 (推薦模組化管理)
IncludeOptional sites-enabled/*.conf
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
# 日誌分離
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
# 目錄權限
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 安全標頭
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
</VirtualHost>
# HTTPS 虛擬主機 (需 mod_ssl、SNI)
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
SSLCertificateChainFile /etc/ssl/certs/example.com.ca-bundle
# SSL 現代化配置
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLHonorCipherOrder on
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
若需支援大量子域名 (如 user1.example.com, user2.example.com...),可採用 mod_vhost_alias 動態映射,避免逐個建立配置:
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
VirtualDocumentRoot /var/www/example.com/subdomains/%1
# %1 = 子域名第一段 (user1, user2...)
<Directory /var/www/example.com/subdomains>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
搭配 DNS 泛解析 *.example.com A @,新增子域名只需建立對應目錄,無需重啟 Apache。
原文提到的 RewriteMap 方案適用於極舊環境,現代 Apache 已內建 mod_vhost_alias 效能更好、配置更簡潔。
apachectl configtest 或 httpd -thttpd -S (顯示解析順序、ServerName/ServerAlias、DocumentRoot)www-data/apache) 對 DocumentRoot 有讀取/執行權限,SELinux 環境需 chcon -R -t httpd_sys_content_t /var/www/...goaccess、awstats 或 ELK Stack 分析存取日誌。| 項目 | 2.2 | 2.4 |
|---|---|---|
| 存取控制 | Order allow,deny / Allow from all | Require all granted |
| NameVirtualHost | 必要 | 可省略 (自動啟用) |
| 預設 MPM | prefork | event (建議生產用 event/worker) |
Apache 虛擬主機配置的核心在於「模組化、標準化、可維護」。建立 sites-available/sites-enabled 目錄結構,每站一檔,配合版控系統管理配置變更,才是專業運維的正確姿勢。