在Web服务器的管理中,能够在一台物理服务器上托管多个独立的网站是一项核心且高效的功能,Apache作为全球最流行的Web服务器软件之一,通过其强大的虚拟主机功能完美地实现了这一需求,本文将详细讲解如何在常见的Apache 2.4版本(通常与PHP 7.2等版本协同工作)环境中,基于域名配置多个虚拟主机,让您能够轻松管理多个网站。

需要明确一点,Apache的主版本号目前是2.x系列,如2.4,用户提到的“Apache 7.2”很可能指的是与之搭配的PHP版本,本文将以Apache 2.4和PHP 7.2的常见环境为例进行阐述,其配置原理适用于大多数现代Apache版本。
准备工作
在开始配置之前,请确保您已经具备以下条件:
- 一台已安装Apache Web服务器的服务器(操作系统以Ubuntu/Debian为例,CentOS/RHEL的路径和命令略有不同)。
- 拥有服务器的root权限或sudo权限。
- 至少两个已经解析到该服务器IP地址的域名,我们将使用
example1.com和example2.com作为示例域名。
核心配置步骤
配置多虚拟主机的核心思想是为每个域名创建一个独立的配置文件,指定其网站根目录、日志文件等信息,然后让Apache加载这些配置。
创建网站目录结构
为每个网站创建一个独立的目录来存放其文件,我们会在 /var/www/ 目录下为每个站点创建一个文件夹。
# 为 example1.com 创建目录 sudo mkdir -p /var/www/example1.com/public_html # 为 example2.com 创建目录 sudo mkdir -p /var/www/example2.com/public_html
public_html 子目录是一个良好实践,用于存放实际可被Web访问的文件。
设置目录权限
为了让Apache服务器能够读取和写入这些目录中的文件,我们需要将其所有权设置为Web服务器的运行用户(通常是 www-data)。
# 递归更改目录所有者 sudo chown -R www-data:www-data /var/www/example1.com sudo chown -R www-data:www-data /var/www/example2.com # 确保目录权限正确 sudo chmod -R 755 /var/www
创建虚拟主机配置文件
在基于Debian的系统(如Ubuntu)中,Apache的虚拟主机配置文件通常存放在 /etc/apache2/sites-available/ 目录,我们将为每个站点创建一个配置文件。

配置第一个虚拟主机
创建 example1.com.conf 文件:
sudo nano /etc/apache2/sites-available/example1.com.conf
在文件中填入以下内容:
<VirtualHost *:80>
# 管理员邮箱
ServerAdmin admin@example1.com
# 主域名
ServerName example1.com
# 别名,如 www.example1.com
ServerAlias www.example1.com
# 网站根目录
DocumentRoot /var/www/example1.com/public_html
# 错误日志
ErrorLog ${APACHE_LOG_DIR}/error_example1.log
# 访问日志
CustomLog ${APACHE_LOG_DIR}/access_example1.log combined
# 目录权限配置
<Directory /var/www/example1.com/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost> 这个配置块告诉Apache,当收到指向 example1.com 或 www.example1.com 的HTTP请求(端口80)时,应该服务 /var/www/example1.com/public_html 目录下的文件。
配置第二个虚拟主机
同样地,为 example2.com 创建配置文件:
sudo nano /etc/apache2/sites-available/example2.com.conf
```只需修改 `ServerName`、`ServerAlias`、`DocumentRoot` 和日志文件名即可:
```apache
<VirtualHost *:80>
ServerAdmin admin@example2.com
ServerName example2.com
ServerAlias www.example2.com
DocumentRoot /var/www/example2.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error_example2.log
CustomLog ${APACHE_LOG_DIR}/access_example2.log combined
<Directory /var/www/example2.com/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost> 启用虚拟主机并禁用默认站点
Apache不会自动加载 sites-available 中的所有配置,我们需要使用 a2ensite 命令来创建符号链接,将配置文件激活到 sites-enabled 目录。

# 启用新站点 sudo a2ensite example1.com.conf sudo a2ensite example2.com.conf # 禁用默认的Apache欢迎页面,避免冲突 sudo a2dissite 000-default.conf
测试并重启Apache
在应用新配置之前,最好先检查一下配置语法是否有误。
sudo apache2ctl configtest
如果屏幕显示 Syntax OK,说明配置没有问题,重启Apache服务使配置生效。
sudo systemctl restart apache2
验证配置
为了验证配置是否成功,可以在每个网站的根目录下创建一个简单的 index.html 文件。
# 为 example1.com 创建首页 echo "<h1>Welcome to example1.com!</h1>" | sudo tee /var/www/example1.com/public_html/index.html # 为 example2.com 创建首页 echo "<h1>Welcome to example2.com!</h1>" | sudo tee /var/www/example2.com/public_html/index.html
在浏览器中分别访问 http://example1.com 和 http://example2.com,您应该能看到对应的不同欢迎页面,至此,基于域名的多虚拟主机配置已全部完成。
相关问答FAQs
问题1:为什么我访问两个域名,打开的都是同一个网站(example1.com)?
解答: 这个问题通常由以下几个原因造成:
- 默认虚拟主机未禁用: 如果您没有禁用
000-default.conf,它可能会作为默认配置捕获所有未被明确匹配的请求,请确保已运行sudo a2dissite 000-default.conf。 - 配置文件语法错误: 检查您的虚拟主机配置文件,特别是
ServerName指令是否拼写正确且唯一,可以使用sudo apache2ctl configtest来排查语法错误。 - 未重启Apache: 修改配置文件后,必须重启Apache服务才能使更改生效,请确保已运行
sudo systemctl restart apache2。
问题2:我如何为不同的虚拟主机配置不同的PHP版本?
解答: Apache默认的 mod_php 模块一次只能加载一个PHP版本,要为不同站点运行不同PHP版本,最佳方案是使用PHP-FPM(FastCGI Process Manager),具体步骤如下:
- 安装所需的不同PHP版本及其对应的FPM包(
php7.2-fpm,php8.0-fpm)。 - 为每个PHP-FPM版本配置不同的监听端口或Socket(PHP 7.2监听
/run/php/php7.2-fpm.sock,PHP 8.0监听/run/php/php8.0-fpm.sock)。 - 在Apache中启用
proxy_fcgi和actions模块(sudo a2enmod proxy_fcgi actions)。 - 在每个虚拟主机的配置文件中,不再使用
mod_php,而是使用FilesMatch指令将.php文件的请求代理到对应的PHP-FPM Socket,为example1.com配置PHP 7.2,为example2.com配置PHP 8.0,这样就实现了基于虚拟主机的PHP版本隔离。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复