基于名称的虚拟主机 和 基于IP的虚拟主机。基于名称的虚拟主机 是最常用、最推荐的方法。

核心概念:什么是虚拟主机?
虚拟主机允许 Apache 在同一台服务器上根据不同的域名或 IP 地址,将访问请求指向不同的网站根目录,这样,当用户访问 www.siteA.com 时,Apache 就会提供 siteA.com 的内容;当用户访问 www.siteB.com 时,则提供 siteB.com 的内容。
基于名称的虚拟主机(最常用)
这是最流行的方法,它通过客户端请求中包含的 Host 头信息来判断应该访问哪个网站,你只需要一个 IP 地址就可以托管无数个网站。
步骤 1:确保 Apache 已安装并启用 mod_vhost_alias 模块
这个模块是 Apache 虚拟主机的核心,在安装 Apache 时它会被默认安装并启用。
-
检查模块是否启用:
(图片来源网络,侵删)# 对于使用 systemd 的系统 (如 Ubuntu 16+, CentOS 7+) sudo apache2ctl -M | grep vhost_alias # 或者 httpd -M | grep vhost_alias # 如果看到 `vhost_alias_module (shared)`,说明已启用。
-
启用模块(如果未启用):
- 在 Debian/Ubuntu 上:
sudo a2enmod vhost_alias
- 在 CentOS/RHEL 上:
sudo yum install mod_ssl # 通常包含该模块 # 确保 httpd.conf 中有 LoadModule vhost_alias_module ...
- 在 Debian/Ubuntu 上:
步骤 2:为每个网站创建目录结构
我们需要为每个网站创建一个独立的存放网页文件的目录。
# 创建网站根目录 sudo mkdir -p /var/www/siteA.com/html sudo mkdir -p /var/www/siteB.org/html # 设置目录所有者 # www-data 是 Debian/Ubuntu 的默认 Apache 用户 # apache 是 CentOS/RHEL 的默认 Apache 用户 sudo chown -R www-data:www-data /var/www/siteA.com/html sudo chown -R www-data:www-data /var/www/siteB.org/html # 设置目录权限 sudo chmod -R 755 /var/www
步骤 3:为每个网站创建首页文件
为了测试,我们在每个网站目录下创建一个简单的 index.html 文件。
# 为 siteA.com 创建首页 sudo nano /var/www/siteA.com/html/index.html
在文件中输入:

<!DOCTYPE html>
<html>
<head>Welcome to Site A!</title>
</head>
<body>
<h1>This is Site A</h1>
<p>If you see this, it means your virtual host for siteA.com is working!</p>
</body>
</html>
# 为 siteB.org 创建首页 sudo nano /var/www/siteB.org/html/index.html
在文件中输入:
<!DOCTYPE html>
<html>
<head>Welcome to Site B!</title>
</head>
<body>
<h1>This is Site B</h1>
<p>If you see this, it means your virtual host for siteB.org is working!</p>
</body>
</html>
步骤 4:创建虚拟主机配置文件
这是最关键的一步,我们将为每个网站创建一个独立的配置文件,并将它们放在 sites-available 目录下。
-
在 Debian/Ubuntu 上: Apache 的配置文件通常存放在
/etc/apache2/sites-available/目录,我们可以创建一个模板文件,然后复制并修改。# 创建一个默认配置文件作为模板 sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/siteA.com.conf
-
在 CentOS/RHEL 上: 配置文件通常在
/etc/httpd/conf.d/目录,这个目录下的任何.conf文件都会被 Apache 自动加载。# 直接创建配置文件 sudo nano /etc/httpd/conf.d/siteA.com.conf
我们来编辑 siteA.com.conf 文件:
# 虚拟主机配置开始
<VirtualHost *:80>
# ServerName 是你网站的主域名
ServerName siteA.com
# ServerAlias 是你网站的其他域名(可选)
ServerAlias www.siteA.com
# DocumentRoot 是你网站文件的根目录
DocumentRoot /var/www/siteA.com/html
# 错误日志文件
ErrorLog ${APACHE_LOG_DIR}/siteA.com_error.log
# 访问日志文件
CustomLog ${APACHE_LOG_DIR}/siteA.com_access.log combined
</VirtualHost>
# 虚拟主机配置结束
同样,为 siteB.org 创建配置文件 siteB.org.conf:
<VirtualHost *:80>
ServerName siteB.org
ServerAlias www.siteB.org
DocumentRoot /var/www/siteB.org/html
ErrorLog ${APACHE_LOG_DIR}/siteB.org_error.log
CustomLog ${APACHE_LOG_DIR}/siteB.org_access.log combined
</VirtualHost>
步骤 5:启用新的虚拟主机配置
-
在 Debian/Ubuntu 上: 我们使用
a2ensite命令来创建一个指向配置文件的软链接到sites-enabled目录。sudo a2ensite siteA.com.conf sudo a2ensite siteB.org.conf
-
在 CentOS/RHEL 上: 因为配置文件在
conf.d目录下,所以只要文件存在,Apache 就会自动加载,无需额外操作。
步骤 6:测试并重启 Apache
在重启服务之前,务必先测试配置文件是否有语法错误。
# 测试配置语法 sudo apache2ctl configtest # Debian/Ubuntu # 或者 sudo apachectl configtest # CentOS/RHEL # 如果输出 "Syntax OK",说明配置正确。
如果一切正常,重启 Apache 服务使配置生效。
# Debian/Ubuntu sudo systemctl restart apache2 # CentOS/RHEL sudo systemctl restart httpd
步骤 7:配置 DNS 和本地 hosts 文件(用于测试)
要让你的电脑能访问这两个新网站,需要进行域名解析。
-
DNS 配置: 登录你的域名注册商(如 GoDaddy, Namecheap 等)的管理后台,将
siteA.com和siteB.org的 A 记录指向你的服务器公网 IP 地址。 -
本地 hosts 文件(仅用于本地测试): 如果你还没有配置 DNS,或者只想在本地电脑上测试,可以修改你电脑的
hosts文件。- Windows:
C:\Windows\System32\drivers\etc\hosts - macOS/Linux:
/etc/hosts
在文件末尾添加以下内容(将
YOUR_SERVER_IP替换为你的服务器 IP):YOUR_SERVER_IP siteA.com YOUR_SERVER_IP www.siteA.com YOUR_SERVER_IP siteB.org YOUR_SERVER_IP www.siteB.org - Windows:
在浏览器中访问 http://siteA.com 和 http://siteB.org,你应该能看到各自不同的首页内容了!
基于IP的虚拟主机
这种方法为每个网站分配一个独立的 IP 地址,当服务器有多个网卡或多个 IP 地址时,这种方法很有用,但现在因为 IPv4 地址稀缺,使用得较少。
步骤:
- 为服务器配置多个 IP 地址:假设你的服务器有两个 IP 地址:
168.1.10和168.1.11。 - 为每个网站创建目录:与方法一相同。
- 创建配置文件:每个虚拟主机配置块监听不同的 IP 地址。
示例配置:
# 第一个网站,监听 IP 192.168.1.10
<VirtualHost 192.168.1.10:80>
ServerName siteA.com
DocumentRoot /var/www/siteA.com/html
ErrorLog logs/siteA.com_error.log
CustomLog logs/siteA.com_access.log combined
</VirtualHost>
# 第二个网站,监听 IP 192.168.1.11
<VirtualHost 192.168.1.11:80>
ServerName siteB.org
DocumentRoot /var/www/siteB.org/html
ErrorLog logs/siteB.org_error.log
CustomLog logs/siteB.org_access.log combined
</VirtualHost>
配置完成后,同样需要测试并重启 Apache。
总结与最佳实践
| 特性 | 基于名称的虚拟主机 | 基于IP的虚拟主机 |
|---|---|---|
| 适用场景 | 绝大多数情况,节省 IP 地址 | 需要基于 IP 进行隔离或加密 |
| 所需资源 | 一个 IP 地址 | 多个 IP 地址 |
| 配置方式 | 通过 ServerName 和 ServerAlias |
通过 <VirtualHost IP:PORT> |
| HTTPS支持 | 完美支持,可以通过 SNI (Server Name Indication) 在同一个 IP 上为多个网站提供不同的 SSL 证书。 | 也支持,但需要为每个 IP 分配一个证书。 |
推荐使用基于名称的虚拟主机。
额外提示:
- 配置 SSL/HTTPS: 为基于名称的虚拟主机配置 HTTPS 非常普遍,你只需要为每个网站申请 SSL 证书,并在相应的虚拟主机配置块中添加
SSLEngine on,SSLCertificateFile,SSLCertificateKeyFile等指令即可。 - 使用模板: 当你需要创建大量虚拟主机时,可以编写一个 Shell 脚本来自动化创建目录、文件和配置模板,大大提高效率。
