跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 管理指南 / 服务 / Apache HTTP 服务器
适用范围 SUSE Linux Enterprise Server 15 SP6

42 Apache HTTP 服务器

根据 https://www.netcraft.com/https://w3techs.com/ 的调查,Apache HTTP 服务器 (Apache) 是全球最常用的 Web 服务器之一。Apache 由 Apache 软件基金会 (https://www.apache.org/) 开发,适用于大多数操作系统。SUSE® Linux Enterprise Server 中包含 Apache 版本 2.4。本章介绍如何安装、配置和操作 Apache,如何使用 SSL 等其他模块,以及如何对 Apache 进行查错。

42.1 快速入门

本节内容有助于您快速配置和启动 Apache。您必须是 root 用户才能安装和配置 Apache。

42.1.1 要求

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

  1. 计算机的网络配置正确。有关该主题的详细信息,请参见第 23 章 “基本网络知识

  2. 通过与时间服务器同步来维护计算机的准确系统时间。这一点是必需的,因为 HTTP 协议的多个部分依赖于正确的时间。请参见第 38 章 “使用 NTP 同步时间来了解该主题的更多信息。

  3. 将安装最新的安全更新。如果存在疑问,请运行 YaST 联机更新。

  4. 默认 Web 服务器端口 (80) 将在防火墙中打开。为此,请将 firewalld 配置为允许在公共区域中使用 http 服务。有关详细信息,请参见 第 23.4.3 节 “在命令行上配置防火墙”

42.1.2 安装

SUSE Linux Enterprise Server 中的 Apache 默认不会安装到系统中。要用即装即用的标准预定义配置来安装它,请按如下所示继续:

过程 42.1︰ 以默认配置安装 Apache
  1. 启动 YaST,然后选择 软件 ›  软件管理

  2. 选择过滤器 › 软件集,然后选择 Web 和 LAMP 服务器

  3. 确认安装相关的软件包来完成安装进程。

42.1.3 开始

可以自动在引导时启动 Apache 或手动启动它。

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

> sudo systemctl enable apache2.service

有关 SUSE Linux Enterprise Serversystemd 目标的详细信息以及 YaST 服务管理器的说明,请参见第 19.4 节 “使用 YaST 管理服务”

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

过程 42.2︰ 检查 Apache 是否正在运行

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

  1. 启动浏览器,然后打开 http://localhost/

    如果 Apache 已启动并正在运行,您将看到一个测试页,指示它正在运行!

  2. 如果看不到此页面,请参见第 42.9 节 “查错”

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

42.2 配置 Apache

SUSE Linux Enterprise Server 提供了两个配置选项:

手工配置可提供更详细的信息,但没有 YaST GUI 方便。

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

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

如果用 YaST 配置 Apache,按第 42.2.3.2 节 “HTTP 服务器配置”中所述将 HTTP 服务设置为已启用即可让上述操作自动完成。

42.2.1 Apache配置文件

本部分概述了 Apache 配置文件。如果使用 YaST 进行配置,则不需要更改这些文件,但如果以后要切换到手动配置,这些信息可能非常有用。

Apache 配置文件可在两个不同位置处获取:

42.2.1.1 /etc/sysconfig/apache2

/etc/sysconfig/apache2 用于控制 Apache 的全局设置,例如要加载的模块、要包含的其他配置文件、启动服务器时应启用的标志,以及应添加到命令行的标志。此文件中的每个配置选项都有详细记录,因此在此不再描述。对于一般用途的 Web 服务器,/etc/sysconfig/apache2 中的设置应足以满足各种配置需求。

42.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 服务器配置文件。请勿更改此文件。它主要包含 include 语句和全局设置。重写此处列出的相关配置文件中的全局设置。更改您的虚拟主机配置中的特定于主机的设置(例如文档根目录)。

listen.conf

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

magic

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

mime.types

系统可识别的 MIME 类型(它是指向 /etc/mime.types 的链接)。不要编辑此文件。如果需要添加此处没有列出的 MIME 类型,那么请将它们添加到 mod_mime-defaults.conf

mod_*.conf

默认情况下安装的模块的配置文件。有关细节,请参考第 42.4 节 “安装、激活和配置模块”。可选模块的配置文件存储在目录 conf.d 中。

protocols.conf

用于通过 HTTP2 连接呈现页面的配置指令。

server-tuning.conf

包含不同 MPM(请参见第 42.4.4 节 “多处理模块”)的配置指令以及控制 Apache 性能的一般配置选项。在此处更改时,请对 Web 服务器进行合理的测试。

ssl-global.confssl.*

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

sysconfig.d/*.conf

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

uid.conf

指定运行 Apache 的用户和组 ID。不要更改此文件。

vhosts.d/*.conf

虚拟主机配置应位于此处。该目录包含使用和不使用 SSL 的虚拟主机的模板文件。该目录中以 .conf 结尾的所有文件均自动包含在 Apache 配置中。有关细节,请参考第 42.2.2.1 节 “虚拟主机配置”

42.2.2 手动配置 Apache

手动配置 Apache 包括作为 root 用户来编辑纯文本配置文件。

42.2.2.1 虚拟主机配置

术语虚拟主机指的是 Apache 在一台物理计算机上为多个统一资源标识符 (URI) 提供服务的能力。这意味着在一个物理计算机上的一个 Web 服务器可以运行几个域(例如 www.example.com 和 www.example.net)。

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

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

可以通过 YaST(如第 42.2.3.1.4 节 “虚拟主机”中所述)或通过手动编辑配置文件来配置虚拟主机。默认情况下,系统会根据 /etc/apache2/vhosts.d/ 中每个虚拟主机一个配置文件的设置,准备好 SUSE Linux Enterprise Server 中的 Apache。该目录中扩展名为 .conf 的所有文件均会自动包含到配置中。虚拟主机的基本模板将在目录 vhost.templatevhost-ssl.template 中提供,以用于带有 SSL 支持的虚拟主机。

提示
提示:始终要创建虚拟主机配置

建议您始终创建虚拟主机配置文件,即使您的 Web 服务器仅主管一个域。这样不但可以将特定于域的配置保存在一个文件中,还可以简单地通过移动、删除或重命名虚拟主机的配置文件回退到有效的基本配置。因此,还应该为每个虚拟主机创建单独的配置文件。

使用基于名称的虚拟主机时,建议设置当域名与虚拟主机配置不匹配时应使用的默认配置。默认虚拟主机即最先加载其配置的虚拟主机。由于配置文件的加载顺序取决于文件名,因此请在默认虚拟主机配置文件名的开头使用下划线 (_),以确保最先加载该文件(例如 _default_vhost.conf)。

<VirtualHost></VirtualHost> 块包含适用于特定域的信息。当 Apache 接收到客户端对某已定义虚拟主机的请求时,将使用此部分包含的指令。几乎所有指令均可用在虚拟主机环境中。请参见 https://httpd.apache.org/docs/2.4/mod/quickreference.html 来获取有关 Apache 的配置指令的进一步信息。

42.2.2.1.1 基于名称的虚拟主机

使用基于名称的虚拟主机,每个 IP 地址能服务于多个网站。Apache 使用客户端发送的 HTTP 报头中的主机字段来将请求连接到某个虚拟主机声明中匹配的 ServerName 项。如果找不到匹配的 ServerName,则默认使用第一个指定的虚拟主机。

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

例 42.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 地址时,地址必须括在方括号中。

例 42.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>
42.2.2.1.2 基于 IP 礬u196 A虚AaO鱘u187 机

这种备选的虚拟主机配置要求为计算机设置多个 IP 地址。Apache 的一个实例存储多个域,并为每个域指派一个不同的 IP。

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

以下示例显示,Apache 在 IP 为 192.168.3.100 的计算机上运行,并在其他两个 IP 地址 192.168.3.101192.168.3.102 上托管了两个域。请为每个虚拟服务器指定一个单独的 VirtualHost 块。

例 42.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) 中找到的指令。

42.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>
注意
注意:Require all granted

在旧版 Apache 中,Require all granted 语句表达为:

Order allow,deny
Allow from all

mod_access_compat 模块仍然支持该旧语法。

完整的配置文件外观如下所示:

例 42.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>

42.2.3 使用 YaST 配置 Apache

要使用 YaST 配置 Web 服务器,请启动 YaST,并选择网络服务 ›  HTTP 服务器。第一次启动此模块时,HTTP 服务器向导会启动,提示您做出一些有关服务器管理的基本决定。完成向导后,在您每次调用 HTTP 服务器模块时,HTTP 服务器配置对话框都会启动。有关详细信息,请参见第 42.2.3.2 节 “HTTP 服务器配置”

42.2.3.1 HTTP 服务器向导

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

42.2.3.1.1 网络设备选择

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

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

单击下一步继续配置。

42.2.3.1.2 模块

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

42.2.3.1.3 默认主机

该选项与默认的 Web 服务器相关。正如第 42.2.2.1 节 “虚拟主机配置”中所述,Apache 可以在一台物理计算机上为多台虚拟主机提供服务。配置文件中最先声明的虚拟主机通常称为默认主机。每个虚拟主机都将继承默认主机的配置。

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

HTTP 服务器向导:默认主机
图 42.1︰ HTTP 服务器向导:默认主机

这里是服务器默认设置的列表:

Document Root

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

Alias

使用 Alias 指令可以将 URL 映射到物理文件系统位置。这意味着可以通过对某路径进行 URL 别名判别来访问该路径(即使是在文件系统中 Document Root 之外的路径)。

默认的 SUSE Linux Enterprise Server Alias /icons 指向 /usr/share/apache2/icons,作为显示在目录索引视图中的 Apache 图标。

ScriptAlias

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

Directory

设置 Directory 后,便可包含一组只能应用于指定目录的配置选项。

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

Include

使用 include,还可指定其他配置文件。系统中已预配置两个 Include 指令:/etc/apache2/conf.d/ 目录包含与外部模块一起提供的配置文件。使用此指令可包含该目录中以 .conf 结尾的所有文件。使用第二个指令 /etc/apache2/conf.d/apache2-manual.conf 可包含 apache2-manual 配置文件。

Server Name

这指定了客户端用来联系 Web 服务器的默认 URL。使用完全限定的域名 (FQDN) 来连接 Web 服务器(位于 http://FQDN/)或其 IP 地址。不能在此处随意选择名称 - 服务器在此名称下必须是已知的。

Server Administrator E-Mail

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

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

42.2.3.1.4 虚拟主机

在本步骤中,向导显示已配置的虚拟主机(请参见第 42.2.2.1 节 “虚拟主机配置”)的列表。如果启动 YaST HTTP 向导前未进行手动更改,将不显示虚拟主机。

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

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

在虚拟主机配置的第二部分中,可以指定是否启用 CGI 脚本以及用于这些脚本的目录。还可启用 SSL。如果要启用,还必须指定证书的路径。请参见第 42.6.2 节 “使用 SSL 配置 Apache”了解有关 SSL 和证书的细节。使用目录索引选项,可指定在客户端请求目录时所显示的文件(默认情况下为 index.html)。添加一个或多个文件名(用空格分隔)可更改此设置。设置启用公用 HTML 后,便可在服务器的 http://www.example.com/~USER 下访问用户公共目录 (~USER/public_html/) 的内容。

重要
重要:创建虚拟主机

不能随意添加虚拟主机。如果使用基于名称的虚拟主机,必须在网络上解析每个主机名。如果使用基于 IP 的虚拟主机,则仅可向每个可用的 IP 地址指定一个主机。

42.2.3.1.5 摘要

这是本向导的最后一步。在此,确定 Apache 服务器启动的方式和时间:何时引导或手动引导。另请参见迄今为止所作配置的简短摘要。如果对设置满意,单击完成以完成配置。要进行更改,请单击后退直至显示所需的对话框。单击 HTTP 服务器专家配置打开第 42.2.3.2 节 “HTTP 服务器配置”中所述的对话框。

HTTP 服务器向导:摘要
图 42.2︰ HTTP 服务器向导:摘要

42.2.3.2 HTTP 服务器配置

HTTP 服务器配置对话框还允许您对配置进行比在向导(它只在您首次配置 Web 服务器时运行)中更多的调整。它由四个如下所述的选项卡组成。在此处更改的任何配置选项都不会立即生效,总是需要使用完成来确认更改从而使其生效。单击中止退出配置模块并丢弃所作更改。

42.2.3.2.1 侦听端口和地址

HTTP Service 中,选择应该运行(启用)还是停止(禁用)Apache。在侦听端口中,添加编辑删除服务器可用的地址和端口。默认设置是在端口 80 上侦听所有接口。应始终选中打开防火墙中的端口,否则无法从外部访问 Web 服务器。仅在测试时不必对 Web 服务器进行外部访问的情况下,关闭端口是有用的。如果有多个网络接口,请单击防火墙细节以指定要在哪些接口上打开端口。

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

HTTP 服务器配置:侦听端口和地址
图 42.3︰ HTTP 服务器配置:侦听端口和地址
42.2.3.2.2 服务器模块

可以通过单击切换状态来更改 Apache2 模块的状态(启用或禁用)。单击添加模块可添加已安装但还未列出的新模块。要了解模块的更多信息,请参见第 42.4 节 “安装、激活和配置模块”

HTTP 服务器配置:服务器模块
图 42.4︰ HTTP 服务器配置:服务器模块
42.2.3.2.3 主要主机

这些对话框与上述对话框相同。请参见第 42.2.3.1.3 节 “默认主机”第 42.2.3.1.4 节 “虚拟主机”

42.3 启动和停止 Apache

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

要在正在运行的系统上启动、停止或操作 Apache,请使用 systemctlapachectl 命令,详见下面的说明。

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

systemctl status apache2.service

请检查 Apache 是否已启动。

systemctl start apache2.service

如果 Apache 未在运行,则启动它。

systemctl stop apache2.service

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

systemctl restart apache2.service

停止然后重启动 Apache。如果 Web 服务器没有预先运行,则启动它。

systemctl try-restart apache2.service

仅当 Apache 已在运行时才停止并重启动它。

systemctl reload apache2.service

停止 Web 服务器时,应建议所有生成的 Apache 进程在关闭之前首先完成它们的请求。每个进程终止时,会替换为一个新启动的进程,继而导致 Apache 完全重启动

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

使用此命令,无需中断连接,即可激活 Apache 配置中的更改。

systemctl stop apache2.service

在经过 GracefulShutdownTimeout 所配置的指定时间段后停止 Web 服务器,以确保现有请求可以完成。

apachectl configtest

在不影响运行的 Web 服务器的情况下检查配置文件的语法。由于这项检查会在服务器每次启动、重加载或重启动时强制执行,因此通常不需要明确运行测试(如果发现存在配置错误,Web 服务器将不会启动、重加载或重启动)。

apachectl statusapachectl fullstatus

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

提示
提示:其他标志

如果在命令中指定其他标志,这些标志将传递到 Web 服务器。

42.4 安装、激活和配置模块

Apache 软件采用了模块化设计:除了特定的核心任务,其余所有功能都通过模块处理。这方面的发展很快,甚至连 HTTP 都是由模块 (http_core) 处理的。

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

Apache 模块分为以下几类:

基础模块

默认情况下,基础模块将编译到 Apache 中。SUSE Linux Enterprise Server 中的 Apache 内仅编译了 mod_so(加载其他模块时需用到)和 http_core。所有其他对象都可用作共享对象:它们可在运行时被包含,而不是包含在服务器二进制文件本。

扩展模块

扩展模块包含在 Apache 软件包中,但一般不会静态编译到服务器中。在 SUSE Linux Enterprise Server 中,它们以共享对象方式提供,在运行时加载到 Apache 中。

外部模块

标注为外部的模块不包含在正式 Apache 发行版中。不过,SUSE Linux Enterprise Server 提供了其中的几个模块。

多处理模块 (MPM)

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

42.4.1 模块安装

如果您按第 42.1.2 节 “安装”中所述执行了默认安装,那么以下模块已经安装:所有基础模块和扩展模块、多处理模块 Prefork MPM 以及外部模块 mod_python

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

42.4.2 激活和停用

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

如果您想手动激活或停用这些模块,请分别使用命令 a2enmod MODULEa2dismod MODULEa2enmod -l 会输出当前所有活动的模块列表。

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

如果已经手动激活外部模块,则确保在所有虚拟主机配置中加载其配置文件。外部模块的配置文件位于 /etc/apache2/conf.d/ 下,默认会加载到 /etc/apache2/default-server.conf 中。要获取更精细的控制,您可以注释掉 /etc/apache2/default-server.conf 中的内容,并只将该文件添加到特定的虚拟主机。请参见 /etc/apache2/vhosts.d/vhost.template 中的示例。

42.4.3 基础模块和扩展模块

Apache 文档中对所有基础模块和扩展模块均进行了详细的描述。此处仅提供大多数重要模块的简短描述。请参见 http://httpd.apache.org/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)结合使用。

有关该主题的更多信息可以从 Authentication HOWTO 中获取,网址是 https://httpd.apache.org/docs/2.4/howto/auth.html

mod_auth_openidc

在 Apache HTTP 服务器中使用 OpenID Connect 的唯一认可方式是借助 mod_auth_openidc。(请参见 https://openid.net/developers/certified-openid-connect-implementations/。)

mod_autoindex

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

mod_cgi

执行 CGI 脚本时需要使用 mod_cgi。默认情况下启用此模块。

mod_deflate

可使用此模块配置 Apache,使其在传递给定文件类型之前实时压缩这些文件类型。

mod_dir

mod_dir 提供 DirectoryIndex 指令,它可用来配置在请求目录时自动传递的文件(默认使用 index.html)。当目录请求不包含尾部斜杠时,它还能自动重定向到正确的 URL。默认情况下启用此模块。

mod_env

控制传递到 CGI 脚本或 SSI 页面的环境。环境变量可设置或取消设置,或者从调用 httpd 进程的外壳传递。默认情况下启用此模块。

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

在 http://localhost/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

对于内容协商是必需的。有关更多信息,请参见http://httpd.apache.org/docs/2.4/content-negotiation.html。默认情况下启用此模块。

mod_rewrite

可提供 mod_alias 的功能,但具备更多功能和更大的灵活性。使用 mod_rewrite,便可根据多个规则、请求报头等来重定向 URL。

mod_setenvif

基于客户端的请求细节(如客户端发送的浏览器字符串或客户端的 IP 地址)来设置环境变量。默认情况下启用此模块。

mod_spelling

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

mod_ssl

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

mod_status

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

mod_suexec

mod_suexec 可让您以不同用户和组身份来运行 CGI 脚本。默认情况下启用此模块。

mod_userdir

启用 ~USER/ 下特定于用户的目录。必须在配置中指定 UserDir 指令。默认情况下启用此模块。

42.4.4 多处理模块

SUSE Linux Enterprise Server 提供了两个不同的多处理模块 (MPM) 来结合 Apache 使用:

42.4.4.1 Prefork MPM

prefork MPM 实施了一个非线程的预生成 Web 服务器。它使 Web 服务器在行为上类似于 Apache 版本 1.x。在该版本中,它隔离每个请求并通过派生单独的子进程来处理请求。这样,有问题的请求就不会影响其他请求,避免了 Web 服务器被锁定。

此基于进程的方法 prefork MPM 虽然提供了稳定性,但比相应的 worker MPM 消耗更多的系统资源。prefork MPM 被视为是基于 Unix 操作系统的默认 MPM。

重要
重要:本文档中的 MPM

本文档假设 Apache 使用 prefork MPM。

42.4.4.2 Worker MPM

worker MPM 提供一种多线程 Web 服务器。线程是一种更小的进程。线程相对于进程的优点是它占用较少的资源。worker MPM 并非仅生成子进程,还通过在服务器进程中使用线程来处理请求。预派生的子进程是多线程的。此方法相比 prefork MPM,使 Apache 消耗更少的系统资源,从而提高了 Apache 的执行效率。

一个主要缺点是 worker MPM 的稳定性:如果一个线程损坏,进程的所有线程都会受影响。最严重的情况会导致服务器崩溃。尤其是,如果在高负载下将通用网关接口 (CGI) 与 Apache 一起使用,就可能由于线程无法与系统资源通讯而发生内部服务器错误。将 worker MPM 与 Apache 搭配使用的另一个争议是,并非所有可用的 Apache 模块都是线程安全的,因此它不能与 worker MPM 搭配使用。

警告
警告:将 PHP 模块与 MPM 结合使用

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

42.4.5 外部模块

此处提供了 SUSE Linux Enterprise Server 随附的所有外部模块的列表。在列出的目录中查找模块的文档。

mod_apparmor

为 Apache 提供额外支持,以便对由 mod_php8等模块处理的各个 CGI 脚本设置 AppArmor 限制。

软件包名称:apache2-mod_apparmor
更多信息:第 V 部分 “通过 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

42.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(1) 手册页中介绍了 apxs2 的其他选项。

42.5 启用 CGI 脚本

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

为了使 Apache 能够递送由 CGI 脚本创建的内容,需要激活 mod_cgi。另外还需要 mod_alias。默认情况下启用这两种模块。请参见第 42.4.2 节 “激活和停用”来获取有关激活模块的详细信息。

警告
警告:CGI 安全性

允许服务器执行 CGI 脚本是一项潜在的安全性漏洞。请参见第 42.8 节 “避免安全性问题”以了解更多信息。

42.5.1 Apache 配置

SUSE Linux Enterprise Server 中,只允许在目录 /srv/www/cgi-bin/ 中执行 CGI 脚本。已配置此位置来执行 CGI 脚本。如果已经创建了虚拟主机配置(请参见第 42.2.2.1 节 “虚拟主机配置”)并且想将脚本放置在特定于主机的目录中,必须解锁并配置此目录。

例 42.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.org/docs/2.4/howto/auth.html

42.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 拥有。有关更多信息,请参见第 42.8 节 “避免安全性问题”。由于该 Web 服务器是由不同用户运行的,所以 CGI 脚本必须可被世界各地的用户执行和读取。请切换到 CGI 目录并使用 chmod 755 test.cgi 命令来应用正确的权限。

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

42.5.3 CGI 查错

如果没有看到测试程序的输出而是看到了错误消息,则请检查以下项:

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

  • 如果已经配置了自定义 CGI 目录,那么该配置是否正确?如果不确定,请尝试默认 CGI 目录 /srv/www/cgi-bin/ 中的脚本并用 http://localhost/cgi-bin/test.cgi 调用它。

  • 文件权限是否正确?请切换到 CGI 目录并执行 ls -l test.cgi。输出应该以下面的字符串开头

    -rwxr-xr-x  1 root root
  • 确保脚本中没有编程错误。如果还未更改 test.cgi,则问题应该不大,但是如果正在使用您自己的程序,则始终要确保它们没有编程错误。

42.6 使用 SSL 设置安全的 Web 服务器

只要在 Web 服务器和客户端之间传送敏感数据(如信用卡信息),就需要具有带身份验证的安全的加密连接。mod_ssl 使用安全套接字层 (SSL) 和传输层安全 (TLS) 协议来为客户端与 Web 服务器之间的 HTTP 通讯提供安全系数高的加密。使用 TLS/SSL 时,将在 Web 服务器和客户端之间建立专用连接。如此可确保数据完整性,并且客户端和服务器能够彼此验证。

基于此目的,服务器在回答对 URL 的任何请求之前,会发送一个 SSL 证书,其中包含证明服务器有效身份的信息。反过来,这保证了该服务器对于通信来说是唯一正确的终端。此外,证书使得在客户端和服务器之间建立起加密连接,确保在不泄露敏感的明文内容的情况下传输信息。

mod_ssl 本身不会实施 TLS/SSL 协议,而是充当 Apache 与 SSL 库之间的接口。在 SUSE Linux Enterprise Server 中,将使用 OpenSSL 库。OpenSSL 将自动随 Apache 安装。

mod_ssl 与 Apache 一起使用,产生的最明显的效果就是 URL 的前缀为 https://,而不是 http://

42.6.1 创建 SSL 证书

要将 TLS/SSL 与 Web 服务器搭配使用,您需要创建 SSL 证书。在 Web 服务器与客户端之间授权时需要此证书,以便双方都能识别对方。为了确保证书的完整性,证书必须由所有用户都信任的一方签署。

您可创建三种类型的证书:测试证书(仅用于测试)、自我签名证书(用于信任您的指定用户群),由公开的独立证书颁发机构 (CA) 签名的证书。

创建证书分两步执行。首先,生成证书颁发机构的私用密钥,然后使用此密钥签署服务器证书。

提示
提示:更多信息

要进一步了解 TLS/SSL 的概念和定义,请参见 http://httpd.apache.org/docs/2.4/ssl/ssl_intro.html

42.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

也可以从 /srv/www/htdocs/CA.crt 下载 ca.crt 的副本。

重要
重要:仅用于测试

切勿在生产系统上使用测试证书。它只能用来测试。

42.6.1.2 创建自我签名证书

如果要为内部网或指定用户群设置安全的 Web 服务器,通过您自己的证书颁发机构 (CA) 对证书签名就已足够。访问此类网站的用户将会看到类似此网站不可信的警告,因为 Web 浏览器无法识别自我签名证书。

重要
重要:自我签名证书

仅在 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

填写两个字母的国家/地区代码,例如 GBCZ

4

填写您所在的省/自治区/直辖市名称。

5

填写城市名称,例如 Prague

6

填写您的工作单位名称。

7

填写您的组织单位,没有则保留为空白。

8

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

9

填写您的办公电子邮件地址。

10

将询问口令保留为空白,否则您每次重启动 Apache Web 服务器时都需要输入该口令。

11

填写选填的公司名称,或保留为空白。

现在可以生成证书。您将再次使用 openssl,并且证书的格式是默认的 PEM

过程 42.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
提示
提示:公共证书位置

最后一步是将公共证书文件从 /etc/apache2/ssl.crt/server.crt 复制到用户可以访问的位置,以便将该文件纳入用户 Web 浏览器已知且信任的 CA 列表中。否则,浏览器将指示证书是由未知授权者发出的。

42.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

42.6.2 使用 SSL 配置 Apache

在 Web 服务器端,TLS/SSL 请求的默认端口为 443。侦听端口 80 的普通Apache 与侦听端口 443 且支持 TLS/SSL 的 Apache 之间没有冲突。实际上,HTTP 和 HTTPS 可使用同一个 Apache 实例运行。通常使用一个虚拟主机将请求发送到端口 80 和端口 443 以区分虚拟服务器。

重要
重要:防火墙配置

请记得在端口 443 上为支持 SSL 的 Apache 打开防火墙。可按第 23.4.3 节 “在命令行上配置防火墙”中所述通过 firewalld 执行此操作。

在全局服务器配置中,SSL 模块默认情况下处于启用状态。如果它在您的主机上已禁用,请使用以下命令激活它:a2enmod ssl。要最终启用 SSL,需要使用标志SSL启动服务器。为此,请调用 a2enflag SSL(区分大小写!)。如果选择使用口令加密服务器证书,则还应增加 /etc/sysconfig/apache2APACHE_TIMEOUT 的值,这样在 Apache 启动时,您就有足够的时间输入通行口令。重启动服务器可使这些更改生效。仅重加载是不够的。

虚拟主机配置目录中包含 /etc/apache2/vhosts.d/vhost-ssl.template 模板,该模板详细记录了专用于 SSL 的指令。请参见第 42.2.2.1 节 “虚拟主机配置”了解通用虚拟主机配置。

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

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

42.6.2.1 基于名称的虚拟主机和 SSL

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

SUSE Linux Enterprise Server 提供了一个 SSL 协议扩展:服务器名称指示 (SNI)。该协议会在 SSL 协商过程中发送虚拟域的名称,从而解决了这一问题。这样服务器就能提前切换到正确的虚拟域,并向浏览器显示正确的证书。

SUSE Linux Enterprise Server 上默认会启用 SNI。要启用基于名称的 SSL 虚拟主机,可按第 42.2.2.1.1 节 “基于名称的虚拟主机”中所述配置服务器(需要将端口 443 用于 SSL,而非端口 80)。

重要
重要:SNI 浏览器支持

客户端也必须支持 SNI。不过,只有大部分浏览器支持 SNI,某些较旧的浏览器不支持。有关详细信息,请参见https://en.wikipedia.org/wiki/Server_Name_Indication#Support

要配置对不支持 SNI 的浏览器的处理方式,请使用指令 SSLStrictSNIVHostCheck。在服务器配置中设置为 on 时,所有虚拟主机都将拒绝不支持 SNI 的浏览器。如果 VirtualHost 指令中设置为 on,对此特定主机的访问将被拒。

在服务器配置中设置为 off 时,服务器的行为类似于不支持 SNI。SSL 请求将由定义的第一个虚拟主机(端口 443)处理。

42.7 在同一台服务器上运行多个 Apache 实例

相较于运行多个虚拟主机(请参见第 42.2.2.1 节 “虚拟主机配置”),在同一台服务器上运行多个 Apache 实例具有以下优势:

  • 如果需要将虚拟主机禁用一段时间,您需要更改 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 身份执行所有命令。

过程 42.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

    要通过安全协议(请参见第 42.6 节 “使用 SSL 设置安全的 Web 服务器”)运行新的 Apache 实例,还需将下面一行

    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 实例就无需运行。

  • 如果未使用 HTTPD_INSTANCE 环境变量另行指定,Apache 助手实用程序 a2enmoda2dismodapachectl 将在默认的 Apache 实例上运行。下面的示例

    > 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 实例。

42.8 避免安全性问题

对公共互联网开放的 Web 服务器需要不断加强管理。对于软件和意外的错误配置,安全问题似乎都是不可避免的。下面提供了如何处理这些问题的一些提示。

42.8.1 最新软件

在 Apache 软件中发现漏洞时,SUSE 将会发出安全忠告。其中包含修复漏洞的相关说明,用户应该在情况允许时予以采纳。SUSE 安全性声明可以从以下位置处获取:

42.8.2 DocumentRoot 权限

SUSE Linux Enterprise Server 中,DocumentRoot 目录 (/srv/www/htdocs) 和 CGI 目录 (/srv/www/cgi-bin) 默认属于 root 用户和组。您不能更改这些权限。如果任何用户都可写入这些目录,则任何用户都可以将文件放入这些目录中。之后,具有 wwwrun 权限(该权限允许用户随意访问文件系统资源)的 Apache 可能会执行这些文件。使用 /srv/www 的子目录来存放虚拟主机的 DocumentRoot 和 CGI 指令,并确保这些目录和文件属于 root 用户和组。

42.8.3 文件系统访问

默认情况下,/etc/apache2/httpd.conf 中会拒绝对整个文件系统的访问。不应该重写这些指令,而是要明确启用对 Apache 可读的所有目录的访问权。有关详细信息,请参见第 42.2.2.1.3 节 “基本虚拟主机配置”。如此操作后,请确保任何重要文件(例如口令或系统配置文件)均不能从外部读取。

42.8.4 CGI 脚本

使用 PHP、SSI 或任何其他编程语言的交互脚本可以运行任意命令,因此存在普遍的安全问题。从服务器执行的脚本只能从服务器管理员信任的源安装,允许用户运行他们拥有的所有脚本通常不是好的做法。还建议对所有脚本执行安全性审计。

为了尽可能简化脚本的管理,通常会将 CGI 脚本的执行限制于特定目录而不是全局使用它们。ScriptAliasOption ExecCGI 指令用于配置。SUSE Linux Enterprise Server 的默认配置不允许随处执行 CGI 脚本。

所有 CGI 脚本都会作为同一个用户运行,所以不同的脚本可能会彼此冲突。模块 suEXEC 允许您在不同的用户和组下运行 CGI 脚本。

42.8.5 用户目录

启用用户目录(使用 mod_userdirmod_rewrite)时,一定不要允许用户覆盖 .htaccess 文件,因为这会允许用户重写安全设置。至少应该使用指令 AllowOverRide 来限制用户的注册。在 SUSE Linux Enterprise Server 中,.htaccess 文件默认处于启用状态,但当用户使用 mod_userdir(请参见 /etc/apache2/mod_userdir.conf 配置文件)时,不允许其覆盖任何 Option 指令。

42.9 查错

如果 Apache 不启动、网页不可访问或用户无法连接到 Web 服务器,那么找出问题的原因是很重要的。下面是您可从中寻找错误原因的常见位置和需要重点检查的事项:

apache2.service 子命令的输出:

不要使用 /usr/sbin/apache2ctl 二进制文件启动和停止 Web 服务器,而应使用 systemctl 命令(如第 42.3 节 “启动和停止 Apache”中所述)。systemctl status apache2.service 详细描述了错误,甚至还提供了解决配置错误的提示。

日志文件和详细程度

无论是致命错误还是非致命错误,都请检查 Apache 日志文件了解原因,主要检查默认位于 /var/log/apache2/error_log 的错误日志文件。此外,如果需要日志文件记录得更详细一些,可以使用 LogLevel 指令来控制所记录消息的详细程度。

提示
提示:一个简单的测试

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

防火墙和端口

常见错误之一是在服务器的防火墙配置中未打开针对 Apache 的端口。如果使用 YaST 配置 Apache,有一个单独的选项用于这个具体问题(请参见第 42.2.3 节 “使用 YaST 配置 Apache”)。如果正在手工配置 Apache,则请通过 YaST 的防火墙模块打开 HTTP 和 HTTPS 的防火墙端口。

如果使用以上任何信息均无法找到错误原因,请检查联机 Apache Bug 数据库(网址为 https://httpd.apache.org/bug_report.html)。此外,可以通过 https://httpd.apache.org/userslist.html 上的邮件列表联系 Apache 用户社区。

42.10 更多信息

软件包 apache2-doc 中包含多个本地化版本的完整 Apache 手册,可供本地安装和参考。默认不会安装该软件包,安装它的最快方法是使用命令 zypper in apache2-doc。完成安装之后,http://localhost/manual/ 中将会有 Apache 手册可供使用。还可在 Web 上的 https://httpd.apache.org/docs/2.4/ 访问它。/usr/share/doc/packages/apache2/README.* 中提供了 SUSE 特定的配置提示。

42.10.1 Apache 2.4

有关 Apache 2.4 中新功能的列表,请参见 https://httpd.apache.org/docs/2.4/new_features_2_4.html。可以在 https://httpd.apache.org/docs/2.4/upgrading.html 获得有关从版本 2.2 升级到 2.4 的信息。

42.10.2 Apache 模块

有关第 42.4.5 节 “外部模块”中简述的外部 Apache 模块的更多信息,可在以下位置找到:

mod_apparmor

https://en.opensuse.org/SDB:AppArmor

mod_php8

https://www.php.net/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

42.10.3 开发

有关开发 Apache 模块和涉及 Apache Web 服务器项目的更多信息,可以从以下位置处获得:

Apache 开发人员信息

https://httpd.apache.org/dev/

Apache 开发人员文档

https://httpd.apache.org/docs/2.4/developer/

42.10.4 其他来源

如果遇到特定于 SUSE Linux Enterprise Server 中的 Apache 的问题,请查看“技术信息搜索”,网址为:https://www.suse.com/support/https://httpd.apache.org/ABOUT_APACHE.html 提供了对 Apache 历史的介绍。此页还解释此服务器为什么被称为 Apache。