在 CentOS 7 服务器上配置 Apache(httpd)的虚拟主机功能,可以让我们在同一台物理服务器上托管多个独立的网站,这极大地提高了服务器的资源利用率和成本效益,每个虚拟主机都可以拥有独立的域名、网站内容和配置,互不干扰,本文将详细介绍如何在 CentOS 7 系统上一步步配置基于域名的虚拟主机。

准备工作
在开始之前,请确保您已经具备以下条件:
- 一台已安装 CentOS 7 的服务器。
- 拥有 root 权限或 sudo 权限的用户账户。
- 服务器已配置静态 IP 地址。
- 已安装 Apache HTTP 服务器(httpd),如果尚未安装,可以使用以下命令进行安装:
sudo yum install httpd -y
- 确保防火墙允许 HTTP 和 HTTPS 流量:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
创建网站目录结构
为了保持文件系统的整洁,我们将为每个网站创建独立的目录,假设我们要配置两个网站:example.com 和 test.com。
# 为 example.com 创建目录 sudo mkdir -p /var/www/example.com/public_html # 为 test.com 创建目录 sudo mkdir -p /var/www/test.com/public_html
设置目录权限
新创建的目录默认属于 root 用户,我们需要将所有权授予 Apache 运行用户(通常是 apache),以便 Web 服务器能够读取和写入文件。
# 更改 example.com 目录的所有权 sudo chown -R apache:apache /var/www/example.com/public_html # 更改 test.com 目录的所有权 sudo chown -R apache:apache /var/www/test.com/public_html # 确保 /var/www 目录及其子目录具有正确的权限 sudo chmod -R 755 /var/www
创建测试页面
为了验证虚拟主机是否配置成功,我们为每个网站创建一个简单的 index.html 文件。
为 example.com 创建测试页面:
sudo vi /var/www/example.com/public_html/index.html
在文件中添加以下内容:
<html>
<head>欢迎来到 example.com</title>
</head>
<body>
<h1>成功!example.com 虚拟主机正在工作!</h1>
</body>
</html>
为 test.com 创建测试页面:
sudo vi /var/www/test.com/public_html/index.html
在文件中添加以下内容:
<html>
<head>欢迎来到 test.com</title>
</head>
<body>
<h1>成功!test.com 虚拟主机正在工作!</h1>
</body>
</html>
创建虚拟主机配置文件
Apache 的主配置文件是 /etc/httpd/conf/httpd.conf,为了更好的管理,我们通常将虚拟主机的配置文件放在 /etc/httpd/conf.d/ 目录下,Apache 会自动加载此目录下所有以 .conf 结尾的文件。

配置 example.com
创建 example.com.conf 文件:
sudo vi /etc/httpd/conf.d/example.com.conf
添加以下配置内容:
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog /var/www/example.com/error.log
CustomLog /var/www/example.com/requests.log combined
</VirtualHost>
配置 test.com
同样,创建 test.com.conf 文件:
sudo vi /etc/httpd/conf.d/test.com.conf
添加以下配置内容:
<VirtualHost *:80>
ServerName www.test.com
ServerAlias test.com
DocumentRoot /var/www/test.com/public_html
ErrorLog /var/www/test.com/error.log
CustomLog /var/www/test.com/requests.log combined
</VirtualHost>
以下是配置文件中关键指令的说明:
| 指令 | 描述 |
|---|---|
<VirtualHost *:80> |
定义一个监听所有 IP 地址 80 端口的虚拟主机。 |
ServerName |
虚拟主机的主域名。 |
ServerAlias |
虚拟主机的别名,可以设置多个,用空格隔开。 |
DocumentRoot |
网站文件存放的根目录。 |
ErrorLog |
错误日志文件的路径。 |
CustomLog |
访问日志文件的路径及格式。 |
测试配置并重启 Apache
在应用新配置之前,最好先检查一下配置文件的语法是否正确。
sudo apachectl configtest
如果屏幕显示 Syntax OK,说明配置没有问题,现在可以安全地重启 Apache 服务以使更改生效。
sudo systemctl restart httpd
建议将 httpd 服务设置为开机自启:
sudo systemctl enable httpd
本地测试
由于 example.com 和 test.com 是示例域名,您需要在您的本地计算机上修改 hosts 文件,将这两个域名指向您服务器的 IP 地址,以便进行测试。

- 在 Windows 上,编辑
C:WindowsSystem32driversetchosts文件。 - 在 Linux 或 macOS 上,编辑
/etc/hosts文件。
在文件末尾添加以下两行(请将 your_server_ip 替换为您服务器的实际 IP 地址):
your_server_ip www.example.com example.com
your_server_ip www.test.com test.com
保存文件后,在浏览器中分别访问 http://www.example.com 和 http://www.test.com,您应该能看到之前创建的各自对应的测试页面,至此,您已成功在 CentOS 7 上配置了两个基于域名的虚拟主机。
相关问答 (FAQs)
Q1: 我已经按照步骤操作,但访问网站时显示的是 Apache 默认页面,或者提示 403 Forbidden 错误,该怎么办?
A1: 这个问题通常由以下几个原因导致,请逐一排查:
- SELinux 安全上下文问题:CentOS 7 默认开启 SELinux,它可能会阻止 Apache 访问您新创建的目录,您可以使用以下命令修复目录的安全上下文:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www(/.*)?" sudo restorecon -Rv /var/www
- 防火墙问题:确认防火墙确实已经放行了 80 端口,可以使用
sudo firewall-cmd --list-all命令检查。 - 目录权限问题:再次确认
/var/www目录及其子目录的所有者是apache用户,并且权限设置正确(通常是 755)。 - 配置文件错误:运行
sudo apachectl configtest确保没有语法错误,并检查DocumentRoot路径是否与实际目录完全匹配。
Q2: 如何为我的虚拟主机启用 HTTPS (SSL/TLS)?
A2: 为网站启用 HTTPS 需要一个 SSL 证书,您可以从证书颁发机构(CA)购买,或者使用 Let’s Encrypt 获取免费证书,基本步骤如下:
- 安装 mod_ssl 模块:
sudo yum install mod_ssl -y
- 获取 SSL 证书:将您的证书文件(
certificate.crt)和私钥文件(private.key)上传到服务器的一个安全目录,如/etc/ssl/certs/和/etc/ssl/private/。 - 修改虚拟主机配置:在您的
.conf文件中,添加一个监听 443 端口的<VirtualHost *:443>块,并加入 SSL 相关配置:<VirtualHost *:443> ServerName www.example.com DocumentRoot /var/www/example.com/public_html SSLEngine on SSLCertificateFile /etc/ssl/certs/certificate.crt SSLCertificateKeyFile /etc/ssl/private/private.key # 其他日志配置... </VirtualHost> - 重启 Apache:保存配置后,重启 httpd 服务即可,建议同时配置 HTTP 到 HTTPS 的强制跳转。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!