跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

24 Apache HTTP 服务器 编辑源文件

摘要

根据 https://www.netcraft.com/https://w3techs.com/ 的调查,Apache HTTP 服务器 (Apache) 是世界上最流行的 Web 服务器之一。它由 Apache 软件基金会 (https://apache.ac.cn/) 开发,适用于大多数操作系统。openSUSE® Leap 包含 Apache 2.4 版本。本章介绍了如何安装、配置和操作 Apache。它还展示了如何使用额外的模块,例如 SSL,以及如何排查 Apache 的问题。

24.1 快速入门 编辑源文件

本节帮助您快速配置和启动 Apache。您必须是 root 才能安装和配置 Apache。

24.1.1 要求 编辑源文件

在尝试设置 Apache Web 服务器之前,请确保满足以下要求

  1. 机器的网络已正确配置。有关此主题的更多信息,请参阅 第 13 章,基本网络

  2. 机器的精确系统时间通过与时间服务器同步来维护。这是必要的,因为 HTTP 协议的某些部分依赖于正确的时间。请参阅 第 18 章,使用 NTP 同步时间 以了解有关此主题的更多信息。

  3. 已安装最新的安全更新。如有疑问,请运行 YaST 在线更新。

  4. 防火墙中已打开默认 Web 服务器端口 (80)。为此,配置 firewalld 以允许公共区域中的服务 http。请参阅 “安全和加固指南”书籍,第 23 章“伪装和防火墙”,第 23.4.1 节“在命令行上配置防火墙” 以获取详细信息。

24.1.2 安装 编辑源文件

openSUSE Leap 上,Apache 默认情况下未安装。要使用标准、预定义的配置进行安装,该配置可以“开箱即用”地运行,请按以下步骤操作

过程 24.1: 使用默认配置安装 Apache
  1. 启动 YaST 并选择 软件 › 软件管理

  2. 选择 筛选 › 模式 并选择 Web 和 LAMP 服务器

  3. 确认安装依赖包以完成安装过程。

24.1.3 启动 编辑源文件

您可以自动在启动时启动 Apache,也可以手动启动它。

要确保 Apache 在 multi-user.targetgraphical.target 目标期间启动,请执行以下命令

> sudo systemctl enable apache2.service

有关 openSUSE Leapsystemd 目标以及 YaST 服务管理器的描述的更多信息,请参阅 第 10.4 节,“使用 YaST 管理服务”

要使用 shell 手动启动 Apache,请运行 systemctl start apache2.service

过程 24.2: 检查 Apache 是否正在运行

如果您在启动 Apache 时没有收到错误消息,通常表示 Web 服务器正在运行。要测试此

  1. 启动浏览器并打开 https:///

    如果 Apache 启动并正在运行,您将获得一个测试页面,其中显示 正常工作!

  2. 如果您看不到此页面,请参阅 第 24.9 节,“故障排除”

现在 Web 服务器正在运行,您可以添加自己的文档,根据需要调整配置,或通过安装模块添加功能。

24.2 配置 Apache 编辑源文件

openSUSE Leap 提供了两种配置选项

手动配置提供更高的详细程度,但缺乏 YaST GUI 的便利性。

Important
重要:在配置更改后重新加载或重新启动 Apache

大多数配置更改需要重新加载或重新启动 Apache 才能生效。使用 systemctl reload apache2.service 手动重新加载 Apache,或使用 第 24.3 节,“启动和停止 Apache” 中描述的重新启动选项之一。

如果您使用 YaST 配置 Apache,如果将 HTTP 服务 设置为 启用,如 第 24.2.3.2 节,“HTTP 服务器配置” 中所述,则可以自动处理此操作。

24.2.1 Apache 配置文件 编辑源文件

本节概述了 Apache 配置文件。如果您使用 YaST 进行配置,则无需触摸这些文件,但是这些信息对您以后切换到手动配置可能很有用。

Apache 配置文件位于两个不同的位置

24.2.1.1 /etc/sysconfig/apache2 编辑源文件

/etc/sysconfig/apache2 控制全局 Apache 设置,例如要加载的模块、要包含的附加配置文件、服务器应启动的标志以及应添加到命令行中的标志。此文件中的每个配置选项都经过了详细记录,因此此处未提及。对于通用 Web 服务器,/etc/sysconfig/apache2 中的设置应足以满足任何配置需求。

24.2.1.2 /etc/apache2/ 编辑源文件

/etc/apache2/ 托管 Apache 的所有配置文件。在以下内容中,解释了每个文件的用途。每个文件包含几个配置选项(也称为 指令)。这些文件中的每个配置选项都经过了详细记录,因此此处未提及。

Apache 配置文件组织如下

/etc/apache2/
     |
     |- charset.conv
     |- conf.d/
     |   |
     |   |- *.conf
     |
     |- default-server.conf
     |- errors.conf
     |- global.conf
     |- httpd.conf
     |- listen.conf
     |- loadmodule.conf
     |- magic
     |- mime.types
     |- mod_*.conf
     |- protocols.conf
     |- server-tuning.conf
     |- ssl-global.conf
     |- ssl.*
     |- sysconfig.d
     |   |
     |   |- global.conf
     |   |- include.conf
     |   |- loadmodule.conf . .
     |
     |- uid.conf
     |- vhosts.d
     |   |- *.conf
/etc/apache2/ 中的 Apache 配置文件
charset.conv

指定用于不同语言的字符集。不要编辑此文件。

conf.d/*.conf

其他模块添加的配置文件。这些配置文件可以在需要时包含到您的虚拟主机配置中。有关示例,请参阅 vhosts.d/vhost.template。通过这样做,您可以为不同的虚拟主机提供不同的模块集。

default-server.conf

所有虚拟主机的全局配置,具有合理的默认值。不要更改这些值,而是在虚拟主机配置中覆盖它们。

errors.conf

定义 Apache 如何响应错误。要为所有虚拟主机自定义这些消息,请编辑此文件。否则,在您的虚拟主机配置中覆盖这些指令。

global.conf

主 Web 服务器进程的常规配置,例如访问路径、错误日志或日志记录级别。

httpd.conf

主 Apache 服务器配置文件。避免更改此文件。它主要包含包含语句和全局设置。在相关的配置文件中覆盖全局设置,如这里列出的。将特定于主机的设置(例如文档根目录)更改为您的虚拟主机配置。

listen.conf

将 Apache 绑定到特定的 IP 地址和端口。基于名称的虚拟主机也在这里配置。有关详细信息,请参阅 第 24.2.2.1.1 节,“基于名称的虚拟主机”

magic

mime_magic 模块的数据,可帮助 Apache 自动确定未知文件的 MIME 类型。不要更改此文件。

mime.types

系统已知的 MIME 类型(这是指向 /etc/mime.types 的链接)。不要编辑此文件。如果您需要添加此处未列出的 MIME 类型,请将其添加到 mod_mime-defaults.conf

mod_*.conf

默认安装的模块的配置文件。有关详细信息,请参阅 第 24.4 节,“安装、激活和配置模块”。可选模块的配置文件位于 conf.d 目录中。

protocols.conf

配置通过 HTTP2 连接提供页面的指令。

server-tuning.conf

包含用于不同的 MPM(请参阅 第 24.4.4 节,“多进程模块”)和控制 Apache 性能的常规配置选项的配置指令。在进行更改时,请正确测试您的 Web 服务器。

ssl-global.confssl.*

全局 SSL 配置和 SSL 证书数据。有关详细信息,请参阅 第 24.6 节,“使用 SSL 设置安全的 Web 服务器”

sysconfig.d/*.conf

/etc/sysconfig/apache2 自动生成的配置文件。不要更改这些文件,而是编辑 /etc/sysconfig/apache2。不要将其他配置文件放在此目录中。

uid.conf

指定 Apache 在哪个用户和组 ID 下运行。不要更改此文件。

vhosts.d/*.conf

您的虚拟主机配置应位于此处。该目录包含带有和不带有 SSL 的虚拟主机模板文件。此目录中的每个以 .conf 结尾的文件都会自动包含到配置中。有关详细信息,请参阅 第 24.2.2.1 节,“虚拟主机配置”

24.2.2 手动配置 Apache 编辑源文件

手动配置 Apache 涉及编辑用户 root 的纯文本配置文件。

24.2.2.1 虚拟主机配置 编辑源文件

术语 虚拟主机 指的是 Apache 能够从同一物理机器提供多个统一资源标识符 (URI)。这意味着由一台物理机器上的单个 Web 服务器运行多个域,例如 www.example.com 和 www.example.net。

使用虚拟主机是一种常见的做法,可以节省管理工作(只需要维护一台 Web 服务器)和硬件费用(每个域不需要专用服务器)。虚拟主机可以是基于名称的、基于 IP 的或基于端口的。

要列出所有现有的虚拟主机,请使用命令 apache2ctl -S。这将输出一个列表,显示默认服务器和所有虚拟主机以及它们的 IP 地址和监听端口。此外,该列表还包含一个条目,显示每个虚拟主机在配置文件中的位置。

可以通过 YaST(如 第 24.2.3.1.4 节,“虚拟主机” 中所述)或通过手动编辑配置文件来配置虚拟主机。默认情况下,openSUSE Leap 准备在 /etc/apache2/vhosts.d/ 中为每个虚拟主机创建一个配置文件。此目录中的所有以 .conf 结尾的文件都会自动包含到配置中。此目录中提供了一个基本虚拟主机模板(vhost.templatevhost-ssl.template 用于带有 SSL 支持的虚拟主机)。

Tip
提示:始终创建一个虚拟主机配置文件

建议始终创建一个虚拟主机配置文件,即使您的 Web 服务器仅托管一个域。通过这样做,您不仅将特定于域的配置放在一个文件中,而且可以通过简单地移动、删除或重命名虚拟主机配置文件来恢复到工作基本配置。出于相同的原因,您还应该为每个虚拟主机创建单独的配置文件。

在使用基于名称的虚拟主机时,建议设置一个默认配置,当域名与虚拟主机配置不匹配时使用。默认虚拟主机是首先加载的配置。由于配置文件顺序由文件名决定,因此请使用下划线字符(_)作为默认虚拟主机配置文件的名称开头,以确保它首先被加载(例如:_default_vhost.conf)。

<VirtualHost></VirtualHost> 块包含适用于特定域的信息。当 Apache 接收到对已定义虚拟主机的客户端请求时,它会使用此部分中包含的指令。几乎所有指令都可以在虚拟主机上下文中使用的。有关 Apache 配置指令的更多信息,请参阅 https://httpd.apache.ac.cn/docs/2.4/mod/quickreference.html

24.2.2.1.1 基于名称的虚拟主机 编辑源文件

使用基于名称的虚拟主机,每个 IP 地址可以提供多个网站。Apache 使用客户端发送的 HTTP 标头中的 host 字段将请求连接到其中一个虚拟主机声明的匹配 ServerName 条目。如果没有找到匹配的 ServerName,则第一个指定的虚拟主机将用作默认值。

第一步是为要提供的每个不同的基于名称的主机创建一个 <VirtualHost> 块。在每个 <VirtualHost> 块内,您至少需要一个 ServerName 指令来指定提供哪个主机,以及一个 DocumentRoot 指令来显示该主机的内容在文件系统中的位置。

示例 24.1: 基于名称的 VirtualHost 条目的基本示例
<VirtualHost *:80>
# This first-listed virtual host is also the default for *:80
ServerName www.example.com
ServerAlias example.com
DocumentRoot /srv/www/htdocs/domain
</VirtualHost>

<VirtualHost *:80>
ServerName other.example.com
DocumentRoot /srv/www/htdocs/otherdomain
</VirtualHost>

在基于名称的虚拟主机配置中,打开 VirtualHost 标签将 IP 地址(或完全限定域名)作为参数。端口号指令是可选的。

通配符 * 也可以用作 IP 地址的替代。在使用 IPv6 地址时,必须将地址包含在方括号中。

示例 24.2: 基于名称的 VirtualHost 指令
<VirtualHost 192.168.3.100:80>
  ...
</VirtualHost>

<VirtualHost 192.168.3.100>
  ...
</VirtualHost>

<VirtualHost *:80>
  ...
</VirtualHost>

<VirtualHost *>
  ...
</VirtualHost>

<VirtualHost [2002:c0a8:364::]>
  ...
</VirtualHost>
24.2.2.1.2 基于 IP 的虚拟主机 编辑源文件

这种替代的虚拟主机配置需要为机器设置多个 IP 地址。一台 Apache 实例托管多个域,每个域分配不同的 IP。

物理服务器必须为每个基于 IP 的虚拟主机提供一个 IP 地址。如果机器没有多个网卡,也可以使用虚拟网络接口(IP 别名)。

以下示例显示了在 IP 192.168.3.100 上运行 Apache 的机器,在其他 IP 地址 192.168.3.101192.168.3.102 上托管两个域。每个虚拟服务器都需要一个单独的 VirtualHost 块。

示例 24.3: 基于 IP 的 VirtualHost 指令
<VirtualHost 192.168.3.101>
  ...
</VirtualHost>

<VirtualHost 192.168.3.102>
  ...
</VirtualHost>

这里,VirtualHost 指令仅针对除 192.168.3.100 之外的接口指定。当也为 192.168.3.100 配置了 Listen 指令时,必须创建单独的基于 IP 的虚拟主机来响应对该接口的 HTTP 请求——否则将应用默认服务器配置 (/etc/apache2/default-server.conf) 中找到的指令。

24.2.2.1.3 基本虚拟主机配置 编辑源文件

为了设置虚拟主机,每个虚拟主机配置中至少应包含以下指令。有关更多选项,请参阅 /etc/apache2/vhosts.d/vhost.template

ServerName

应将主机置于哪个完全限定域名下。

DocumentRoot

Apache 应该为该主机提供文件的目录路径。出于安全原因,默认情况下禁止访问整个文件系统,因此您必须在 Directory 容器内显式解锁此目录。

ServerAdmin

服务器管理员的电子邮件地址。此地址例如显示在 Apache 创建的错误页面上。

ErrorLog

此虚拟主机的错误日志文件。虽然不必为每个虚拟主机创建单独的错误日志文件,但这样做是一种常见的做法,因为它使调试错误更容易。 /var/log/apache2/ 是 Apache 日志文件的默认目录。

CustomLog

此虚拟主机的访问日志文件。虽然不必为每个虚拟主机创建单独的访问日志文件,但这样做是一种常见的做法,因为它允许对每个主机的访问统计信息进行单独分析。 /var/log/apache2/ 是 Apache 日志文件的默认目录。

如上所述,出于安全原因,默认情况下禁止访问整个文件系统。因此,显式解锁您放置 Apache 应该提供文件的目录,例如 DocumentRoot

<Directory "/srv/www/www.example.com/htdocs">
  Require all granted
</Directory>
Note
注意:Require all granted

在 Apache 的早期版本中,语句 Require all granted 表示为

Order allow,deny
Allow from all

此旧语法仍然受 mod_access_compat 模块的支持。

完整的配置文件如下所示

示例 24.4: 基本 VirtualHost 配置
<VirtualHost 192.168.3.100>
  ServerName www.example.com
  DocumentRoot /srv/www/www.example.com/htdocs
  ServerAdmin webmaster@example.com
  ErrorLog /var/log/apache2/www.example.com_log
  CustomLog /var/log/apache2/www.example.com-access_log common
  <Directory "/srv/www/www.example.com/htdocs">
  Require all granted
  </Directory>
</VirtualHost>

24.2.3 使用 YaST 配置 Apache 编辑源文件

要使用 YaST 配置 Web 服务器,请启动 YaST 并选择 网络服务 › HTTP 服务器。首次启动模块时,将启动 HTTP 服务器向导,提示您就服务器管理做出一些基本决策。完成向导后,每次调用 HTTP 服务器 模块时,将启动 HTTP 服务器配置 对话框。有关更多信息,请参阅 第 24.2.3.2 节,“HTTP 服务器配置”

24.2.3.1 HTTP 服务器向导 编辑源文件

HTTP 服务器向导由五个步骤组成。在对话框的最后一步中,您可以进入专家配置模式以进行更具体的设置。

24.2.3.1.1 网络设备选择 编辑源文件

在这里,指定 Apache 用于侦听传入请求的网络接口和端口。您可以选择任何现有网络接口及其各自的 IP 地址的组合。可以从所有三个范围(知名端口、已注册端口和动态或专用端口)使用未被其他服务保留的端口。默认设置是在所有网络接口(IP 地址)的端口 80 上侦听。

选中 在防火墙中打开端口,以在 Web 服务器侦听的防火墙中打开端口。这对于使 Web 服务器在网络上可用(可以是 LAN、WAN 或公共互联网)是必要的。仅在测试情况下,不需要对 Web 服务器的外部访问时,才保持端口关闭是有用的。如果您有多个网络接口,请单击 防火墙详细信息 以指定应在哪个接口上打开端口。

单击 下一步 以继续配置。

24.2.3.1.2 模块 编辑源文件

模块 配置选项允许激活或停用 Web 服务器应支持的脚本语言。要激活或停用其他模块,请参阅 第 24.2.3.2.2 节,“服务器模块”。单击 下一步 以进入下一个对话框。

24.2.3.1.3 默认主机 编辑源文件

此选项与默认 Web 服务器有关。如 第 24.2.2.1 节,“虚拟主机配置” 中所述,Apache 可以从一台物理机器提供多个虚拟主机。配置文件中首先声明的虚拟主机通常称为 默认主机。每个虚拟主机继承默认主机的配置。

要编辑主机设置(也称为 指令),请在表中选择相应的条目,然后单击 编辑。要添加新指令,请单击 添加。要删除指令,请选择它并单击 删除

HTTP server wizard: default host
图 24.1: HTTP 服务器向导:默认主机

以下是服务器的默认设置列表

文档根目录

Apache 提供此主机文件的目录路径。 /srv/www/htdocs 是默认位置。

别名

使用 Alias 指令,可以将 URL 映射到文件系统位置。这意味着即使在文件系统中的 DocumentRoot 之外的某个路径也可以通过将该路径别名的 URL 访问。

默认 openSUSE Leap Alias /icons 指向 /usr/share/apache2/icons,用于在目录索引视图中显示的 Apache 图标。

ScriptAlias

Alias 指令类似,ScriptAlias 指令将 URL 映射到文件系统位置。不同之处在于,ScriptAlias 将目标目录指定为 CGI 位置,这意味着在该位置应执行 CGI 脚本。

目录

使用 Directory 设置,您可以封闭仅适用于指定目录的配置选项组。

此处配置了目录 /srv/www/htdocs/usr/share/apache2/icons/srv/www/cgi-bin 的访问和显示选项。通常不需要更改默认值。

包含

使用 include,可以指定其他配置文件。预配置了两个 Include 指令:/etc/apache2/conf.d/ 是包含来自外部模块的配置文件的目录。使用此指令,所有以 .conf 结尾的该目录中的文件都将被包含。使用第二个指令,/etc/apache2/conf.d/apache2-manual.conf,将包含 apache2-manual 配置文件。

服务器名称

这指定了客户端用于联系 Web 服务器的默认 URL。使用完全限定域名 (FQDN) 来访问 Web 服务器 http://FQDN/ 或其 IP 地址。您不能在此处选择任意名称——服务器必须以该名称 已知

服务器管理员电子邮件

服务器管理员的电子邮件地址。此地址例如显示在 Apache 创建的错误页面上。

完成 默认主机 步骤后,单击 下一步 以继续配置。

24.2.3.1.4 虚拟主机 编辑源文件

在此步骤中,向导将显示已配置的虚拟主机列表(请参阅 第 24.2.2.1 节,“虚拟主机配置”)。如果您在启动 YaST HTTP 向导之前没有进行手动更改,则不存在虚拟主机。

要添加主机,请单击 添加 以打开一个对话框,您可以在其中输入有关主机的基本信息,例如 服务器名称服务器内容根目录 (DocumentRoot) 和 管理员电子邮件服务器解析 用于确定如何识别主机(基于名称或基于 IP)。使用 更改虚拟主机 ID 指定名称或 IP 地址

单击 下一步 将进入虚拟主机配置对话框的第二部分。

在虚拟主机配置的第二部分,您可以指定是否启用 CGI 脚本以及使用哪个目录来存储这些脚本。还可以启用 SSL。如果这样做,则必须指定证书的路径。有关 SSL 和证书的详细信息,请参阅 第 24.6.2 节,“使用 SSL 配置 Apache”。使用 目录索引 选项,您可以指定在客户端请求目录时显示哪个文件(默认情况下,index.html)。要更改此设置,请添加一个或多个文件名(用空格分隔)。使用 启用公共 HTML,用户的公共目录 (~USER/public_html/) 的内容将通过 http://www.example.com/~USER 在服务器上提供。

Important
重要提示:创建虚拟主机

无法随意添加虚拟主机。如果使用基于名称的虚拟主机,则每个主机名必须在网络上解析。如果使用基于 IP 的虚拟主机,则只能将一个主机分配给每个可用的 IP 地址。

24.2.3.1.5 摘要 编辑源文件

这是向导的最后一步。在这里,确定 Apache 服务器的启动方式和时间:启动时或手动启动。同时,查看迄今为止所做的配置的简短摘要。如果您对您的设置感到满意,请单击 完成 以完成配置。要更改某些内容,请单击 返回,直到您到达所需的对话框。单击 HTTP 服务器专家配置 将打开 第 24.2.3.2 节,“HTTP 服务器配置” 中描述的对话框。

HTTP server wizard: summary
图 24.2: HTTP 服务器向导:摘要

24.2.3.2 HTTP 服务器配置 编辑源文件

HTTP 服务器配置”对话框还允许您对配置进行比向导(仅在首次配置 Web 服务器时运行)更多的调整。它由以下四个选项卡组成。您所做的任何配置更改都不会立即生效——您始终必须使用 完成 确认您的更改才能使其生效。单击 中止 将离开配置模块并丢弃您的更改。

24.2.3.2.1 监听端口和地址 编辑源文件

HTTP 服务 中,选择 Apache 是否应运行 (启用) 或停止 (禁用)。在 监听端口 中,添加编辑删除 服务器应可用的地址和端口。默认情况下,监听所有接口上的端口 80。您应始终选中 在防火墙中打开端口,因为否则 Web 服务器将无法从外部访问。仅在测试情况下,不需要对 Web 服务器的外部访问时,才应保持端口关闭。如果您有多个网络接口,请单击 防火墙详细信息 以指定应在哪个接口上打开端口。

使用 日志文件,可以监视访问日志文件或错误日志文件。如果您想测试您的配置,这将很有用。日志文件将在一个单独的窗口中打开,您还可以从该窗口重新启动或重新加载 Web 服务器。有关详细信息,请参阅 第 24.3 节,“启动和停止 Apache”。这些命令立即生效,并且其日志消息也会立即显示。

HTTP server configuration: listen ports and addresses
图 24.3: HTTP 服务器配置:监听端口和地址
24.2.3.2.2 服务器模块 编辑源文件

通过单击 切换状态,可以更改 Apache2 模块的状态(启用或禁用)。单击 添加模块 以添加一个已安装但尚未列出的新模块。有关模块的详细信息,请参阅 第 24.4 节,“安装、激活和配置模块”

HTTP server configuration: server modules
图 24.4: HTTP 服务器配置:服务器模块
24.2.3.2.3 主主机或主机 编辑源文件

这些对话框与已经描述的对话框相同。请参阅 第 24.2.3.1.3 节,“默认主机”第 24.2.3.1.4 节,“虚拟主机”

24.3 启动和停止 Apache 编辑源文件

如果使用 YaST 配置(如 第 24.2.3 节,“使用 YaST 配置 Apache” 中所述),Apache 在 multi-user.targetgraphical.target 中启动时启动。您可以使用 YaST 的 服务管理器systemctl 命令行工具 (systemctl enablesystemctl disable) 更改此行为。

要在正在运行的系统上启动、停止或操作 Apache,请使用以下 systemctlapachectl 命令(如下所述)。

有关 systemctl 命令的一般信息,请参阅 第 10.2.1 节,“管理正在运行的系统中的服务”

systemctl status apache2.service

检查 Apache 是否已启动。

systemctl start apache2.service

如果 Apache 尚未运行,则启动 Apache。

systemctl stop apache2.service

通过终止父进程来停止 Apache。

systemctl restart apache2.service

停止然后重新启动 Apache。如果 Web 服务器之前未运行,则启动 Web 服务器。

systemctl try-restart apache2.service

仅当 Apache 已经运行时,才停止然后重新启动 Apache。

systemctl reload apache2.service

通过建议所有分叉的 Apache 进程先完成其请求,然后再关闭来停止 Web 服务器。随着每个进程的死亡,它会被新启动的进程取代,从而导致 Apache 的完整 重新启动

Tip
提示:在生产环境中重新启动 Apache

此命令允许在不导致连接中断的情况下激活 Apache 配置中的更改。

systemctl stop apache2.service

在配置了 GracefulShutdownTimeout 的定义时间内停止 Web 服务器,以确保可以完成现有请求。

apachectl configtest

检查配置文件的语法,而不影响正在运行的 Web 服务器。由于每次启动、重新加载或重新启动服务器时都会强制执行此检查,因此通常不需要显式运行测试(如果发现配置错误,Web 服务器将不会启动、重新加载或重新启动)。

apachectl statusapachectl fullstatus

分别转储简短或完整的状态屏幕。需要启用 mod_status 模块并安装基于文本的浏览器(例如 linksw3m)。此外,必须将 STATUS 添加到 APACHE_SERVER_FLAGS 中,位于文件 /etc/sysconfig/apache2 中。

Tip
提示:其他标志

如果您为命令指定了其他标志,这些标志将传递给 Web 服务器。

24.4 安装、激活和配置模块 编辑源文件

Apache 软件以模块化的方式构建:所有功能(某些核心任务除外)都由模块处理。这已经发展到 HTTP 甚至由一个模块 (http_core) 处理的程度。

Apache 模块可以在构建时编译到 Apache 二进制文件中,也可以在运行时动态加载。有关如何动态加载模块的详细信息,请参阅 第 24.4.2 节,“激活和停用”

Apache 模块组织成以下类别

基础模块

基础模块默认编译到 Apache 中。在 openSUSE Leap 中,只有 mod_so(需要加载其他模块)和 http_core 被编译进去。所有其他模块都作为共享对象提供:而不是包含在服务器二进制文件中,它们可以在运行时包含在内。

扩展模块

标记为扩展的模块包含在 Apache 软件包中,但通常不会静态编译到服务器中。在 openSUSE Leap 中,它们作为可以在运行时加载到 Apache 中的共享对象提供。

外部模块

标记为外部的模块不包含在官方 Apache 发行版中。但是,openSUSE Leap 提供了其中几个。

多进程模块 (MPM)

MPM 负责接受和处理对 Web 服务器的请求,代表 Web 服务器软件的核心。

24.4.1 模块安装 编辑源文件

如果您执行了如 第 24.1.2 节,“安装” 中所述的默认安装,则已经安装了以下模块:所有基础和扩展模块、多进程模块 Prefork MPM 以及外部模块 mod_python

您可以通过启动 YaST 并选择 软件 › 软件管理 来安装其他外部模块。现在选择 查看 › 搜索 并搜索 apache。在结果列表中,包含所有可用的外部 Apache 模块。

24.4.2 激活和停用 编辑源文件

手动或使用 YaST 激活或停用特定模块。在 YaST 中,脚本语言模块(PHP 8 和 Python)需要使用 第 24.2.3.1 节,“HTTP 服务器向导” 中描述的模块配置来启用或禁用。所有其他模块可以按照 第 24.2.3.2.2 节,“服务器模块” 中所述的方式启用或禁用。

如果您希望手动激活或停用模块,请使用命令 a2enmod MODULEa2dismod MODULEa2enmod -l 输出当前所有已激活模块的列表。

Important
重要:包含外部模块的配置文件

如果您手动激活了外部模块,请确保在所有虚拟主机配置中加载其配置文件。外部模块的配置文件位于 /etc/apache2/conf.d/ 中,默认在 /etc/apache2/default-server.conf 中加载。为了更精细的控制,您可以取消在 /etc/apache2/default-server.conf 中包含的注释,并仅将其添加到特定的虚拟主机中。请参阅 /etc/apache2/vhosts.d/vhost.template 以获取示例。

24.4.3 基础和扩展模块 编辑源文件

所有基础和扩展模块都在 Apache 文档中进行了详细描述。此处仅提供对最重要模块的简要描述。请参阅 https://httpd.apache.ac.cn/docs/2.4/mod/ 以了解有关每个模块的详细信息。

mod_actions

提供了一种方法,可以在请求特定 MIME 类型(例如 application/pdf)、具有特定扩展名的文件(例如 .rpm)或特定请求方法(例如 GET)时执行脚本。此模块默认启用。

mod_alias

提供 AliasRedirect 指令,可以使用这些指令将 URL 映射到特定目录 (Alias) 或将请求的 URL 重定向到另一个位置。此模块默认启用。

mod_auth*

身份验证模块提供不同的身份验证方法:使用 mod_auth_basic 进行基本身份验证或使用 mod_auth_digest 进行摘要身份验证。

mod_auth_basicmod_auth_digest 必须与身份验证提供程序模块 mod_authn_*(例如,基于文本文件的身份验证的 mod_authn_file)和授权模块 mod_authz_*(例如,用户授权的 mod_authz_user)结合使用。

有关此主题的更多信息,请参阅 身份验证 HOWTO,网址为 https://httpd.apache.ac.cn/docs/2.4/howto/auth.html

mod_auth_openidc

mod_auth_openidc 是使用 Apache HTTP 服务器的 OpenID Connect 的唯一经过认证的方法。(请参阅 https://openid.net/developers/certified-openid-connect-implementations/。)

mod_autoindex

Autoindex 在没有索引文件(例如 index.html)存在时生成目录列表。可以配置这些索引的外观。此模块默认启用。但是,目录列表默认通过 Options 指令禁用——在您的虚拟主机配置中覆盖此设置。此模块的默认配置文件位于 /etc/apache2/mod_autoindex-defaults.conf

mod_cgi

mod_cgi 需要执行 CGI 脚本。此模块默认启用。

mod_deflate

使用此模块,可以配置 Apache 在交付之前动态压缩给定的文件类型。

mod_dir

mod_dir 提供 DirectoryIndex 指令,可以使用该指令配置在请求目录时自动交付哪些文件(默认情况下为 index.html)。它还提供了一种自动重定向到正确 URL 的方法,当目录请求不包含尾部斜杠时。

mod_env

控制传递给 CGI 脚本或 SSI 页面的环境。环境变量可以被设置或取消设置,或者从调用 httpd 进程的 shell 传递。此模块默认启用。

mod_expires

使用 mod_expires,你可以通过发送 Expires 头来控制代理和浏览器缓存刷新文档的频率。此模块默认启用。

mod_http2

使用 mod_http2,Apache 获得对 HTTP/2 协议的支持。可以通过在 VirtualHost 中指定 Protocols h2 http/1.1 来启用它。

mod_include

mod_include 允许你使用服务器端包含 (SSI),它提供了一种基本的功能来动态生成 HTML 页面。此模块默认启用。

mod_info

在 https:///server-info/ 下提供服务器配置的全面概述。出于安全原因,你应该始终限制对该 URL 的访问。默认情况下,只有 localhost 才能访问此 URL。 mod_info/etc/apache2/mod_info.conf 中配置。

mod_log_config

使用此模块,你可以配置 Apache 日志文件的外观。此模块默认启用。

mod_mime

mime 模块确保文件根据文件名扩展名(例如,HTML 文档的 text/html)以正确的 MIME 头传递。此模块默认启用。

mod_negotiation

内容协商所必需的。有关更多信息,请参阅 https://httpd.apache.ac.cn/docs/2.4/content-negotiation.html。此模块默认启用。

mod_rewrite

提供了 mod_alias 的功能,但提供了更多的功能和灵活性。使用 mod_rewrite,你可以根据多个规则、请求头等重定向 URL。

mod_setenvif

根据客户端请求的详细信息(例如客户端发送的浏览器字符串或客户端的 IP 地址)设置环境变量。此模块默认启用。

mod_spelling

mod_spelling 尝试自动更正 URL 中的拼写错误,例如大小写错误。

mod_ssl

启用 Web 服务器和客户端之间的加密连接。有关详细信息,请参阅 第 24.6 节,“使用 SSL 设置安全的 Web 服务器”。此模块默认启用。

mod_status

在 https:///server-status/ 下提供服务器活动和性能信息。出于安全原因,你应该始终限制对该 URL 的访问。默认情况下,只有 localhost 才能访问此 URL。 mod_status/etc/apache2/mod_status.conf 中配置。

mod_suexec

mod_suexec 允许你以不同的用户和组运行 CGI 脚本。此模块默认启用。

mod_userdir

启用用户特定目录,可在 ~USER/ 下访问。配置中必须指定 UserDir 指令。此模块默认启用。

24.4.4 多进程模块 编辑源文件

openSUSE Leap 提供两种不同的多进程模块 (MPM) 供 Apache 使用

24.4.4.1 Prefork MPM 编辑源文件

Prefork MPM 实现了一个非线程化的、预分叉的 Web 服务器。它使 Web 服务器的行为类似于 Apache 1.x 版本。在此版本中,它隔离每个请求并由单独的子进程分叉来处理它。因此,有问题请求不会影响其他请求,从而避免 Web 服务器锁定。

虽然通过这种基于进程的方法提供稳定性,但 Prefork MPM 比其对应模块 Worker MPM 消耗更多的系统资源。Prefork MPM 被认为是基于 Unix 的操作系统的默认 MPM。

Important
重要:本文档中的 MPM

本文档假定 Apache 使用 Prefork MPM。

24.4.4.2 Worker MPM 编辑源文件

Worker MPM 提供了一个多线程 Web 服务器。线程是进程的“较轻”形式。线程相对于进程的优势在于其较低的资源消耗。Worker MPM 不仅分叉子进程,还使用线程和服务器进程来服务请求。预分叉的子进程是多线程的。这种方法通过消耗比 Prefork MPM 更少的系统资源来提高 Apache 的性能。

一个主要缺点是 Worker MPM 的稳定性:如果一个线程损坏,则该进程的所有线程都可能受到影响。在最坏的情况下,这可能导致服务器崩溃。尤其是在高负载下使用 Apache 的通用网关接口 (CGI) 时,由于线程无法与系统资源通信,可能会发生内部服务器错误。另一个反对在 Worker MPM 中使用 Apache 的论点是,并非所有可用的 Apache 模块都是线程安全的,因此无法与 Worker MPM 一起使用。

Warning
警告:使用 PHP 模块与 MPM

并非所有可用的 PHP 模块都是线程安全的。强烈建议不要使用 Worker MPM 与 mod_php

24.4.5 外部模块 编辑源文件

在此处查找随 openSUSE Leap 提供的所有外部模块的列表。在列出的目录中查找模块的文档。

mod_apparmor

添加对 Apache 的支持,以便为由 mod_php8 等模块处理的单个 CGI 脚本提供 AppArmor 限制。

软件包名称:apache2-mod_apparmor
更多信息:“安全和加固指南”
mod_php8

PHP 是一种服务器端、跨平台 HTML 嵌入式脚本语言。

软件包名称:apache2-mod_php8
配置文件:/etc/apache2/conf.d/php8.conf
mod_python

mod_python 允许将 Python 嵌入到 Apache HTTP 服务器中,从而大大提高性能并增加设计基于 Web 的应用程序的灵活性。

软件包名称:apache2-mod_python
更多信息:/usr/share/doc/packages/apache2-mod_python
mod_security

mod_security 提供了一个 Web 应用程序防火墙,以保护 Web 应用程序免受各种攻击。它还支持 HTTP 流量监控和实时分析。

软件包名称:apache2-mod_security2
配置文件:/etc/apache2/conf.d/mod_security2.conf
更多信息:/usr/share/doc/packages/apache2-mod_security2
文档:https://github.com/owasp-modsecurity/ModSecurity

24.4.6 编译 编辑源文件

Apache 可以通过高级用户编写自定义模块来扩展。要为 Apache 开发模块或编译第三方模块,需要 apache2-devel 软件包以及相应的开发工具。 apache2-devel 还包含 apxs2 工具,这些工具对于为 Apache 编译其他模块是必需的。

apxs2 能够从源代码(包括对配置文件的必要更改)编译和安装模块,从而创建可以在运行时加载到 Apache 中的动态共享对象 (DSO)。

apxs2 二进制文件位于 /usr/sbin

  • /usr/sbin/apxs2—适用于构建适用于任何 MPM 的扩展模块。安装位置是 /usr/lib64/apache2

  • /usr/sbin/apxs2-prefork—适用于 prefork MPM 模块。安装位置是 /usr/lib64/apache2-prefork

  • /usr/sbin/apxs2-worker—适用于 worker MPM 模块。安装位置是 /usr/lib64/apache2-worker

使用以下命令从源代码安装和激活模块

> sudo cd /path/to/module/source
> sudo apxs2 -cia MODULE.c

其中 -c 编译模块,-i 安装模块,-a 激活模块。 apxs2 的其他选项在 apxs2(1) man 页中描述。

24.5 启用 CGI 脚本 编辑源文件

Apache 的通用网关接口 (CGI) 允许你使用程序或脚本(CGI 脚本)创建动态内容。CGI 脚本可以用任何编程语言编写。

为了使 Apache 能够传递由 CGI 脚本创建的内容,需要激活 mod_cgi。还需要 mod_alias。这两个模块默认启用。有关激活模块的详细信息,请参阅 第 24.4.2 节,“激活和停用”

Warning
警告:CGI 安全

允许服务器执行 CGI 脚本是一个潜在的安全漏洞。有关更多信息,请参阅 第 24.8 节,“避免安全问题”

24.5.1 Apache 配置 编辑源文件

openSUSE Leap 中,CGI 脚本的执行仅允许在目录 /srv/www/cgi-bin/ 中进行。此位置已配置为执行 CGI 脚本。如果您创建了虚拟主机配置(请参阅 第 24.2.2.1 节,“虚拟主机配置”)并希望将脚本放在特定于主机的目录中,则必须解锁并配置此目录。

示例 24.5:VirtualHost CGI 配置
ScriptAlias /cgi-bin/ "/srv/www/www.example.com/cgi-bin/"1

<Directory "/srv/www/www.example.com/cgi-bin/">
 Options +ExecCGI2
 AddHandler cgi-script .cgi .pl3
 Require all granted4
</Directory>

1

告诉 Apache 将此目录中的所有文件作为 CGI 脚本处理。

2

启用 CGI 脚本执行

3

告诉服务器将扩展名为 .pl 和 .cgi 的文件视为 CGI 脚本。根据需要进行调整。

4

Require 指令控制默认访问状态。在这种情况下,允许对指定的目录进行无限制的访问。有关身份验证和授权的更多信息,请参阅 https://httpd.apache.ac.cn/docs/2.4/howto/auth.html

24.5.2 运行示例脚本 编辑源文件

CGI 编程与“常规”编程的不同之处在于,CGI 程序和脚本必须以 MIME 类型标头开头,例如 Content-type: text/html。此标头发送给客户端,以便客户端了解它接收到的内容类型。其次,脚本的输出必须是客户端(通常是 Web 浏览器)可以理解的内容——HTML 或纯文本或图像,例如。

Apache 包中的一个简单测试脚本位于 /usr/share/doc/packages/apache2/test-cgi。它以纯文本形式输出某些环境变量的内容。将此脚本复制到 /srv/www/cgi-bin/ 或虚拟主机的脚本目录(/srv/www/www.example.com/cgi-bin/)并将其命名为 test.cgi。将文件编辑为以 #!/bin/sh 作为第一行。

Web 服务器可访问的文件应由用户 root 拥有。有关更多信息,请参阅 第 24.8 节,“避免安全问题”。由于 Web 服务器以不同的用户身份运行,因此 CGI 脚本必须是世界可执行和世界可读的。更改到 CGI 目录并使用命令 chmod 755 test.cgi 应用适当的权限。

现在调用 https:///cgi-bin/test.cgihttp://www.example.com/cgi-bin/test.cgi。你应该看到“CGI/1.0 测试脚本报告”。

24.5.3 CGI 故障排除 编辑源文件

如果您没有看到测试程序的输出,而是看到错误消息,请检查以下内容

CGI 故障排除
  • 您是否在更改配置后重新加载了服务器? 如果没有,请使用 systemctl reload apache2.service 重新加载。

  • 如果您配置了自定义 CGI 目录,是否配置正确? 如果有疑问,请尝试在默认 CGI 目录 /srv/www/cgi-bin/ 中使用该脚本,并使用 https:///cgi-bin/test.cgi 调用它。

  • 文件权限是否正确? 更改到 CGI 目录并执行 ls -l test.cgi。输出应以

    -rwxr-xr-x  1 root root
  • 确保脚本不包含编程错误。如果您没有更改 test.cgi,则不应该出现这种情况,但如果您使用自己的程序,请始终确保它们不包含编程错误。

24.6 使用 SSL 设置安全的 Web 服务器 编辑源文件

当在 Web 服务器和客户端之间传输敏感数据(例如信用卡信息)时,拥有一个安全的、加密的连接以及身份验证是理想的。`mod_ssl` 使用安全套接层 (SSL) 和传输层安全 (TLS) 协议为客户端和 Web 服务器之间的 HTTP 通信提供强大的加密。使用 TLS/SSL,在 Web 服务器和客户端之间建立一个私有连接。确保数据完整性,并且客户端和服务器可以相互身份验证。

为此,服务器会在响应任何 URL 请求之前发送一个 SSL 证书,其中包含证明服务器有效身份的信息。反过来,这保证了服务器是通信的唯一正确端点。此外,该证书生成一个客户端和服务器之间加密的连接,可以传输信息,而无需冒着暴露敏感的明文内容的风险。

`mod_ssl` 本身并不实现 TLS/SSL 协议,而是充当 Apache 和 SSL 库之间的接口。在 openSUSE Leap 中,使用 OpenSSL 库。OpenSSL 会随 Apache 自动安装。

使用 `mod_ssl` 与 Apache 的最明显效果是 URL 前缀为 `https://` 而不是 `http://`。

24.6.1 创建 SSL 证书 编辑源文件

要使用 Web 服务器的 TLS/SSL,您需要创建一个 SSL 证书。此证书是 Web 服务器和客户端之间授权所必需的,以便双方可以识别对方。为了确保证书的完整性,必须由每个用户信任的方对其进行签名。

您可以创建三种类型的证书:仅用于测试目的的“测试”证书,为信任您的特定用户群提供的自签名证书,以及由独立的、公开已知的证书颁发机构 (CA) 签名的证书。

创建证书是一个两步过程。首先,生成证书颁发机构的私钥,然后使用此密钥对服务器证书进行签名。

Tip
提示:更多信息

要了解有关 TLS/SSL 概念和定义的更多信息,请参阅 https://httpd.apache.ac.cn/docs/2.4/ssl/ssl_intro.html

24.6.1.1 创建“测试”证书 编辑源文件

要生成测试证书,请调用脚本 `/usr/bin/gensslcert`。它会创建或覆盖以下文件。使用 `gensslcert` 的可选开关来微调证书。调用 `/usr/bin/gensslcert` `-h` 以获取更多信息。

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

`ca.crt` 的副本也放置在 `/srv/www/htdocs/CA.crt` 以供下载。

Important
重要提示:仅用于测试目的

测试证书绝不能在生产系统中使用。仅将其用于测试目的。

24.6.1.2 创建自签名证书 编辑源文件

如果您正在为内联网或为信任您的特定用户群设置安全的 Web 服务器,则使用您自己的证书颁发机构 (CA) 对证书进行签名就足够了。访问此类网站的访问者会看到类似“此站点不受信任”的警告,因为 Web 浏览器不识别自签名证书。

Important
重要提示:自签名证书

仅在 Web 服务器由知道并信任您作为证书颁发机构的人员访问时才使用自签名证书。例如,不建议在公共商店中使用此类证书。

首先,您需要生成一个证书签名请求 (CSR)。您将使用 `openssl`,证书格式为 `PEM`。在此步骤中,系统会要求您输入密码,并回答几个问题。请记住您输入密码,因为将来需要它。

> sudo openssl req -new > new.cert.csr
Generating a 1024 bit RSA private key
..++++++
.........++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:1
Verifying - Enter PEM pass phrase:2
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:3
State or Province Name (full name) [Some-State]:4
Locality Name (eg, city) []:5
Organization Name (eg, company) [Internet Widgits Pty Ltd]:6
Organizational Unit Name (eg, section) []:7
Common Name (for example server FQDN, or YOUR name) []:8
Email Address []:9

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:10
An optional company name []:11

1

填写您的密码。

2

再次填写它(并记住它)。

3

填写您的两位字母国家/地区代码,例如 `GB` 或 `CZ`。

4

填写您居住的州/省名称。

5

填写城市名称,例如 `Prague`。

6

填写您工作的组织名称。

7

填写您的组织单位,或者如果您没有组织单位,则留空。

8

填写服务器的域名,或您的名字和姓氏。

9

填写您的工作电子邮件地址。

10

将挑战密码留空,否则每次重新启动 Apache Web 服务器时都需要输入它。

11

填写可选的公司名称,或留空。

现在您可以生成证书了。您将再次使用 `openssl`,证书格式为默认的 `PEM`。

Procedure 24.3: 生成证书
  1. 将密钥的私有部分导出到 `new.cert.key`。系统会提示您输入创建证书签名请求 (CSR) 时输入的密码。

    > sudo openssl rsa -in privkey.pem -out new.cert.key
  2. 根据您在签名请求中填写的信息生成证书的公共部分。`-days` 选项指定证书到期之前的时间长度。您可以撤销证书,或在到期之前更换一个。

    > sudo openssl x509 -in new.cert.csr -out new.cert.cert -req \
    -signkey new.cert.key -days 365
  3. 将证书文件复制到相关目录,以便 Apache 服务器可以读取它们。确保私钥 `/etc/apache2/ssl.key/server.key` 不可被全局读取,而公共 PEM 证书 `/etc/apache2/ssl.crt/server.crt` 可以被读取。

    > sudo cp new.cert.cert /etc/apache2/ssl.crt/server.crt
    > sudo cp new.cert.key /etc/apache2/ssl.key/server.key
Tip
提示:公共证书位置

最后一步是将公共证书文件从 `/etc/apache2/ssl.crt/server.crt` 复制到用户可以访问的位置,以便将其合并到 Web 浏览器中已知和受信任的 CA 列表中。否则,浏览器会抱怨证书是由未知机构颁发的。

24.6.1.3 获取官方签名的证书 编辑源文件

有几个官方的证书颁发机构对您的证书进行签名。证书由值得信赖的第三方签名,因此可以完全信任。公开运行的安全的 Web 服务器通常具有官方签名的证书。最常用的证书颁发机构 (CA) 列表可在 https://en.wikipedia.org/wiki/Certificate_authority#Providers 上找到。

在请求官方签名的证书时,您不会将证书发送给 CA。而是发出证书签名请求 (CSR)。要创建 CSR,请运行以下命令

> openssl req -new -newkey rsa:2048 -nodes -keyout newkey.pem -out newreq.pem

系统会要求您输入一个专有名称。这需要您回答几个问题,例如国家/地区名称或组织名称。输入有效数据——您在此处输入的所有内容稍后都会显示在证书中并进行检查。您不需要回答所有问题。如果其中一个不适用于您或您想将其留空,请使用“”。通用名称是 CA 本身的名字——选择一个有意义的名字,例如 *My company* CA。最后,必须输入挑战密码和备用公司名称。

在您调用脚本的目录中找到 CSR。该文件名为 `newreq.pem`。

24.6.2 使用 SSL 配置 Apache 编辑源文件

Web 服务器侧 TLS/SSL 请求的默认端口是 443。在侦听端口 80 的“常规”Apache 和侦听端口 443 的 TLS/SSL 启用的 Apache 之间没有冲突。实际上,HTTP 和 HTTPS 可以在同一个 Apache 实例上运行。通常使用单独的虚拟主机将请求分派到端口 80 和端口 443,以分派到单独的虚拟服务器。

Important
重要提示:防火墙配置

不要忘记为 SSL 启用的 Apache 在端口 443 上打开防火墙。可以使用 `firewalld` 执行此操作,如“安全和加固指南”第 23 章“伪装和防火墙”第 23.4.1 节“在命令行上配置防火墙”中所述。

SSL 模块在全局服务器配置中默认启用。如果它在您的主机上已被禁用,请使用以下命令激活它:`a2enmod ssl`。要最终启用 SSL,需要使用标志“SSL”启动服务器。为此,调用 `a2enflag SSL`(区分大小写!)。如果您选择使用密码加密服务器证书,还应增加 `/etc/sysconfig/apache2` 中 `APACHE_TIMEOUT` 的值,以便在 Apache 启动时有足够的时间输入密码。重新启动服务器以使这些更改生效。重新加载是不够的。

虚拟主机配置目录包含一个带有 SSL 特定指令的模板 `/etc/apache2/vhosts.d/vhost-ssl.template`,这些指令有详细的文档说明。请参阅第 24.2.2.1 节“虚拟主机配置”,了解常规虚拟主机配置。

要开始,将模板复制到 `/etc/apache2/vhosts.d/MYSSL-HOST.conf` 并对其进行编辑。调整以下指令的值就足够了

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

24.6.2.1 基于名称的虚拟主机和 SSL 编辑源文件

默认情况下,在仅有一个 IP 地址的服务器上运行多个 SSL 启用的虚拟主机是不可能的。基于名称的虚拟主机要求 Apache 知道请求了哪个服务器名称。SSL 连接的问题在于,只有在 SSL 连接已经建立(通过默认虚拟主机)后才能读取此类请求。因此,用户会收到一条警告消息,指出证书与服务器名称不匹配。

openSUSE Leap 附带了 SSL 协议的扩展,称为服务器名称指示 (SNI),它通过在 SSL 协商期间发送虚拟域的名称来解决此问题。这使服务器能够尽早“切换”到正确的虚拟域,并向浏览器呈现正确的证书。

SNI 在 openSUSE Leap 上默认启用。要启用基于名称的虚拟主机进行 SSL,请按照第 24.2.2.1.1 节“基于名称的虚拟主机”中的描述进行配置(您需要使用端口 443 而不是 SSL 的端口 80)。

Important
重要提示:SNI 浏览器支持

客户端也必须支持 SNI。但是,大多数浏览器都支持 SNI,除了某些旧浏览器。有关更多信息,请参阅 https://en.wikipedia.org/wiki/Server_Name_Indication#Support

要配置非 SNI 功能浏览器的处理,请使用指令 `SSLStrictSNIVHostCheck`。如果将其设置为服务器配置中的 `on`,则所有虚拟主机的所有非 SNI 功能浏览器将被拒绝。如果将其设置为 `VirtualHost` 指令中的 `on`,则将拒绝对该特定主机的访问。

如果将其设置为服务器配置中的 `off`,则服务器将表现得好像没有 SNI 支持。SSL 请求将由第一个定义的虚拟主机(端口 443)处理。

24.7 在同一服务器上运行多个 Apache 实例 编辑源文件

在同一服务器上运行多个 Apache 实例与运行多个虚拟主机(请参阅第 24.2.2.1 节“虚拟主机配置”)相比,有几个优点

  • 当需要将虚拟主机禁用一段时间时,您需要更改 Web 服务器配置并重新启动它,以便更改生效。

  • 如果一个虚拟主机出现问题,您需要重新启动所有虚拟主机。

您可以像往常一样运行默认的 Apache 实例

> sudo systemctl start apache2.service

它读取默认的 `/etc/sysconfig/apache2` 文件。如果文件不存在,或者存在但未设置 `APACHE_HTTPD_CONF` 变量,则它读取 `/etc/apache2/httpd.conf`。

要激活另一个 Apache 实例,请运行

> sudo systemctl start apache2@INSTANCE_NAME

例如

> sudo systemctl start apache2@example_web.org

默认情况下,该实例将 `/etc/apache2@example_web.org/httpd.conf` 用作主配置文件,可以通过在 `/etc/sysconfig/apache2@example_web.org` 中设置 `APACHE_HTTPD_CONF` 来覆盖它。

以下是一个设置其他 Apache 实例的示例。您需要以 `root` 用户身份执行所有命令。

Procedure 24.4: 配置其他 Apache 实例
  1. 基于 `/etc/sysconfig/apache2` 创建一个新的配置文件,例如 `/etc/sysconfig/apache2@example_web.org`

    > sudo cp /etc/sysconfig/apache2 /etc/sysconfig/apache2@example_web.org
  2. 编辑文件 /etc/sysconfig/apache2@example_web.org 并更改包含

    APACHE_HTTPD_CONF

    的行

    APACHE_HTTPD_CONF="/etc/apache2/httpd@example_web.org.conf"
  3. 基于 /etc/apache2/httpd.conf 创建文件 /etc/apache2/httpd@example_web.org.conf

    > sudo cp /etc/apache2/httpd.conf /etc/apache2/httpd@example_web.org.conf
  4. 编辑 /etc/apache2/httpd@example_web.org.conf 并更改

    Include /etc/apache2/listen.conf

    的行

    Include /etc/apache2/listen@example_web.org.conf

    检查所有指令并更改它们以适应您的需求。您可能需要更改

    Include /etc/apache2/global.conf

    并为每个实例创建新的 global@example_web.org.conf。我们建议更改

    ErrorLog /var/log/apache2/error_log

    的行

    ErrorLog /var/log/apache2/error@example_web.org_log

    以使每个实例拥有单独的日志。

  5. 基于 /etc/apache2/listen.conf 创建 /etc/apache2/listen@example_web.org.conf

    > sudo cp /etc/apache2/listen.conf /etc/apache2/listen@example_web.org.conf
  6. 编辑 /etc/apache2/listen@example_web.org.conf 并更改

    Listen 80

    为新实例运行的端口号,例如 82

    Listen 82

    要通过安全协议运行新的 Apache 实例(请参阅 第 24.6 节,“使用 SSL 设置安全的 Web 服务器”),也更改该行

    Listen 443

    例如,更改为

    Listen 445
  7. 启动新的 Apache 实例

    > sudo systemctl start apache2@example_web.org
  8. 通过将 Web 浏览器指向 http://server_name:82 来检查服务器是否正在运行。如果您之前更改了新实例的错误日志文件名,您可以检查它

    > sudo tail -f /var/log/apache2/error@example_web.org_log

在同一服务器上设置更多 Apache 实例时,需要考虑以下几点

  • 文件 /etc/sysconfig/apache2@INSTANCE_NAME 可以包含与 /etc/sysconfig/apache2 相同的变量,包括模块加载和 MPM 设置。

  • 默认的 Apache 实例不需要在其他实例运行时保持运行状态。

  • Apache 辅助工具 a2enmoda2dismodapachectl 对默认的 Apache 实例起作用,除非另有说明,通过 HTTPD_INSTANCE 环境变量指定。以下示例

    > sudo export HTTPD_INSTANCE=example_web.org
    > sudo a2enmod access_compat
    > sudo a2enmod status
    > sudo apachectl start

    会将 access_compatstatus 模块添加到 /etc/sysconfig/apache2@example_web.orgAPACHE_MODULES 变量中,然后启动 example_web.org 实例。

24.8 避免安全问题 编辑源代码

暴露在公共互联网上的 Web 服务器需要持续的管理工作。不可避免地会出现安全问题,这些问题与软件和意外的错误配置有关。以下是一些处理这些问题的技巧。

24.8.1 最新的软件 编辑源代码

如果在 Apache 软件中发现漏洞,SUSE 将发布安全公告。它包含修复漏洞的说明,这些说明应尽可能应用。SUSE 安全公告可在以下位置获取

24.8.2 DocumentRoot 权限 编辑源代码

默认情况下,在 openSUSE Leap 中,DocumentRoot 目录 /srv/www/htdocs 和 CGI 目录 /srv/www/cgi-bin 属于用户和组 root。您不应更改这些权限。如果这些目录对所有人都是可写的,任何用户都可以将文件放入其中。然后,这些文件可能会以 wwwrun 的权限被 Apache 执行,这可能会给用户提供对文件系统资源的意外访问权限。使用 /srv/www 的子目录来放置虚拟主机的 DocumentRoot 和 CGI 目录,并确保目录和文件属于用户和组 root

24.8.3 文件系统访问 编辑源代码

默认情况下,在 /etc/apache2/httpd.conf 中拒绝对整个文件系统的访问。您永远不应覆盖这些指令,而应专门启用 Apache 应该能够读取的所有目录的访问权限。有关详细信息,请参阅 第 24.2.2.1.3 节,“基本虚拟主机配置”。在这样做时,请确保无法从外部读取任何关键文件,例如密码或系统配置文件。

24.8.4 CGI 脚本 编辑源代码

PHP、SSI 或任何其他编程语言中的交互式脚本可以运行任意命令,因此存在一般的安全问题。应仅从服务器管理员信任的来源安装将在服务器上执行的脚本——允许用户运行自己的脚本通常不是一个好主意。建议对所有脚本进行安全审核。

为了使脚本管理尽可能容易,通常的做法是将 CGI 脚本的执行限制到特定目录,而不是全局允许它们。指令 ScriptAliasOption ExecCGI 用于配置。 openSUSE Leap 默认配置不允许从任何地方执行 CGI 脚本。

所有 CGI 脚本都以相同的用户身份运行,因此不同的脚本可能会相互冲突。suEXEC 模块允许您以不同的用户和组身份运行 CGI 脚本。

24.8.5 用户目录 编辑源代码

在启用用户目录(使用 mod_userdirmod_rewrite)时,您应强烈考虑不允许 .htaccess 文件,这将允许用户覆盖安全设置。至少您应使用指令 AllowOverRide 限制用户的参与度。在 openSUSE Leap 中,默认情况下启用 .htaccess 文件,但用户在使用 mod_userdir 时不允许覆盖任何 Option 指令(请参阅 /etc/apache2/mod_userdir.conf 配置文件)。

24.9 故障排除 编辑源代码

如果 Apache 无法启动,Web 页面无法访问,或者用户无法连接到 Web 服务器,找到问题的原因非常重要。以下是查找错误说明和需要检查的重要事项的典型位置

apache2.service 子命令的输出

不要使用二进制文件 /usr/sbin/apache2ctl 来启动和停止 Web 服务器,而是使用 systemctl 命令(如 第 24.3 节,“启动和停止 Apache” 中所述)。systemctl status apache2.service 详细说明了错误,甚至提供了修复配置错误的提示和建议。

日志文件和详细程度

对于致命和非致命错误,请检查 Apache 日志文件以查找原因,主要是默认情况下位于 /var/log/apache2/error_log 的错误日志文件。此外,如果需要日志文件中更多详细信息,可以使用 LogLevel 指令来控制已记录消息的详细程度。

Tip
提示:一个简单的测试

使用命令 tail -F /var/log/apache2/MY_ERROR_LOG 监视 Apache 日志消息。然后运行 systemctl restart apache2.service。现在,尝试使用浏览器连接并检查输出。

防火墙和端口

常见的错误是在服务器的防火墙配置中未打开 Apache 的端口。如果您使用 YaST 配置 Apache,则有一个单独的选项可处理此特定问题(请参阅 第 24.2.3 节,“使用 YaST 配置 Apache”)。如果您手动配置 Apache,请通过 YaST 的防火墙模块打开 HTTP 和 HTTPS 防火墙端口。

如果无法通过以上任何方式跟踪错误,请检查在线 Apache 错误数据库:https://httpd.apache.ac.cn/bug_report.html。此外,可以通过邮件列表联系 Apache 用户社区,该邮件列表在 https://httpd.apache.ac.cn/userslist.html 上提供。

24.10 更多信息 编辑源代码

软件包 apache2-doc 包含本地化后的 Apache 手册,用于本地安装和参考。默认情况下未安装它——最快的安装方法是使用命令 zypper in apache2-doc。安装后,Apache 手册可在 https:///manual/ 处访问。您也可以在网上访问:https://httpd.apache.ac.cn/docs/2.4/。SUSE 特定的配置提示可在目录 /usr/share/doc/packages/apache2/README.* 中找到。

24.10.1 Apache 2.4 编辑源代码

有关 Apache 2.4 中的新功能列表,请参阅 https://httpd.apache.ac.cn/docs/2.4/new_features_2_4.html。有关从版本 2.2 升级到 2.4 的信息,请参阅 https://httpd.apache.ac.cn/docs/2.4/upgrading.html

24.10.2 Apache 模块 编辑源代码

有关在 第 24.4.5 节,“外部模块” 中简要描述的外部 Apache 模块的更多信息,请访问以下位置

mod_apparmor

https://en.opensuse.net.cn/SDB:AppArmor

mod_php8

https://php.ac.cn/manual/en/install.unix.apache2.php

您可以在其注释良好的主配置文件 /etc/php8/apache2/php.ini 中获得有关 mod_php8 配置的详细信息。

mod_python

https://modpython.org/

mod_security

https://github.com/owasp-modsecurity/ModSecurity

24.10.3 开发 编辑源代码

有关开发 Apache 模块或参与 Apache Web 服务器项目的更多信息,请访问以下位置

Apache 开发人员信息

https://httpd.apache.ac.cn/dev/

Apache 开发人员文档

https://httpd.apache.ac.cn/docs/2.4/developer/

打印此页面