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

37 Apache HTTP 服务器

http://www.netcraft.com/ 的调查表明,Apache HTTP 服务器 (Apache) 是世界上应用最广泛的 Web 服务器。Apache 由 Apache 软件基金会 (http://www.apache.org/) 开发,适用于大多数操作系统。SUSE® Linux Enterprise Server 包含 Apache 版本 2.4。本章将介绍如何安装、配置和设置 Web 服务器;如何使用 SSL、CGI 和其他模块;以及如何对 Apache 进行查错。

37.1 快速入门

借助本节内容,可快速设置并启动 Apache。您必须是 root 用户才能安装和配置 Apache。

37.1.1 要求

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

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

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

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

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

37.1.2 安装

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

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

  2. 选择视图 ›  模式,然后选择 Web 和 LAMP 服务器

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

37.1.3 开始

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

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

tux > sudo systemctl enable apache2

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

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

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

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

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

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

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

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

37.2 配置 Apache

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

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

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

大多数配置更改需要重新装载(有些还需要重启动)Apache 后才能生效。使用 systemctl reload apache2第 37.3 节 “启动和停止 Apache”中所述的某个重启动选项手动重新装载 Apache。

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

37.2.1 Apache 配置文件

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

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

37.2.1.1 /etc/sysconfig/apache2

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

37.2.1.2 /etc/apache2/

/etc/apache2/ 托管 Apache 的所有配置文件。下面描述了每个文件的用途。每个文件均包含几个配置选项(也称为指令)。这些文件中的每个配置选项都有详细记录,因此在此不再描述。

Apache 配置文件按如下所示组织:

/etc/apache2/
     |
     |- charset.conv
     |- conf.d/
     |   |
     |   |- *.conf
     |
     |- default-server.conf
     |- errors.conf
     |- httpd.conf
     |- listen.conf
     |- magic
     |- mime.types
     |- mod_*.conf
     |- server-tuning.conf
     |- ssl.*
     |- ssl-global.conf
     |- 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 如何响应错误。要为所有虚拟主机自定义这些消息,请编辑此文件。否则在您的虚拟主机配置中覆盖这些指令。

httpd.conf

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

listen.conf

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

magic

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

mime.types

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

mod_*.conf

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

server-tuning.conf

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

ssl-global.confssl.*

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

sysconfig.d/*.conf

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

uid.conf

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

vhosts.d/*.conf

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

37.2.2 手动配置 Apache

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

37.2.2.1 虚拟主机配置

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

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

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

可以通过 YaST(如第 37.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 接收到客户端对某已定义虚拟主机的请求时,将使用此部分包含的指令。几乎所有指令均可用在虚拟主机环境中。请参见 http://httpd.apache.org/docs/2.4/mod/quickreference.html 来获取有关 Apache 的配置指令的进一步信息。

37.2.2.1.1 基于名称的虚拟主机

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

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

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

例 37.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>
37.2.2.1.2 基于 IP 的虚拟主机

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

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

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

例 37.3︰ 基于 IP 的 VirtualHost 指令
<VirtualHost 192.168.3.101>
  ...
</VirtualHost>

<VirtualHost 192.168.3.102>
  ...
</VirtualHost>

在此,VirtualHost 指令只针对除 192.168.3.100 以外的接口。在也为 192.168.3.100 配置监听指令时,必须创建单独的、基于 IP 的虚拟主机才能答复对该接口的 HTTP 请求,否则应用在默认服务器配置 (/etc/apache2/default-server.conf) 中找到的指令。

37.2.2.1.3 基本虚拟主机配置

每个虚拟主机配置中至少要有以下指令,才能设置虚拟主机。请参见 /etc/apache2/vhosts.d/vhost.template 获取更多选项。

ServerName

主机所在的全限定域名。

DocumentRoot

Apache 应该为此主机提供文件的目录路径。出于安全考虑,在默认情况下禁止访问整个文件系统,所以必须在目录容器中显示地解锁此目录。

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 模块仍然支持该旧语法。

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

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

37.2.3 使用 YaST 配置 Apache

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

37.2.3.1 HTTP 服务器向导

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

37.2.3.1.1 网络设备选择

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

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

单击下一步继续配置。

37.2.3.1.2 模块

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

37.2.3.1.3 默认主机

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

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

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

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

Document Root

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

Alias

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

默认的 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.confapache2-manual 配置文件)。

Server Name

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

Server Administrator E-Mail

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

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

37.2.3.1.4 虚拟主机

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

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

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

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

重要
重要:创建虚拟主机

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

37.2.3.1.5 摘要

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

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

37.2.3.2 HTTP 服务器配置

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

37.2.3.2.1 监听端口和地址

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

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

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

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

HTTP 服务器配置:服务器模块
图 37.4︰ HTTP 服务器配置:服务器模块
37.2.3.2.3 主要主机

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

37.3 启动和停止 Apache

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

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

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

systemctl status apache2

请检查 Apache 是否已启动。

systemctl start apache2

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

systemctl stop apache2

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

systemctl restart apache2

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

systemctl try-restart apache2

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

systemctl reload apache2

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

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

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

systemctl stop apache2

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

apachectl configtest

在不影响运行的 Web 服务器的情况下检查配置文件的语法。由于此检查是在服务器每次启动时强制执行的,所以通常不需要显式运行测试(如果发现配置错误,则 Web 服务器将不启动、重装载或重启动)。

apachectl statusapachectl fullstatus

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

提示
提示:其他标志

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

37.4 安装、激活和配置模块

Apache 软件是以模块化方式构建的:除某些核心任务外的所有功能都是通过模块处理的。这方面的发展很快,甚至连 HTTP 都是由模块 (http_core) 处理的。

Apache 模块可以在构建时编译成 Apache 二进制文件,或在运行时动态装载。请参见第 37.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 服务器软件的核心。

37.4.1 模块安装

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

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

37.4.2 激活和停用

手动或用 YaST 激活或停用特定模块。在 YaST 中,需要使用第 37.2.3.1 节 “HTTP 服务器向导”中所述的模块配置来启用或禁用脚本语言模块(PHP 5 和 Python)。可以按第 37.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 获取示例。

37.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 中获取,网址是 http://httpd.apache.org/docs/2.4/howto/auth.html

mod_auth_openidc

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

mod_autoindex

当不存在索引文件(例如 index.html)时,Autoindex 将生成目录列表。这些索引的外观是可配置的。默认情况下启用此模块。但是,在默认情况下,目录列表将通过选项指令禁用,覆盖虚拟主机配置中的此设置。此模块的默认配置文件位于 /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_speling 会尝试自动更正 URL 中的打字错误,例如大小写错误。

mod_ssl

在 Web 服务器和客户端之间启用加密连接。有关详细信息,请参见第 37.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 指令。默认情况下启用此模块。

37.4.4 多处理模块

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

37.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。

37.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 一起使用。

37.4.5 外部模块

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

mod_apparmor

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

包名称:apache2-mod_apparmor
更多信息:第 IV 部分 “通过 AppArmor 限制特权”
mod_php5

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

包名称:apache2-mod_php5
配置文件:/etc/apache2/conf.d/php5.conf
更多信息:/usr/share/doc/packages/apache2-mod_php5
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
文档:http://modsecurity.org/documentation/

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

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

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

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

37.5 启用 CGI 脚本

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

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

警告
警告:CGI 安全性

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

37.5.1 Apache 配置

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

例 37.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 指令控制默认访问状态。在此例中,授予对指定目录的访问权且无任何限制。有关身份验证和授权的更多信息,请参见http://httpd.apache.org/docs/2.4/howto/auth.html

37.5.2 运行示例脚本

CGI 编程不同于“常规”编程,因为 CGI 程序和脚本前面必须有一个 MIME 类型的报头,例如 Content-type: text/html。此报头将发送到客户端,所以它知道所接收内容的类型。其次,脚本的输出必须是客户端(通常是 Web 浏览器)所知道的东西,比如 HTML(通常情况)、纯文本或图像。

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

可通过 Web 服务器访问的文件应由用户 root 拥有。有关更多信息,请参见第 37.8 节 “避免安全性问题”。由于该 Web 服务器是由不同用户运行的,所以 CGI 脚本必须可被世界各地的用户执行和读取。更改为 CGI 目录并使用命令 chmod 755 test.cgi 来应用正确的权限。

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

37.5.3 CGI 查错

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

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

  • 如果已经配置了自定义 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,则问题应该不大,但是如果正在使用您自己的程序,则始终要确保它们没有编程错误。

37.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://)。

37.6.1 创建 SSL 证书

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

您可创建三种类型的证书:虚设证书(仅用于测试)、自我签名证书(用于信任您的指定用户群)和由独立的、众所周知的证书颁发机构 (CA) 签署的证书。

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

提示
提示:更多信息

要想更多地了解 TLS/SSL 的概念和定义,请参见 http://httpd.apache.org/docs/2.4/ssl/ssl_intro.html

37.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 下以供下载。

重要
重要:仅供测试

不能在生产系统上使用虚设证书。它只能用来测试。

37.6.1.2 创建自签署证书

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

重要
重要:自我签名证书

仅在 Web 服务器上使用自签署证书,此证书必须可由知道并相信您是证书授权者的人员访问。例如,不建议在公共商店使用此类证书。

首先,您需要生成证书签名请求 (CSR)。您将需要使用 openssl,并采用 PEM 证书格式。在执行此步骤期间,系统将要求您输入通行口令并回答几个问题。请记住您输入的通行口令,将来还要使用它。

tux > 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

过程 37.3︰ 生成证书
  1. 将密钥的私用部分导出到 new.cert.key。系统将提示您输入您在创建证书签名请求 (CSR) 时所输入的通行口令。

    tux > sudo openssl rsa -in privkey.pem -out new.cert.key
  2. 根据您在签名请求中填写的信息生成证书的公共部分。-days 选项指定证书多长时间以后失效。您可以在证书失效前将其撤消或更换。

    tux > 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 则是。

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

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

37.6.1.3 获取正式签署的证书

签署证书的正式证书颁发机构有多个。证书是由值得信任的第三方签署的,所以可以完全相信。公共操作安全 Web 服务器通常具有正式签署的证书。有关最常用的证书颁发机构 (CA) 列表,请访问 https://en.wikipedia.org/wiki/Certificate_authority#Providers

请求正式签署的证书时,无需向 CA 发送证书。相反,请发出证书签署请求 (CSR)。要创建 CSR,请运行以下命令:

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

系统将要求您输入判别名。这要求您回答几个问题,例如国家/地区名称或组织名称。输入有效的数据,在此处输入的所有内容稍后都会显示在证书中并检查。无需回答所有问题。如果有问题不适用于您或者您不想回答,请使用.. 常用名就是 CA,请选择一个重要的名称,例如我的公司 CA。最后,必须输入询问口令和备用的公司名称。

在调用脚本的目录中查找 CSR。文件名是 newreq.pem

37.6.2 使用 SSL 配置 Apache

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

重要
重要:防火墙配置

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

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

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

要开始配置,请将模板复制到 /etc/apache2/vhosts.d/mySSL-host.conf,并对其进行编辑。调整以下指令的值应该就足够了:

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

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

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

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

SUSE Linux Enterprise Server 上默认会启用 SNI。为了使基于名称的虚拟主机能够使用 SSL,可按第 37.2.2.1.1 节 “基于名称的虚拟主机”中所述配置服务器(请注意,需要将端口 443 而不是端口 80 用于 SSL)。

重要
重要:SNI 浏览器支持

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

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

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

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

SUSE® Linux Enterprise Server 12 SP1 开始,您可以在同一服务器上运行多个 Apache 实例。与运行多个虚拟主机相比,这提供了诸多优势(请参见第 37.2.2.1 节 “虚拟主机配置”):

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

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

您可以照常运行默认的 Apache 实例:

tux > sudo systemctl start apache2

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

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

tux > sudo systemctl start apache2@INSTANCE_NAME

例如:

tux > 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 身份执行所有命令。

过程 37.4︰ 配置其他 Apache 实例
  1. /etc/sysconfig/apache2 的基础上创建一个新的配置文件,例如 /etc/sysconfig/apache2@example_web.org

    tux > 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

    tux > 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

    tux > 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

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

    Listen 443

    更改为(示例)

    Listen 445
  7. 启动新的 Apache 实例:

    tux > sudo systemctl start apache2@example_web.org
  8. 在 Web 浏览器中打开 http://server_name:82,检查服务器是否正在运行。如果以前更改了新实例的错误日志文件名,您可以检查这项更改:

    tux > 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 实例上运行。下面的示例

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

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

37.8 避免安全性问题

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

37.8.1 最新软件

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

37.8.2 DocumentRoot 权限

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

37.8.3 文件系统访问权

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

37.8.4 CGI 脚本

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

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

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

37.8.5 用户目录

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

37.9 查错

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

apache2.service 子命令的输出:

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

日志文件和详细程度

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

提示
提示:简单测试

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

防火墙和端口

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

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

37.10 更多信息

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

37.10.1 Apache 2.4

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

37.10.2 Apache 模块

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

37.10.3 开发

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

Apache 开发人员信息

http://httpd.apache.org/dev/

Apache 开发人员文档

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

37.10.4 其他来源

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