在服务器管理领域,高效地利用资源是核心目标之一,对于许多个人开发者、小型企业乃至大型机构而言,在一台物理服务器或云主机上托管多个网站是一种常见且经济高效的解决方案,CentOS 以其稳定性和安全性,成为许多服务器的首选操作系统,而 Apache(在 CentOS 中通常称为 httpd)则是全球最流行的 Web 服务器软件之一,本文将详细介绍如何在 CentOS 系统上配置 Apache 服务器,以实现单一 IP 地址下托管多个独立网站的功能,这一过程主要通过 Apache 的虚拟主机技术来完成。
理解虚拟主机
虚拟主机是 Apache 提供的一项核心功能,它允许单个服务器实例响应针对多个不同域名或 IP 地址的请求,对于大多数场景而言,我们使用的是“基于名称的虚拟主机”,这意味着所有网站共享同一个 IP 地址,当用户的浏览器请求一个网站时,它会发送一个 Host
头部信息,告知服务器它想要访问的具体域名(www.example1.com
),Apache 服务器接收到请求后,会根据这个 Host
头部来匹配对应的虚拟主机配置,并返回相应网站的内容。
准备工作
在开始配置之前,请确保您已经具备以下条件:
- 一台已安装 CentOS 7 或更高版本的服务器。
- 拥有
sudo
或root
权限,以便执行系统管理命令。 - Apache Web 服务器(httpd)已安装,如果尚未安装,可以通过
sudo yum install httpd -y
命令进行安装。 - 您的域名(
site1.com
和site2.com
)的 DNS 记录已正确配置,将它们指向您服务器的公网 IP 地址。 - 防火墙已允许 HTTP(80 端口)和 HTTPS(443 端口)的流量,可以使用
sudo firewall-cmd --permanent --add-service=http
和sudo firewall-cmd --permanent --add-service=https
命令,然后执行sudo firewall-cmd --reload
。
配置多网站步骤
我们将以配置两个网站——site1.com
和 site2.com
——为例,逐步讲解整个过程。
创建网站目录结构
为每个网站创建独立的目录来存放其文件,这些目录位于 /var/www/
下。
# 为 site1.com 创建目录 sudo mkdir -p /var/www/site1.com/public_html # 为 site2.com 创建目录 sudo mkdir -p /var/www/site2.com/public_html
public_html
是一个约定俗成的名称,用于存放网站的实际文件(如 HTML, CSS, PHP 等)。
设置目录权限
为了确保 Apache 进程(在 CentOS 中默认以 apache
用户运行)能够读取和执行这些目录中的文件,我们需要正确设置所有权和权限。
# 更改目录所有者为 apache 用户 sudo chown -R apache:apache /var/www/site1.com sudo chown -R apache:apache /var/www/site2.com # 设置目录权限,确保所有者有读写执行权限,其他用户有读和执行权限 sudo chmod -R 755 /var/www
创建测试页面
为了验证配置是否成功,我们为每个网站创建一个简单的 index.html
文件。
# 为 site1.com 创建主页 echo "<html><head><title>欢迎来到 Site1</title></head><body><h1>Site1.com 网站运行成功!</h1></body></html>" | sudo tee /var/www/site1.com/public_html/index.html # 为 site2.com 创建主页 echo "<html><head><title>欢迎来到 Site2</title></head><body><h1>Site2.com 网站运行成功!</h1></body></html>" | sudo tee /var/www/site2.com/public_html/index.html
创建虚拟主机配置文件
Apache 的主配置文件是 /etc/httpd/conf/httpd.conf
,最佳实践不是直接修改此文件,而是在 /etc/httpd/conf.d/
目录下为每个网站创建独立的配置文件,Apache 会自动加载此目录下所有 .conf
结尾的文件。
为 site1.com
创建配置文件:
sudo vi /etc/httpd/conf.d/site1.com.conf
在文件中添加以下内容:
<VirtualHost *:80> ServerAdmin admin@site1.com ServerName site1.com ServerAlias www.site1.com DocumentRoot /var/www/site1.com/public_html ErrorLog /var/log/httpd/site1.com-error.log CustomLog /var/log/httpd/site1.com-access.log combined </VirtualHost>
同样,为 site2.com
创建配置文件:
sudo vi /etc/httpd/conf.d/site2.com.conf
注意修改 ServerName
, ServerAlias
, DocumentRoot
和日志文件路径:
<VirtualHost *:80> ServerAdmin admin@site2.com ServerName site2.com ServerAlias www.site2.com DocumentRoot /var/www/site2.com/public_html ErrorLog /var/log/httpd/site2.com-error.log CustomLog /var/log/httpd/site2.com-access.log combined </VirtualHost>
检查配置并重启 Apache
在应用新配置之前,最好先检查一下语法是否有误。
sudo apachectl configtest
如果屏幕显示 Syntax OK
,说明配置文件没有语法错误,现在可以安全地重启 Apache 服务以使更改生效。
sudo systemctl restart httpd
确保 Apache 服务已设置为开机自启:
sudo systemctl enable httpd
验证结果
在浏览器中分别访问 http://site1.com
和 http://site2.com
(DNS 尚未生效,可以通过修改本地 hosts
文件来测试),您应该能看到之前为每个网站创建的、内容不同的测试页面。
配置指令详解
下表小编总结了虚拟主机配置中一些关键指令的作用:
指令 | 描述 | 示例 |
---|---|---|
<VirtualHost *:80> | 定义一个虚拟主机块,*:80 表示监听所有 IP 地址的 80 端口 | <VirtualHost *:80> |
ServerAdmin | 网站管理员的电子邮件地址,会在错误页面显示 | ServerAdmin admin@site1.com |
ServerName | 网站的主域名,用于匹配请求 | ServerName site1.com |
ServerAlias | 网站的别名,可以指定多个,如带 www 的域名 | ServerAlias www.site1.com |
DocumentRoot | 网站文件存放的根目录 | DocumentRoot /var/www/site1.com/public_html |
ErrorLog | 指定该网站的错误日志文件路径 | ErrorLog /var/log/httpd/site1.com-error.log |
CustomLog | 指定该网站的访问日志文件路径及格式 | CustomLog /var/log/httpd/site1.com-access.log combined |
安全与维护
在 CentOS 上,SELinux(Security-Enhanced Linux)是一个重要的安全模块,有时,即使文件权限正确,SELinux 也可能阻止 Apache 访问新创建的目录,如果遇到 403 Forbidden 错误,可以检查并修改 SELinux 上下文:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/site1.com(/.*)?" sudo restorecon -Rv /var/www/site1.com sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/site2.com(/.*)?" sudo restorecon -Rv /var/www/site2.com
随着网站数量的增加,日志管理也变得重要,可以使用 logrotate
工具来自动压缩、删除和轮转日志文件,防止它们占满磁盘空间。
相关问答FAQs
问题1:我按照步骤操作了,但访问两个域名都显示的是同一个网站(通常是 Apache 默认测试页),这是为什么?
解答: 这个问题通常由以下几个原因造成:
- DNS 缓存: 您的本地计算机或网络中的 DNS 服务器可能仍有旧的缓存,请尝试清除浏览器缓存或使用其他设备访问。
- 配置文件未生效: 确保您的虚拟主机配置文件(
.conf
)确实在/etc/httpd/conf.d/
目录下,并且执行了sudo systemctl restart httpd
,可以运行sudo apachectl -S
命令,它会列出当前 Apache 已加载的所有虚拟主机及其配置,检查您的网站是否在其中且DocumentRoot
路径正确。 - 默认配置覆盖: 检查主配置文件
/etc/httpd/conf/httpd.conf
中是否有一个未被注释的、更宽泛的DocumentRoot
指令,它可能会在基于名称的虚拟主机匹配失败时作为默认选项,确保NameVirtualHost *:80
(在旧版本 Apache 中)或<VirtualHost *:80>
的配置是正确的。 - SELinux 问题: 如上文所述,SELinux 可能会阻止访问,检查
/var/log/audit/audit.log
中是否有httpd
相关的 AVC 拒绝日志,并使用semanage
和restorecon
命令修正文件上下文。
问题2:如何为这些网站添加 HTTPS 支持?
解答: 为网站启用 HTTPS(SSL/TLS)是现代 Web 的标准做法,最简单和免费的方法是使用 Let’s Encrypt 提供的 SSL 证书,您可以通过 certbot
工具来自动化这个过程。
- 安装 Certbot: 首先需要安装 EPEL 仓库,然后安装 Certbot 和其 Apache 插件,命令如下:
sudo yum install epel-release -y sudo yum install certbot python3-certbot-apache -y
- 获取并安装证书: Certbot 可以自动检测您的 Apache 虚拟主机配置,并为您获取和安装证书,运行以下命令,并将
site1.com
替换为您的域名:sudo certbot --apache -d site1.com -d www.site1.com
Certbot 会引导您完成几个步骤,包括输入电子邮件地址、同意服务条款等,成功后,它会自动修改您的 Apache 配置文件,添加 SSL 配置,并设置一个定时任务来自动续订证书。
- 为其他网站重复操作: 对您服务器上的每个网站重复上述第二步,为它们分别获取和安装 SSL 证书,完成后,您的网站就可以通过
https://
安全访问了。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复