基于域名的虚拟主机 和 基于IP地址的虚拟主机。基于域名的虚拟主机 是最常用、最经济的方式。

核心概念:虚拟主机类型
-
基于域名的虚拟主机
- 原理:通过不同的域名(如
www.site1.com和www.site2.com)来区分不同的网站,所有域名都指向同一个服务器的同一个 IP 地址。 - 优点:最节省 IP 地址资源,是绝大多数网站托管的选择。
- 前提:你需要配置 DNS,将所有域名都解析到服务器的公网 IP 地址。
- 原理:通过不同的域名(如
-
基于IP地址的虚拟主机
- 原理:为每个网站分配一个独立的 IP 地址,服务器根据客户端请求的 IP 地址来决定提供哪个网站的内容。
- 缺点:需要为每个网站购买或配置一个独立的公网 IP,成本较高,不常用,主要用于需要 HTTPS 且不使用 SNI (Server Name Indication) 的老旧场景。
-
基于端口的虚拟主机
- 原理:所有域名使用同一个 IP 地址,但通过不同的端口号(如
www.site1.com:8080和www.site2.com:8081)来区分。 - 缺点:用户访问时需要手动输入端口号,不友好,通常用于内部测试或特定应用。
- 原理:所有域名使用同一个 IP 地址,但通过不同的端口号(如
准备工作
在开始之前,请确保你已经:

- 安装了 Apache:在 Linux (如 Ubuntu, CentOS) 系统上,你可以使用包管理器安装。
- Ubuntu/Debian:
sudo apt update && sudo apt install apache2 - CentOS/RHEL:
sudo yum install httpd
- Ubuntu/Debian:
- 拥有服务器权限:能够编辑 Apache 的配置文件。
- 拥有域名:并确保这些域名的 DNS A 记录都指向你的服务器 IP 地址。
- 创建了网站目录:为每个网站创建一个存放文件的根目录。
- 为
site1.com创建/var/www/site1.com/html - 为
site2.com创建/var/www/site2.com/html
- 为
基于域名的虚拟主机(最常用)
这是最推荐的方法,我们将以 site1.com 和 site2.com 为例进行详细说明。
步骤 1:创建网站目录和文件
为每个网站创建一个独立的目录结构,并放入一个默认的 index.html 文件,以便区分。
# 创建网站1的目录 sudo mkdir -p /var/www/site1.com/html sudo chown -R $USER:$USER /var/www/site1.com/html sudo chmod -R 755 /var/www/site1.com # 创建网站1的首页文件 echo "<h1>Welcome to Site 1!</h1><p>This is the homepage for site1.com</p>" | sudo tee /var/www/site1.com/html/index.html # 创建网站2的目录 sudo mkdir -p /var/www/site2.com/html sudo chown -R $USER:$USER /var/www/site2.com/html sudo chmod -R 755 /var/www/site2.com # 创建网站2的首页文件 echo "<h1>Welcome to Site 2!</h1><p>This is the homepage for site2.com</p>" | sudo tee /var/www/site2.com/html/index.html
步骤 2:创建虚拟主机配置文件
为了避免直接修改主配置文件,我们为每个网站创建一个独立的配置文件,通常这些文件存放在 /etc/apache2/sites-available/ (Ubuntu) 或 /etc/httpd/conf.d/ (CentOS) 目录下。
对于 Ubuntu/Debian:

# 为网站1创建配置文件 sudo nano /etc/apache2/sites-available/site1.com.conf
在 site1.com.conf 文件中,输入以下内容:
<VirtualHost *:80>
ServerAdmin admin@site1.com
ServerName site1.com
ServerAlias www.site1.com
DocumentRoot /var/www/site1.com/html
<Directory /var/www/site1.com/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/site1.com_error.log
CustomLog ${APACHE_LOG_DIR}/site1.com_access.log combined
</VirtualHost>
配置项解释:
<VirtualHost *:80>:监听所有网络接口的 80 端口(HTTP)。ServerName:主域名。ServerAlias:其他指向此网站的域名(如www)。DocumentRoot:此网站文件的根目录。<Directory ...>:定义对DocumentRoot目录的访问权限,AllowOverride All允许使用.htaccess文件。
同样,为网站2创建配置文件:
sudo nano /etc/apache2/sites-available/site2.com.conf
在 site2.com.conf 文件中,内容类似,只需修改域名和路径:
<VirtualHost *:80>
ServerAdmin admin@site2.com
ServerName site2.com
ServerAlias www.site2.com
DocumentRoot /var/www/site2.com/html
<Directory /var/www/site2.com/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/site2.com_error.log
CustomLog ${APACHE_LOG_DIR}/site2.com_access.log combined
</VirtualHost>
对于 CentOS/RHEL:
配置文件通常直接放在 /etc/httpd/conf.d/ 目录下,并以 .conf Apache 会自动加载该目录下的所有配置文件。
# 为网站1创建配置文件 sudo nano /etc/httpd/conf.d/site1.com.conf
与 Ubuntu 版本基本相同。
# 为网站2创建配置文件 sudo nano /etc/httpd/conf.d/site2.com.conf
步骤 3:启用虚拟主机配置
对于 Ubuntu/Debian:
使用 a2ensite 命令来启用我们刚刚创建的配置文件。
sudo a2ensite site1.com.conf sudo a2ensite site2.com.conf
为了确保只有一个默认站点生效(避免冲突),可以禁用默认的 000-default.conf:
sudo a2dissite 000-default.conf
对于 CentOS/RHEL:
不需要额外的命令,只要文件存在于 /etc/httpd/conf.d/ 目录下,Apache 就会自动加载它。
步骤 4:禁用默认站点(可选)
在 CentOS 中,默认配置是 welcome.conf,你可以将其重命名或删除来禁用。
sudo mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak
步骤 5:检查并重启 Apache
在重启服务之前,务必检查配置文件是否有语法错误。
对于 Ubuntu/Debian:
# 检查语法 sudo apache2ctl configtest # 如果输出 "Syntax OK",则重启服务 sudo systemctl restart apache2
对于 CentOS/RHEL:
# 检查语法 sudo apachectl configtest # 如果输出 "Syntax OK",则重启服务 sudo systemctl restart httpd
步骤 6:测试
在浏览器中分别访问 http://site1.com 和 http://site2.com(请确保你的 DNS 已经生效),你应该能看到各自不同的欢迎页面。
基于IP地址的虚拟主机
这种方法较少用,但如果你有多个 IP 地址,配置方法类似。
假设情况:
- 网站1 (
site1.com) 使用 IP168.1.101 - 网站2 (
site2.com) 使用 IP168.1.102
步骤 1:为服务器配置多个IP地址
你的服务器需要配置好这两个 IP 地址,这通常通过修改网络配置文件实现。
步骤 2:创建虚拟主机配置文件
配置文件的结构略有不同,<VirtualHost> 指令中需要指定具体的 IP 地址。
# 网站1的配置 (使用 IP 192.168.1.101)
<VirtualHost 192.168.1.101:80>
ServerAdmin admin@site1.com
ServerName site1.com
DocumentRoot /var/www/site1.com/html
# ... (其他配置如 Directory, ErrorLog 等)
</VirtualHost>
# 网站2的配置 (使用 IP 192.168.1.102)
<VirtualHost 192.168.1.102:80>
ServerAdmin admin@site2.com
ServerName site2.com
DocumentRoot /var/www/site2.com/html
# ... (其他配置)
</VirtualHost>
步骤 3:检查并重启 Apache
sudo apachectl configtest sudo systemctl restart httpd # 或 apache2
访问 http://192.168.1.101 会看到网站1的内容,访问 http://192.168.1.102 会看到网站2的内容。
总结与建议
| 特性 | 基于域名的虚拟主机 | 基于IP地址的虚拟主机 |
|---|---|---|
| 适用场景 | 绝大多数多网站托管 | 每个网站需要独立IP的特殊场景 |
| 资源消耗 | 低,仅需一个IP | 高,每个网站一个IP |
| 配置复杂度 | 简单 | 稍复杂,需管理多个IP |
| DNS要求 | 所有域名指向同一IP | 每个域名指向对应IP |
| 推荐度 | ⭐⭐⭐⭐⭐ (首选) | ⭐⭐ (不常用) |
对于99%的需求,你都应该选择基于域名的虚拟主机,它高效、经济且易于管理,希望这份详细的指南能帮助你成功在 Apache 上搭建多个网站!
