基于名称的虚拟主机 和 基于 IP 地址的虚拟主机,对于绝大多数个人和商业网站,使用基于名称的虚拟主机是最佳选择。

核心概念:什么是虚拟主机?
虚拟主机是 Apache 的一项功能,它允许你根据不同的域名或 IP 地址,将访问请求指向到服务器上不同的网站目录,这样,当用户访问 www.siteA.com 时,Apache 会提供 A 网站的文件;当访问 www.siteB.com 时,则提供 B 网站的文件。
基于名称的虚拟主机 (最常用)
这是最流行的方法,因为它不需要为每个网站分配独立的 IP 地址,所有网站共享同一个 IP 地址。
准备工作
-
安装 Apache:如果你的服务器上还没有安装 Apache,请先安装。
- 在 Debian/Ubuntu 上:
sudo apt update && sudo apt install apache2 - 在 CentOS/RHEL 上:
sudo yum install httpd
- 在 Debian/Ubuntu 上:
-
创建网站目录:为每个网站创建一个独立的目录来存放其文件。
(图片来源网络,侵删)# 为 siteA.com 创建目录 sudo mkdir -p /var/www/siteA.com/html sudo mkdir -p /var/www/siteA.com/log # 为 siteB.com 创建目录 sudo mkdir -p /var/www/siteB.com/html sudo mkdir -p /var/www/siteB.com/log
-
设置目录权限:确保 Apache 服务进程(通常是
www-data或apache)有权读写这些目录。# 在 Debian/Ubuntu 上 sudo chown -R www-data:www-data /var/www/siteA.com/html /var/www/siteB.com/html sudo chmod -R 755 /var/www/siteA.com/html /var/www/siteB.com/html # 在 CentOS/RHEL 上 sudo chown -R apache:apache /var/www/siteA.com/html /var/www/siteB.com/html sudo chmod -R 755 /var/www/siteA.com/html /var/www/siteB.com/html
-
创建测试首页:在每个网站的
html目录下创建一个index.html文件,以便区分。# Site A 的首页 echo "<h1>Welcome to Site A</h1><p>This is the website for siteA.com</p>" | sudo tee /var/www/siteA.com/html/index.html # Site B 的首页 echo "<h1>Welcome to Site B</h1><p>This is the website for siteB.com</p>" | sudo tee /var/www/siteB.com/html/index.html
-
配置域名解析:在你的 DNS 服务器(通常是域名注册商提供的管理面板)上,将
siteA.com和siteB.com的 A 记录都指向你服务器的公网 IP 地址。
Apache 配置步骤
-
启用
mod_vhost_alias模块:
(图片来源网络,侵删)- 在 Debian/Ubuntu 上,这个模块通常是默认启用的,你可以用以下命令确认:
sudo a2query -m vhost_alias
如果返回
vhost_alias (enabled),则已启用,如果没有,使用sudo a2enmod vhost_alias启用它。 - 在 CentOS/RHEL 上,模块默认已加载。
- 在 Debian/Ubuntu 上,这个模块通常是默认启用的,你可以用以下命令确认:
-
创建虚拟主机配置文件:
-
最佳实践:不要直接修改主配置文件
apache2.conf或httpd.conf,而是为每个网站创建一个独立的配置文件。 -
在 Debian/Ubuntu 上:配置文件存放在
/etc/apache2/sites-available/目录下。# 创建 Site A 的配置文件 sudo nano /etc/apache2/sites-available/siteA.com.conf # 创建 Site B 的配置文件 sudo nano /etc/apache2/sites-available/siteB.com.conf
-
在 CentOS/RHEL 上:配置文件存放在
/etc/httpd/conf.d/目录下,任何以.conf结尾的文件都会被 Apache 自动加载。# 创建 Site A 的配置文件 sudo nano /etc/httpd/conf.d/siteA.com.conf # 创建 Site B 的配置文件 sudo nano /etc/httpd/conf.d/siteB.com.conf
-
-
编写配置文件内容: 下面是
siteA.com.conf的一个标准配置模板,请将ServerName和DocumentRoot替换为你自己的信息。<VirtualHost *:80> # 网站服务器的名称和可能的别名 ServerName siteA.com ServerAlias www.siteA.com # 网站根目录 DocumentRoot /var/www/siteA.com/html # 自定义日志文件路径 ErrorLog ${APACHE_LOG_DIR}/siteA.com_error.log CustomLog ${APACHE_LOG_DIR}/siteA.com_access.log combined # 可选:设置目录权限 <Directory /var/www/siteA.com/html> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>ServerName:你希望访问这个网站时使用的域名。ServerAlias:其他指向这个网站的域名(www前缀)。DocumentRoot:存放网站文件的根目录。ErrorLog和CustomLog:指定错误日志和访问日志的存放位置,方便排查问题。<Directory ...>:块用于设置DocumentRoot目录的访问权限。AllowOverride All允许使用.htaccess文件。
用同样的方式创建
siteB.com.conf,只需修改ServerName,ServerAlias和DocumentRoot即可。 -
启用并测试配置:
-
在 Debian/Ubuntu 上:
# 启用新创建的站点配置 sudo a2ensite siteA.com.conf sudo a2ensite siteB.com.conf # 禁用默认的站点(可选) sudo a2dissite 000-default.conf # 检查配置文件语法是否正确 sudo apache2ctl configtest # 如果输出 "Syntax OK",则表示配置正确
-
在 CentOS/RHEL 上:由于文件在
conf.d目录下会自动加载,无需额外命令。
-
-
重新加载 Apache 服务:
# 在 Debian/Ubuntu 上 sudo systemctl reload apache2 # 在 CentOS/RHEL 上 sudo systemctl reload httpd
当你访问 http://siteA.com 和 http://siteB.com 时,应该能看到各自不同的首页内容了。
基于 IP 地址的虚拟主机
这种方法为每个网站分配一个独立的 IP 地址,当一个服务器有多个网络接口,或者需要为每个网站提供 SSL 证书(在 HTTP/1.1 普及前很常见)时,可能会用到,由于 SNI (Server Name Indication) 技术的普及,一个 IP 可以支持多个 HTTPS 网站,所以这种方法已经不那么常见了。
配置步骤
-
为服务器配置多个 IP 地址:确保你的服务器已经配置了多个公网或内网 IP 地址。
168.1.10给 siteA,168.1.11给 siteB。
-
创建网站目录:和方法一一样,为每个网站创建独立的目录。
-
创建虚拟主机配置文件:配置文件的结构与基于名称的类似,但
<VirtualHost>指令中要指定具体的 IP 地址和端口。# 为 siteA.com (IP: 192.168.1.10) 创建配置 <VirtualHost 192.168.1.10:80> ServerName siteA.com DocumentRoot /var/www/siteA.com/html ErrorLog /var/log/apache2/siteA.com_error.log CustomLog /var/log/apache2/siteA.com_access.log combined </VirtualHost> # 为 siteB.com (IP: 192.168.1.11) 创建配置 <VirtualHost 192.168.1.11:80> ServerName siteB.com DocumentRoot /var/www/siteB.com/html ErrorLog /var/log/apache2/siteB.com_error.log CustomLog /var/log/apache2/siteB.com_access.log combined </VirtualHost> -
重启 Apache 服务:
# 在 Debian/Ubuntu 上 sudo systemctl restart apache2 # 在 CentOS/RHEL 上 sudo systemctl restart httpd
故障排除
如果配置完成后网站无法访问,请按以下步骤检查:
- 检查 DNS:使用
dig siteA.com或nslookup siteA.com确保域名已正确解析到服务器的 IP 地址。 - 检查防火墙:确保服务器的防火墙(如
ufw,firewalld或云服务商的安全组)允许 HTTP (80) 和 HTTPS (443) 端口的入站流量。- UFW:
sudo ufw allow 'Apache Full' - Firewalld:
sudo firewall-cmd --permanent --add-service=http && sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload
- UFW:
- 检查 Apache 服务状态:
sudo systemctl status apache2(Debian/Ubuntu)sudo systemctl status httpd(CentOS/RHEL) 确保服务是active (running)状态。
- 检查日志文件:这是最关键的步骤,查看你配置的
ErrorLog文件,里面会记录详细的错误信息,帮助你定位问题。tail -f /var/log/apache2/siteA.com_error.log
- 检查配置语法:在重启或重载服务前,务必运行
apache2ctl configtest或apachectl configtest检查语法错误。
| 特性 | 基于名称的虚拟主机 | 基于IP地址的虚拟主机 |
|---|---|---|
| 适用场景 | 绝大多数情况,节省 IP 资源 | 需要为每个网站分配独立 IP 的旧系统 |
| 实现方式 | 通过 ServerName 匹配域名 |
通过 IP 地址匹配 |
| 资源消耗 | 低,一个 IP 即可 | 高,每个网站需要一个 IP |
| 配置 | 更灵活,更常用 | 较为传统,不常用 |
对于绝大多数用户来说,请优先选择和使用基于名称的虚拟主机,它高效、灵活且是现代 Web 托管的标准做法。
