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 服务器之前,请确保满足以下要求:
计算机的网络配置正确。有关该主题的详细信息,请参见第 23 章 “基本网络知识”。
通过与时间服务器同步来维护计算机的准确系统时间。这一点是必需的,因为 HTTP 协议的多个部分依赖于正确的时间。请参见第 38 章 “使用 NTP 同步时间”来了解该主题的更多信息。
将安装最新的安全更新。如果存在疑问,请运行 YaST 联机更新。
默认 Web 服务器端口 (
80
) 将在防火墙中打开。为此,请将firewalld
配置为允许在公共区域中使用http
服务。有关详细信息,请参见 第 23.4.3 节 “在命令行上配置防火墙”。
42.1.2 安装 #
SUSE Linux Enterprise Server 中的 Apache 默认不会安装到系统中。要用“即装即用”的标准预定义配置来安装它,请按如下所示继续:
启动 YaST,然后选择
› 。选择
› ,然后选择 。确认安装相关的软件包来完成安装进程。
42.1.3 开始 #
可以自动在引导时启动 Apache 或手动启动它。
要确保 Apache 在引导期间自动启动,请在目标 multi-user.target
和 graphical.target
中执行以下命令:
>
sudo
systemctl enable apache2.service
有关 SUSE Linux Enterprise Server 中 systemd
目标的详细信息以及 YaST 的说明,请参见第 19.4 节 “使用 YaST 管理服务”。
要使用外壳手动启动 Apache,请运行 systemctl start
apache2.service
。
如果在启动 Apache 时没有收到错误消息,这通常表示 Web 服务器正在运行。测试 Apache 是否正在运行:
启动浏览器,然后打开 http://localhost/。
如果 Apache 已启动并正在运行,您将看到一个测试页,指示“它正在运行!”。
如果看不到此页面,请参见第 42.9 节 “查错”。
既然 Web 服务器已在运行,因此可以添加您自己的文档、根据需要调整配置或通过安装模块来添加功能。
42.2 配置 Apache #
SUSE Linux Enterprise Server 提供了两个配置选项:
手工配置可提供更详细的信息,但没有 YaST GUI 方便。
大多数配置更改都需要重新加载或重启动 Apache 才能生效。使用 systemctl reload
apache2.service
或第 42.3 节 “启动和停止 Apache”中所述的某个重启动选项手动重新加载 Apache。
如果用 YaST 配置 Apache,按第 42.2.3.2 节 “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
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.conf
和ssl.*
全局 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.template
或 vhost-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
指令指出该主机的内容位于文件系统中的哪个位置。
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 地址时,地址必须括在方括号中。
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.101
和 192.168.3.102
上托管了两个域。请为每个虚拟服务器指定一个单独的 VirtualHost
块。
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
模块仍然支持该旧语法。
完整的配置文件外观如下所示:
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,并选择第 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 模块 #
第 42.2.3.2.2 节 “服务器模块”。单击 进入下一个对话框。
配置选项允许激活或停用 Web 服务器应支持的脚本语言。要激活或停用其他模块,请参见42.2.3.1.3 默认主机 #
该选项与默认的 Web 服务器相关。正如第 42.2.2.1 节 “虚拟主机配置”中所述,Apache 可以在一台物理计算机上为多台虚拟主机提供服务。配置文件中最先声明的虚拟主机通常称为默认主机。每个虚拟主机都将继承默认主机的配置。
要编辑主机设置(也称为指令),请在表中选择相应的项,然后单击 。要添加新指令,请单击 。要删除指令,请选择该主机,然后单击 。
这里是服务器默认设置的列表:
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)。通过 指定名称或 IP 地址
单击
进入虚拟主机配置对话框的第二部分。
在虚拟主机配置的第二部分中,可以指定是否启用 CGI 脚本以及用于这些脚本的目录。还可启用 SSL。如果要启用,还必须指定证书的路径。请参见第 42.6.2 节 “使用 SSL 配置 Apache”了解有关 SSL 和证书的细节。使用 选项,可指定在客户端请求目录时所显示的文件(默认情况下为 index.html
)。添加一个或多个文件名(用空格分隔)可更改此设置。设置 后,便可在服务器的 http://www.example.com/~USER
下访问用户公共目录 (~USER/public_html/
) 的内容。
不能随意添加虚拟主机。如果使用基于名称的虚拟主机,必须在网络上解析每个主机名。如果使用基于 IP 的虚拟主机,则仅可向每个可用的 IP 地址指定一个主机。
42.2.3.1.5 摘要 #
这是本向导的最后一步。在此,确定 Apache 服务器启动的方式和时间:何时引导或手动引导。另请参见迄今为止所作配置的简短摘要。如果对设置满意,单击第 42.2.3.2 节 “HTTP 服务器配置”中所述的对话框。
以完成配置。要进行更改,请单击 直至显示所需的对话框。单击 打开42.2.3.2 HTTP 服务器配置 #
对话框还允许您对配置进行比在向导(它只在您首次配置 Web 服务器时运行)中更多的调整。它由四个如下所述的选项卡组成。在此处更改的任何配置选项都不会立即生效,总是需要使用 来确认更改从而使其生效。单击 退出配置模块并丢弃所作更改。
42.2.3.2.1 侦听端口和地址 #
在 80
上侦听所有接口。应始终选中 ,否则无法从外部访问 Web 服务器。仅在测试时不必对 Web 服务器进行外部访问的情况下,关闭端口是有用的。如果有多个网络接口,请单击 以指定要在哪些接口上打开端口。
使用第 42.3 节 “启动和停止 Apache”。这些命令将立即生效,并且其日志消息也会立即显示。
查阅访问日志文件或错误日志文件。如果要测试配置,这很有用。该日志文件将在单独的窗口中打开,您还可从该窗口重启动或重新加载 Web 服务器。有关详细信息,请参见42.2.3.2.2 服务器模块 #
可以通过单击第 42.4 节 “安装、激活和配置模块”。
来更改 Apache2 模块的状态(启用或禁用)。单击 可添加已安装但还未列出的新模块。要了解模块的更多信息,请参见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.target
和 graphical.target
中启动。您可以使用 YaST 的 或 systemctl
命令行工具(systemctl
enable
或 systemctl disable
)更改此行为。
要在正在运行的系统上启动、停止或操作 Apache,请使用 systemctl
或 apachectl
命令,详见下面的说明。
有关 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 status
和apachectl fullstatus
分别转储不全或完整状态屏幕。需要启用
mod_status
模块,并安装基于文本的浏览器(例如links
或w3m
)。此外,还必须将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
MODULE 或 a2dismod
MODULE。a2enmod -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
提供
Alias
和Redirect
指令,供您将 URL 映射到特定目录 (Alias
),或将请求的 URL 重定向到另一个位置。默认情况下启用此模块。mod_auth*
身份验证模块提供了几种不同的身份验证方法:使用
mod_auth_basic
进行基本身份验证,或使用mod_auth_digest
进行摘要身份验证。mod_auth_basic
和mod_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。
本文档假设 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 模块都是线程安全的。强烈建议不要将 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 脚本是一项潜在的安全性漏洞。请参见第 42.8 节 “避免安全性问题”以了解更多信息。
42.5.1 Apache 配置 #
在 SUSE Linux Enterprise Server 中,只允许在目录 /srv/www/cgi-bin/
中执行 CGI 脚本。已配置此位置来执行 CGI 脚本。如果已经创建了虚拟主机配置(请参见第 42.2.2.1 节 “虚拟主机配置”)并且想将脚本放置在特定于主机的目录中,必须解锁并配置此目录。
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>
指示 Apache 在此目录中将所有文件作为 CGI 脚本处理。 | |
启用 CGI 脚本执行 | |
指示服务器将扩展名为 .pl 和 .cgi 的文件视为 CGI 脚本。根据需要进行调整。 | |
|
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.cgi
或 http://www.example.com/cgi-bin/test.cgi
。应该能看到 “CGI/1.0 测试脚本报告”。
42.5.3 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
填写您的通行口令。 | |
再次填写通行口令(并记住它)。 | |
填写两个字母的国家/地区代码,例如 | |
填写您所在的省/自治区/直辖市名称。 | |
填写城市名称,例如 | |
填写您的工作单位名称。 | |
填写您的组织单位,没有则保留为空白。 | |
填写服务器的域名,或者您的名字和姓氏。 | |
填写您的办公电子邮件地址。 | |
将询问口令保留为空白,否则您每次重启动 Apache Web 服务器时都需要输入该口令。 | |
填写选填的公司名称,或保留为空白。 |
现在可以生成证书。您将再次使用 openssl
,并且证书的格式是默认的 PEM
。
将密钥的私用部分导出到
new.cert.key
。系统将提示您输入您在创建证书签名请求 (CSR) 时所输入的通行口令。>
sudo
openssl rsa -in privkey.pem -out new.cert.key根据您在签名请求中填写的信息生成证书的公共部分。
-days
选项指定证书的有效期。您可以在证书失效前将其撤消或更换。>
sudo
openssl x509 -in new.cert.csr -out new.cert.cert -req \ -signkey new.cert.key -days 365将证书文件复制到相关的目录,以便 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/apache2
中 APACHE_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,某些较旧的浏览器不支持。有关详细信息,请参见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
身份执行所有命令。
在
/etc/sysconfig/apache2
的基础上创建新的配置文件,例如/etc/sysconfig/apache2@example_web.org
:>
sudo
cp /etc/sysconfig/apache2 /etc/sysconfig/apache2@example_web.org编辑文件
/etc/sysconfig/apache2@example_web.org
,将包含以下内容的行APACHE_HTTPD_CONF
更改为
APACHE_HTTPD_CONF="/etc/apache2/httpd@example_web.org.conf"
在
/etc/apache2/httpd.conf
的基础上创建文件/etc/apache2/httpd@example_web.org.conf
。>
sudo
cp /etc/apache2/httpd.conf /etc/apache2/httpd@example_web.org.conf编辑
/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
以便每个实例都有独立的日志。
在
/etc/apache2/listen.conf
的基础上创建/etc/apache2/listen@example_web.org.conf
。>
sudo
cp /etc/apache2/listen.conf /etc/apache2/listen@example_web.org.conf编辑
/etc/apache2/listen@example_web.org.conf
,将Listen 80
更改为要用于运行新实例的端口号,例如 82:
Listen 82
要通过安全协议(请参见第 42.6 节 “使用 SSL 设置安全的 Web 服务器”)运行新的 Apache 实例,还需将下面一行
Listen 443
更改为(示例)
Listen 445
启动新的 Apache 实例:
>
sudo
systemctl start apache2@example_web.org在 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 助手实用程序a2enmod
、a2dismod
和apachectl
将在默认的 Apache 实例上运行。下面的示例>
sudo
export HTTPD_INSTANCE=example_web.org>
sudo
a2enmod access_compat>
sudo
a2enmod status>
sudo
apachectl start会将
access_compat
和status
模块添加到/etc/sysconfig/apache2@example_web.org
的APACHE_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 脚本的执行限制于特定目录而不是全局使用它们。ScriptAlias
和 Option
ExecCGI
指令用于配置。SUSE Linux Enterprise Server 的默认配置不允许随处执行 CGI 脚本。
所有 CGI 脚本都会作为同一个用户运行,所以不同的脚本可能会彼此冲突。模块 suEXEC 允许您在不同的用户和组下运行 CGI 脚本。
42.8.5 用户目录 #
启用用户目录(使用 mod_userdir
或 mod_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
mod_php8
https://www.php.net/manual/en/install.unix.apache2.php
您可以在包含详细注释的主配置文件
/etc/php8/apache2/php.ini
中查看有关mod_php8
配置的详细信息。mod_python
mod_security
42.10.3 开发 #
有关开发 Apache 模块和涉及 Apache Web 服务器项目的更多信息,可以从以下位置处获得:
- Apache 开发人员信息
- Apache 开发人员文档
42.10.4 其他来源 #
如果遇到特定于 SUSE Linux Enterprise Server 中的 Apache 的问题,请查看“技术信息搜索”,网址为:https://www.suse.com/support/。https://httpd.apache.org/ABOUT_APACHE.html 提供了对 Apache 历史的介绍。此页还解释此服务器为什么被称为 Apache。