介绍
Apache HTTP 服务器是世界上使用最广泛的 Web 服务器。 它提供了许多强大的功能,包括可动态加载的模块、强大的媒体支持以及与其他流行软件的广泛集成。
在本指南中,您将在 CentOS 8 服务器上安装带有虚拟主机的 Apache Web 服务器。
先决条件
您将需要以下内容来完成本指南:
- 在您的服务器上配置了 sudo 权限的非 root 用户,按照 CentOS 8 的 初始服务器设置指南进行设置。
- 确保按照上述指南中使用 CentOS 8(推荐)的初始服务器设置的 步骤 4 配置基本防火墙。
第 1 步 — 安装 Apache
Apache 在 CentOS 的默认软件存储库中可用,这意味着您可以使用 dnf
包管理器安装它。
作为先决条件中配置的非 root sudo 用户,安装 Apache 包:
sudo dnf install httpd
确认安装后,dnf
将安装 Apache 和所有必需的依赖项。
通过完成先决条件部分中提到的使用 CentOS 8 指南的初始服务器设置的 步骤 4,您将已经在您的服务器上安装 firewalld
以通过 HTTP 服务请求。
如果您还计划将 Apache 配置为通过 HTTPS 提供内容,您还需要通过启用 https
服务来打开端口 443
:
sudo firewall-cmd --permanent --add-service=https
接下来,重新加载防火墙以使这些新规则生效:
sudo firewall-cmd --reload
防火墙重新加载后,您就可以启动服务并检查 Web 服务器了。
第 2 步 — 检查您的 Web 服务器
安装完成后,Apache 不会在 CentOS 上自动启动,因此您需要手动启动 Apache 进程:
sudo systemctl start httpd
使用以下命令验证服务是否正在运行:
sudo systemctl status httpd
服务运行时,您将收到 active
状态:
Output● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disa> Active: active (running) since Thu 2020-04-23 22:25:33 UTC; 11s ago Docs: man:httpd.service(8) Main PID: 14219 (httpd) Status: "Running, listening on: port 80" Tasks: 213 (limit: 5059) Memory: 24.9M CGroup: /system.slice/httpd.service ├─14219 /usr/sbin/httpd -DFOREGROUND ├─14220 /usr/sbin/httpd -DFOREGROUND ├─14221 /usr/sbin/httpd -DFOREGROUND ├─14222 /usr/sbin/httpd -DFOREGROUND └─14223 /usr/sbin/httpd -DFOREGROUND ...
如该输出所示,服务已成功启动。 然而,最好的测试方法是从 Apache 请求一个页面。
您可以通过您的 IP 地址访问默认的 Apache 登录页面,以确认该软件正在正常运行。 如果您不知道服务器的 IP 地址,您可以从命令行通过几种不同的方式获取它。
键入 q
返回命令提示符,然后键入:
hostname -I
此命令将显示主机的所有网络地址,因此您将返回几个以空格分隔的 IP 地址。 您可以在 Web 浏览器中尝试每种方法,以确定它们是否有效。
或者,您可以使用 curl
从 icanhazip.com
请求您的 IP,这将为您提供从 Internet 上其他位置读取的公共 IPv4 地址:
curl -4 icanhazip.com
获得服务器的 IP 地址后,将其输入浏览器的地址栏中:
http://your_server_ip
您将看到默认的 CentOS 8 Apache 网页:
此页面表明 Apache 工作正常。 它还包括一些关于重要 Apache 文件和目录位置的基本信息。
第 3 步 — 管理 Apache 进程
现在服务已安装并运行,您现在可以使用不同的 systemctl 命令来管理服务。
要停止您的 Web 服务器,请键入:
sudo systemctl stop httpd
要在 Web 服务器停止时启动它,请键入:
sudo systemctl start httpd
要停止然后再次启动服务,请键入:
sudo systemctl restart httpd
如果您只是进行配置更改,Apache 通常可以重新加载而不会断开连接。 为此,请使用以下命令:
sudo systemctl reload httpd
默认情况下,Apache 配置为在服务器启动时自动启动。 如果这不是您想要的,请通过键入以下内容禁用此行为:
sudo systemctl disable httpd
要重新启用服务以在引导时启动,请键入:
sudo systemctl enable httpd
Apache 现在将在服务器再次启动时自动启动。
Apache 的默认配置将允许您的服务器托管单个网站。 如果您计划在服务器上托管多个域,则需要在 Apache Web 服务器上配置虚拟主机。
第 4 步 — 设置虚拟主机(推荐)
使用 Apache Web 服务器时,可以使用 虚拟主机 (如果您对 Nginx 比较熟悉,这些类似于服务器块)来封装配置细节并从单个服务器托管多个域。 在此步骤中,您将设置一个名为 example.com
的域,但您应该将其替换为您自己的域名。 如果您使用 DigitalOcean 设置域名,请参阅我们的 网络文档。
CentOS 8 上的 Apache 默认启用一个虚拟主机,配置为从 /var/www/html
目录提供文档。 虽然这适用于单个站点,但如果您托管多个站点,它可能会变得笨拙。 您将在 /var/www
中为 example.com
站点创建目录结构,而不是修改 /var/www/html
,如果出现以下情况,则将 /var/www/html
保留为默认目录客户端请求不匹配任何其他站点。
如下为 example.com
创建 html
目录,使用 -p
标志创建任何必要的父目录:
sudo mkdir -p /var/www/example.com/html
创建一个附加目录来存储站点的日志文件:
sudo mkdir -p /var/www/example.com/log
接下来,使用 $USER
环境变量分配 html
目录的所有权:
sudo chown -R $USER:$USER /var/www/example.com/html
确保您的 Web 根具有默认权限集:
sudo chmod -R 755 /var/www
接下来,使用 vi
或您喜欢的编辑器创建示例 index.html
页面:
sudo vi /var/www/example.com/html/index.html
按 i
切换到 INSERT
模式并将以下示例 HTML 添加到文件中:
/var/www/example.com/html/index.html
<html> <head> <title>Welcome to Example.com!</title> </head> <body> <h1>Success! The example.com virtual host is working!</h1> </body> </html>
按 ESC
,键入 :wq
,然后按 ENTER
保存并关闭文件。
准备好站点目录和示例索引文件后,您几乎可以创建虚拟主机文件了。 虚拟主机文件指定单独站点的配置,并告诉 Apache Web 服务器如何响应各种域请求。
在创建虚拟主机之前,您需要创建一个 sites-available
目录来存储它们。 您还将创建 sites-enabled
目录,告诉 Apache 虚拟主机已准备好为访问者提供服务。 sites-enabled
目录将包含指向我们要发布的虚拟主机的符号链接。 使用以下命令创建两个目录:
sudo mkdir /etc/httpd/sites-available /etc/httpd/sites-enabled
接下来,您将告诉 Apache 在 sites-enabled
目录中查找虚拟主机。 为此,请使用 vi 或您喜欢的文本编辑器编辑 Apache 的主配置文件,并添加一行声明附加配置文件的可选目录:
sudo vi /etc/httpd/conf/httpd.conf
按大写 G
导航到文件末尾。 然后按 i
切换到 INSERT
模式,并将以下行添加到文件的最后:
/etc/httpd/conf/httpd.conf
... # Supplemental configuration # # Load config files in the "/etc/httpd/conf.d" directory, if any. IncludeOptional conf.d/*.conf IncludeOptional sites-enabled/*.conf
添加完该行后,保存并关闭文件。 现在您已经有了虚拟主机目录,您将创建虚拟主机文件。
首先在 sites-available
目录中创建一个新文件:
sudo vi /etc/httpd/sites-available/example.com.conf
添加以下配置块,并将 example.com
域更改为您的域名:
/etc/httpd/sites-available/example.com.conf
<VirtualHost *:80> ServerName www.example.com ServerAlias example.com DocumentRoot /var/www/example.com/html ErrorLog /var/www/example.com/log/error.log CustomLog /var/www/example.com/log/requests.log combined </VirtualHost>
这将告诉 Apache 在哪里可以找到直接保存可公开访问的 Web 文档的根目录。 它还告诉 Apache 在哪里存储此特定站点的错误和请求日志。
完成后保存并关闭文件。
现在您已经创建了虚拟主机文件,您将启用它们,以便 Apache 知道将它们提供给访问者。 为此,请在 sites-enabled
目录中为每个虚拟主机创建一个符号链接:
sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf
您的虚拟主机现在已配置并准备好提供内容。 在重新启动 Apache 服务之前,让我们确保 SELinux 为您的虚拟主机制定了正确的策略。
第 5 步 — 调整虚拟主机的 SELinux 权限(推荐)
SELinux 是一个 Linux 内核安全模块,可为 Linux 系统带来更高的安全性。 CentOS 8 配备了 SELinux,配置为使用默认的 Apache 配置。 由于您通过在虚拟主机配置文件中设置自定义日志目录更改了默认配置,因此如果您尝试启动 Apache 服务,您将收到错误消息。 要解决此问题,您需要更新 SELinux 策略以允许 Apache 写入必要的文件。
由于 SELinux 允许您自定义安全级别,因此有多种方法可以根据您的环境需求设置策略。 此步骤将涵盖调整 Apache 策略的两种方法:通用和在特定目录上。 调整目录策略更安全,因此是推荐的方法。
全面调整 Apache 策略
通用设置 Apache 策略将告诉 SELinux 使用 httpd_unified
布尔值以相同的方式对待所有 Apache 进程。 虽然这种方法更方便,但它不会为您提供与专注于文件或目录策略的方法相同级别的控制。
运行以下命令以设置通用 Apache 策略:
sudo setsebool -P httpd_unified 1
setsebool
命令更改 SELinux 布尔值。 -P
标志将更新启动时间值,使此更改在重新启动后持续存在。 httpd_unified
是告诉 SELinux 将所有 Apache 进程视为相同类型的布尔值,因此您使用 1
的值启用它。
调整目录上的 Apache 策略
为 /var/www/example.com/log
目录单独设置 SELinux 权限将使您能够更好地控制 Apache 策略,但也可能需要更多维护。 由于此选项不是通用设置策略,因此您需要手动设置虚拟主机配置中指定的任何新日志目录的上下文类型。
首先,检查 SELinux 给 /var/www/example.com/log
目录的上下文类型:
sudo ls -dlZ /var/www/example.com/log/
此命令列出并打印目录的 SELinux 上下文。 您将收到类似于以下内容的输出:
Outputdrwxr-xr-x. 2 root root unconfined_u:object_r:httpd_sys_content_t:s0 6 Apr 23 23:51 /var/www/example.com/log/
当前上下文是 httpd_sys_content_t
,它告诉 SELinux Apache 进程只能读取在该目录中创建的文件。 在本教程中,您将 /var/www/example.com/log
目录的上下文类型更改为 httpd_log_t
。 这种类型将允许 Apache 生成并附加到 Web 应用程序日志文件:
sudo semanage fcontext -a -t httpd_log_t "/var/www/example.com/log(/.*)?"
接下来,使用 restorecon
命令应用这些更改并让它们在重新启动后保持不变:
sudo restorecon -R -v /var/www/example.com/log
-R
标志递归运行此命令,这意味着它将更新任何现有文件以使用新上下文。 -v
标志将打印命令所做的上下文更改。 您将收到以下确认更改的输出:
OutputRelabeled /var/www/example.com/log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
您可以再次列出上下文以查看更改:
sudo ls -dlZ /var/www/example.com/log/
输出反映了更新的上下文类型:
Outputdrwxr-xr-x. 2 root root unconfined_u:object_r:httpd_log_t:s0 6 Apr 23 23:51 /var/www/example.com/log/
现在 /var/www/example.com/log
目录使用 httpd_log_t
类型,您已准备好测试您的虚拟主机配置。
第 6 步 — 测试虚拟主机(推荐)
使用任一方法更新 SELinux 上下文后,Apache 将能够写入 /var/www/example.com/log
目录。 您现在可以成功重新启动 Apache 服务:
sudo systemctl restart httpd
列出 /var/www/example.com/log
目录的内容以查看 Apache 是否创建了日志文件:
ls -lZ /var/www/example.com/log
您将收到确认 Apache 能够创建虚拟主机配置中指定的 error.log
和 requests.log
文件:
Output-rw-r--r--. 1 root root system_u:object_r:httpd_log_t:s0 0 Apr 24 00:06 error.log -rw-r--r--. 1 root root system_u:object_r:httpd_log_t:s0 0 Apr 24 00:06 requests.log
现在您已经设置了虚拟主机并更新了 SELinux 权限,Apache 现在将为您的域名提供服务。 您可以通过导航到 http://example.com
进行测试,您应该会看到如下内容:
这确认您的虚拟主机已成功配置并提供内容。 重复第 4 步和第 5 步,为其他域创建具有 SELinux 权限的新虚拟主机。
结论
在本教程中,您安装并管理了 Apache Web 服务器。 现在您已经安装了 Web 服务器,对于可以提供的内容类型和可以用来创建更丰富体验的技术,您有很多选择。
如果您想构建更完整的应用程序堆栈,您可以查看这篇文章,了解如何在 CentOS 8 上配置 LAMP 堆栈。