Apache 虛擬主機允許單台服務器托管多個網站,三種核心模式:基於 IP、基於端口、基於域名。本文在 CentOS 7 + Apache 2.4 環境下逐步實操。
yum install -y httpd systemctl enable --now httpd firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-port=8080/tcp # 基於端口模式需開放 firewall-cmd --reload
原理:服務器配置多張網卡或單網卡多 IP,每個網站綁定不同 IP 的 80 端口。
cd /etc/sysconfig/network-scripts/ cp ifcfg-eth0 ifcfg-eth0:0 vi ifcfg-eth0:0 # 修改 DEVICE=eth0:0, IPADDR=192.168.1.136, NETMASK=255.255.255.0 systemctl restart network

vi /etc/httpd/conf/httpd.conf # 取消註釋或添加 Include conf/extra/httpd-vhosts.conf
vi /etc/httpd/conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.1.135:80>
DocumentRoot /var/www/html/a.org
ServerName a.org
</VirtualHost>
<VirtualHost 192.168.1.136:80>
DocumentRoot /var/www/html/zjj
ServerName zjj
</VirtualHost>

mkdir -p /var/www/html/a.org /var/www/html/zjj echo "Welcome to a.org (192.168.1.135)" > /var/www/html/a.org/index.html echo "Welcome to zjj (192.168.1.136)" > /var/www/html/zjj/index.html systemctl restart httpd

elinks https://192.168.1.135 # 顯示 a.org 頁面 elinks https://192.168.1.136 # 顯示 zjj 頁面

原理:同一 IP,不同端口(如 80、8080)對應不同網站。
vi /etc/httpd/conf/httpd.conf Listen 80 Listen 8080

vi /etc/httpd/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot /var/www/html/port80
ServerName port80.local
</VirtualHost>
<VirtualHost *:8080>
DocumentRoot /var/www/html/port8080
ServerName port8080.local
</VirtualHost>

mkdir -p /var/www/html/port80 /var/www/html/port8080 echo "Port 80 Site" > /var/www/html/port80/index.html echo "Port 8080 Site" > /var/www/html/port8080/index.html systemctl restart httpd

elinks https://192.168.1.135 # Port 80 elinks https://192.168.1.135:8080 # Port 8080

原理:同一 IP、同一端口,通過 HTTP Host 頭區分網站。
vi /etc/httpd/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot /var/www/html/www.a.com
ServerName www.a.com
ServerAlias a.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/www.b.com
ServerName www.b.com
ServerAlias b.com
</VirtualHost>
# Windows: C:\Windows\System32\drivers\etc\hosts # Linux/Mac: /etc/hosts 192.168.1.135 www.a.com a.com 192.168.1.135 www.b.com b.com
mkdir -p /var/www/html/www.a.com /var/www/html/www.b.com echo "Site A" > /var/www/html/www.a.com/index.html echo "Site B" > /var/www/html/www.b.com/index.html systemctl restart httpd # 瀏覽器訪問 https://www.a.com / https://www.b.com
| 指令 | 說明 |
|---|---|
| VirtualHost addr:port | 定義虛擬主機作用域 |
| DocumentRoot | 網站根目錄 |
| ServerName | 主域名(必須) |
| ServerAlias | 別名域名(可多個,支持通配符 *.example.com) |
| DirectoryIndex | 默認首頁文件 |
| ErrorLog / CustomLog | 錯誤/訪問日誌路徑 |
<Directory /path> Require all granted </Directory>httpd -S 查看解析結果,確認配置文件被 Includenetstat -ntlp | grep :80 排查setsebool -P httpd_can_network_connect 1 或調整目錄上下文 chcon -R -t httpd_sys_content_t /path