目录
摘要
根据 http://www.netcraft.com/ 上的调查,Apache HTTP 服务器 (Apache) 所占的市场份额超过了 50%,它是世界上使用最为广泛的一种 Web 服务器。由 Apache 软件基金会 (http://www.apache.org/) 开发的 Apache 适用于大多数操作系统。SUSE® Linux Enterprise Server 包含 Apache 版本 2.2。本章将介绍如何安装、配置和设置 Web 服务器;如何使用 SSL、CGI 和其他模块;以及如何对 Apache 进行查错。
借助本节内容,可快速设置并启动 Apache。您必须是 root 用户才能安装和配置 Apache。
在尝试设置 Apache Web 服务器之前,请确保满足以下要求:
计算机的网络配置正确。有关该主题的详细信息,请参见第 22 章 基本联网知识。
通过与时间服务器同步来维护计算机的准确系统时间。这一点是必需的,因为 HTTP 协议的多个部分依赖于正确的时间。请参见第 24 章 使用 NTP 同步时间来了解该主题的更多信息。
将安装最新的安全更新。如果存在疑问,请运行 YaST 联机更新。
默认 Web 服务器端口 (80) 将在防火墙中打开。为此,请将 SuSEFirewall2 配置为允许外部区域中的服务 。这可以使用 YaST 完成。有关详细信息,请参见Section “Configuring the Firewall with YaST” (Chapter 15, Masquerading and Firewalls, ↑Security Guide)。
SUSE Linux Enterprise Server 中的 Apache 默认不会安装到系统中。要用“即装即用”的标准预定义配置来安装它,请按如下所示继续:
安装包括多处理模块 apache2-prefork 和 PHP5 模块。有关模块的详细信息,请参见第 31.4 节 “安装、激活和配置模块”。
可以自动在引导时启动 Apache 或手动启动它。
过程 31.2. 自动启动 Apache
要确保 Apache 在引导期间自动在运行级别 3 和 5 启动,请执行以下命令:
chkconfig -a apache2
或者启动 YaST,然后选择+。
搜索 apache2 并该服务。
Web 服务器将立即启动。
单击以保存更改。
系统配置为在引导期间自动在运行级别 3 和 5 启动 Apache。
有关 SUSE Linux Enterprise Server 中的运行级别的详细信息和 YaST 运行级别编辑器的描述,请参见第 10.2.3 节 “使用 YaST 配置系统服务(运行级别)”。
要使用外壳手动启动 Apache,请运行 rcapache2 start。
过程 31.3. 检查 Apache 是否正在运行
如果在启动 Apache 时没有收到错误消息,这通常表示 Web 服务器正在运行。测试 Apache 是否正在运行:
启动浏览器,然后打开 http://localhost/。
如果 Apache 已启动并正在运行,您将看到一个测试页,指示“它正在运行!”。
如果看不到此页面,请参见第 31.9 节 “查错”。
既然 Web 服务器已在运行,因此可以添加您自己的文档、根据需要调整配置或通过安装模块来添加功能。
SUSE Linux Enterprise Server 提供了两个配置选项:
手工配置可提供更详细的信息,但没有 YaST GUI 方便。
![]() | 配置更改后重新装载或重启动 Apache |
|---|---|
大多数配置更改需要重新装载(有些还需要重启动)Apache 后才能生效。使用 rcapache2 如果用 YaST 配置 Apache,按第 31.2.3.2 节 “HTTP 服务器配置”中所述将 设置为即可让上述操作自动完成。 | |
本部分概述了 Apache 配置文件。如果使用 YaST 进行配置,则不需要使用这些文件;但如果以后要切换到手动配置,则此信息可能有用。
Apache 配置文件可在两个不同位置处获取:
/etc/sysconfig/apache2¶
/etc/sysconfig/apache2 控制 Apache 的某些全局设置,例如要装载的模块、要包含的其他配置文件、启动服务器时应同时启动的标志,以及应添加到命令行的标志。此文件中的每个配置选项都有详细记录,因此在此不再描述。对于一般用途的 Web 服务器,/etc/sysconfig/apache2 中的设置应足以满足所有配置需要。
/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 地址和端口。基于名称的虚拟主机也在此处配置。有关细节,请参见第 31.2.2.1.1 节 “基于名称的虚拟主机”。
magic
mime_magic 模块的数据帮助 Apache 自动确定 MIME 类型的未知文件。不要更改此文件。
mime.types
MIME 类型可由系统识别(它实际上是一个指向 /etc/mime.types 的链接)。不要编辑此文件。如果需要添加此处没有列出的 MIME 类型,那么请将它们添加到 mod_mime-defaults.conf。
mod_*.conf
默认情况下安装的模块的配置文件。有关细节,请参见第 31.4 节 “安装、激活和配置模块”。注意,可选模块的配置文件储存在目录 conf.d 中。
server-tuning.conf
包含不同 MPM(请参见第 31.4.4 节 “多处理模块”)的配置指令以及控制 Apache 性能的常规配置选项。在此处更改时,请对 Web 服务器进行合理的测试。
ssl-global.conf 和 ssl.*
全局 SSL 配置和 SSL 证书数据。有关细节,请参见第 31.6 节 “使用 SSL 设置安全性 Web 服务器”。
sysconfig.d/*.conf
从 /etc/sysconfig/apache2 自动生成的配置文件。请勿更改这些文件,而应编辑 /etc/sysconfig/apache2。不要在此目录中放置其他配置文件。
uid.conf
指定运行 Apache 的用户和组 ID。不要更改此文件。
vhosts.d/*.conf
虚拟主机配置应位于此处。该目录包含使用和不使用 SSL 的虚拟主机的模板文件。该目录中以 .conf 结尾的所有文件均自动包含在 Apache 配置中。有关详细信息,请参见第 31.2.2.1 节 “虚拟主机配置”。
手动配置 Apache 包括作为 root 用户来编辑纯文本配置文件。
术语虚拟主机指的是 Apache 在一台物理计算机上为多个统一资源标识符 (URI) 提供服务的能力。这意味着在一个物理计算机上的一个 Web 服务器可以运行几个域(例如 www.example.com 和 www.example.net)。
通常的做法是使用虚拟主机来节省管理精力(只需维护一个 Web 服务器即可)和硬件费用(每个域不需要专用的服务器)。虚拟主机可以是基于名称、基于 IP 或基于端口的。
要列出所有现有虚拟主机,请使用命令 httpd2 -S。这将输出一个列表,显示默认服务器和所有虚拟主机以及它们的 IP 地址和侦听端口。此外,该列表还针对每个虚拟主机包含一项,显示其在配置文件中的位置。
可以通过 YaST(如第 31.2.3.1.4 节 “虚拟主机”中所述)或通过手动编辑配置文件来配置虚拟主机。默认情况下,系统会根据 /etc/apache2/vhosts.d/ 中每个虚拟主机一个配置文件的设置,为 SUSE Linux Enterprise Server 中的 Apache 做好准备。该目录中扩展名为 .conf 的所有文件均会自动包含到配置中。虚拟主机的基本模板将在目录 vhost.template 或 vhost-ssl.template 中提供,以用于带有 SSL 支持的虚拟主机。
![]() | 始终创建虚拟主机配置 |
|---|---|
建议您始终创建虚拟主机配置文件,即使您的 Web 服务器仅主管一个域。这样不但可以将特定于域的配置保存在一个文件中,还可以只需移动、删除或重命名虚拟主机的配置文件就能始终回退到有效的基本配置。因此,还应该为每个虚拟主机创建单独的配置文件。
使用基于名称的虚拟主机时,建议设置将在域名与虚拟主机配置不匹配时使用的默认配置。默认虚拟主机即最先装载其配置的虚拟主机。由于配置文件的装载顺序取决于文件名,因此请以下划线字符 ( | |
<VirtualHost></VirtualHost> 块保存适用于特定域的信息。当 Apache 接收到客户端对某已定义虚拟主机的请求时,将使用此部分包含的指令。几乎所有指令均可用在虚拟主机环境中。请参见 http://httpd.apache.org/docs/2.2/mod/quickreference.html 来获取有关 Apache 的配置指令的进一步信息。
使用基于名称的虚拟主机,每个 IP 地址能服务于多个网站。Apache 使用客户端发送的 HTTP 报头中的主机字段来将请求连接到某个虚拟主机声明中匹配的 ServerName 项。如果找不到匹配的 ServerName,则默认使用第一个指定的虚拟主机。
指令 NameVirtualHost 告诉 Apache 在哪个 IP 地址以及(可选)哪个端口上侦听客户端发出的在 HTTP 报头中包含域名的请求。此选项是在配置文件 /etc/apache2/listen.conf 中配置的。
第一个自变量是完全限定的域名,但建议使用 IP 地址。第二个自变量是可选的端口。默认情况下,使用端口 80 并通过 Listen 指令进行配置。
IP 地址和端口号都可以使用通配符 * 来接收所有接口上的请求。IPv6 地址必须括在方括号中。
例 31.1. 基于名称的 VirtualHost 项的变体¶
# NameVirtualHostIP-address[:Port]NameVirtualHost 192.168.3.100:80 NameVirtualHost 192.168.3.100 NameVirtualHost *:80 NameVirtualHost * NameVirtualHost [2002:c0a8:364::]:80
打开 VirtualHost 标记将使先前使用 NameVirtualHost 声明的 IP 地址(或全限定域名)在基于名称的虚拟主机配置中显示为参数。之前使用 NameVirtualHost 指令声明的端口号是可选的。
允许使用通配符 * 代替 IP 地址。该语法仅当和 NameVirtualHost * 中的通配符一起使用时才有效。当使用 IPv6 地址时,地址必须括在方括号中。
例 31.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>
这种备选的虚拟主机配置要求为计算机设置多个 IP。Apache 的一个实例储存多个域,并为每个域指派一个不同的 IP。
物理服务器必须为每个基于 IP 的虚拟主机指定一个 IP 地址。如果计算机没有多个网卡,也可以使用虚拟网络接口(IP 别名)。
以下示例显示,Apache 在 IP 为 192.168.3.100 且储存着其它两个 IP 为 192.168.3.101 和 192.168.3.102 的域的计算机上运行的情况。请为每个虚拟服务器指定一个单独的 VirtualHost 块。
例 31.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) 中找到的指令。
每个虚拟主机配置中至少要有以下指令,这样才能设置虚拟主机。请参见 /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"> Order allow,deny Allow from all </Directory>
完整的配置文件外观如下所示:
例 31.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">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>要使用 YaST 配置 Web 服务器,请启动 YaST,并选择+。第一次启动此模块时,会启动,提示您做出一些有关服务器管理的基本决定。完成向导后,在您每次调用 模块时,对话框都会启动。有关详细信息,请参见第 31.2.3.2 节 “HTTP 服务器配置”。
HTTP 服务器向导包括五个步骤。在对话框的最后一步中,您可以进入专家配置方式进行更特定的设置。
在这里,指定 Apache 用以侦听进来的请求的网络接口和端口。可以选择现有网络接口及其各自 IP 地址的任意组合。可以使用其他服务未预留的所有三个范围内的端口(公认端口、注册端口和动态或私用端口)。默认设置是在端口 80 上侦听所有网络接口(IP 地址)。
选中,在防火墙中打开 Web 服务器侦听的端口。要使 Web 服务器在网络(LAN、WAN 或公共因特网)中可用,这样做是必要的。仅在测试时不必对 Web 服务器进行外部访问的情况下,关闭端口是有用的。如果有多个网络接口,请单击 以指定要在哪些接口上打开端口。
单击继续配置。
配置选项允许激活或停用 Web 服务器应支持的脚本语言。要激活或停用其他模块,请参见第 31.2.3.2.2 节 “服务器模块”。单击进入下一个对话框。
该选项与默认的 Web 服务器相关。正如第 31.2.2.1 节 “虚拟主机配置”中所述,Apache 可以在一台物理计算机上为多台虚拟主机提供服务。配置文件中首先声明的虚拟主机通常被称为默认主机。每个虚拟主机都将继承默认主机的配置。
要编辑主机设置(也称为指令),在表中选择适当的项,然后单击。要添加新指令,请单击。要删除指令,请选择该主机,然后单击。
这里是服务器默认设置的列表:
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.conf(apache2-manual 配置文件)。
Server Name
这指定了客户端用来联系 Web 服务器的默认 URL。使用完全限定的域名 (FQDN) 到达 Web 服务器(位于 http://)或其 IP 地址。不能在此处随意选择名称 - 服务器在此名称下必须是“已知”的。
FQDN/
Server Administrator E-Mail
服务器管理员的电子邮件地址。例如,此地址将显示在 Apache 创建的错误页面上。
完成步骤后,单击继续完成配置。
在本步骤中,向导显示已配置的虚拟主机(请参见第 31.2.2.1 节 “虚拟主机配置”)的列表。如果启动 YaST HTTP 向导前未进行手动更改,将不显示虚拟主机。
要添加主机,请单击以打开一个对话框,可在其中输入有关该主机的基本信息,如、 (DocumentRoot) 和。用来确定如何识别主机(基于名称或基于 IP)。通过 指定名称或 IP 地址
单击进入虚拟主机配置对话框的第二部分。
在虚拟主机配置的第二部分中,可以指定是否启用 CGI 脚本以及用于这些脚本的目录。还可启用 SSL。如果要启用,还必须指定证书的路径。请参见第 31.6.2 节 “使用 SSL 配置 Apache”了解有关 SSL 和证书的细节。使用选项,可指定在客户端请求目录时所显示的文件(默认情况下为 index.html)。如果要更改此选项,请添加一个或多个文件名(用空格分隔)。使用,用户公共目录 (~) 的内容将在服务器的 user/public_html/http://www.example.com/~ 下公开。
user
![]() | 创建虚拟主机 |
|---|---|
不能随意添加虚拟主机。如果使用基于名称的虚拟主机,必须在网络上解析每个主机名。如果使用基于 IP 的虚拟主机,则仅可向每个可用的 IP 地址指定一个主机。 | |
这是本向导的最后一步。在此,确定 Apache 服务器启动的方式和时间:何时引导或手动引导。另请参见迄今为止所作配置的简短摘要。如果对设置满意,单击以完成配置。如果要进行更改,请单击直至显示所需的对话框。单击 打开第 31.2.3.2 节 “HTTP 服务器配置”中所述的对话框。
对话框还允许您对配置进行比在向导(它只在您首次配置 Web 服务器时运行)中更多的调整。它由四个如下所述的选项卡组成。在此处更改的任何配置选项都不会立即生效,总是需要使用来确认更改从而使其生效。单击退出配置模块并丢弃所作更改。
在 中,选择应该运行()还是停止()Apache。在中,、或服务器可用的地址和端口。默认设置是在端口 80 上侦听所有接口。应始终选中,否则无法从外部访问 Web 服务器。仅在测试时不必对 Web 服务器进行外部访问的情况下,关闭端口是有用的。如果有多个网络接口,请单击 以指定要在哪些接口上打开端口。
使用查阅访问日志或错误日志。如果要测试配置,这很有用。该日志文件将在单独的窗口中打开,您还可从该窗口重启动或重新装载 Web 服务器。有关详细信息,请参见 第 31.3 节 “启动和停止 Apache”. 这些命令将立即生效,并且其日志消息也会立即显示。
可以通过单击来更改 Apache2 模块的状态(启用或禁用)。单击可添加已安装但还未列出的新模块。要了解模块的更多信息,请参见第 31.4 节 “安装、激活和配置模块”。
如果使用 YaST 配置(如第 31.2.3 节 “使用 YaST 配置 Apache”中所述),则 Apache 在引导时在运行级别 3 和 5 启动,在运行级别 0、1、2 和 6 停止。您可以使用 YaST 的运行级别编辑器或命令行工具 chkconfig 更改此行为。
要在正在运行的系统上启动、停止或操作 Apache,请使用 init 脚本 /usr/sbin/rcapache2。有关 init 脚本的常规信息,请参见第 10.2.2 节 “Init 脚本”。rcapache2 命令使用以下参数:
status
请检查 Apache 是否已启动。
start
如果 Apache 未在运行,则启动它。
startssl
如果支持 SSL 的 Apache 未在运行,则启动它。有关 SSL 支持的详细信息,请参见第 31.6 节 “使用 SSL 设置安全性 Web 服务器”。
stop
通过终止父进程来停止 Apache。
restart
停止然后重启动 Apache。如果 Web 服务器没有预先运行,则启动它。
try-restart
仅当 Apache 已在运行时才停止并重启动它。
reload 或 graceful
停止 Web 服务器时,应建议所有生成的 Apache 进程在关闭之前首先完成它们的请求。每个进程终止时,会替换为一个新启动的进程,继而导致 Apache 完全“重启动”。
![]() | 在生产环境中重启动 Apache |
|---|---|
要激活 Apache 配置更改而不致使连接中断,请使用 rcapache2 | |
restart-graceful
启动另一台用于立即处理所有进来的请求的 Web 服务器。Web 服务器的上一个实例将继续处理用 GracefulShutdownTimeout 配置的已定义时间段的所有现有请求。
rcapache2 restart-graceful 在升级到新版本或更改需要重启动的配置选项时很有用。使用此选项确保将服务器停机时间减至最短。
需要设置 GracefulShutdownTimeout,否则 restart-graceful 将导致经常性重启动。如果设置为零,该服务器将无限期地等待,直至所有剩余请求都全部完成。
如果原始 Apache 实例无法清除所有必需资源,则正常重启动可能会失败。这种情况下,该命令将执行正常停止。
stop-graceful
在使用 GracefulShutdownTimeout 配置已定义的时间段后停止 Web 服务器,以便确保可以完成现有请求。
需要设置 GracefulShutdownTimeout,否则 stop-graceful 将导致经常性重启动。如果设置为零,该服务器将无限期地等待,直至所有剩余请求都全部完成。
configtest 或 extreme-configtest
在不影响运行的 Web 服务器的情况下检查配置文件的语法。由于此检查是在服务器每次启动、重新装载或重启动时强制执行的,所以通常不需要明确运行测试(如果发现配置错误,则 Web 服务器将不会启动、重新装载或重启动)。extreme-configtest 选项将以 nobody 用户身份启动 Web 服务器,并实际装载该配置,因此可以检测出更多错误。请注意,尽管已装载此配置,但仍不能测试 SSL 设置,因为 nobody 不能读取 SSL 证书。
probe
探测重装载的必要性(检查配置是否已更改)并向 rcapache2 命令建议应该使用的参数。
server-status 和 full-server-status
分别转储不全或完整状态屏幕。需要安装 lynx 或 w3m 并启用 mod_status 模块。此外,还必须将状态添加到文件 /etc/sysconfig/apache2 中的 APACHE_SERVER_FLAGS。
![]() | 其他标志 |
|---|---|
如果向 rcapache2 指定其他标志,则这些标志将传到 Web 服务器。 | |
Apache 软件是以模块化方式构建的:除某些核心任务外的所有功能都是通过模块处理的。到目前为止,即使是 HTTP 也是由模块(http_core)处理的。
Apache 模块可以在构建时编译进 Apache 二进制文件中或在运行时动态装载。请参见第 31.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 负责接受和处理对 Web 服务器的请求,代表 Web 服务器软件的核心。
如果如第 31.1.2 节 “安装”中所述执行了默认安装,则表示已安装以下模块:所有基本和扩展模块、多处理模块 Prefork MPM 以及外部模块 mod_php5 和 mod_python。
您可以启动 YaST,然后选择+,来安装其他外部模块。现在请选择+并搜索 apache。在其他包中,结果列表将包含所有可用的外部 Apache 模块。
手动或用 YaST 激活或停用特定模块。在 YaST 中,需要使用第 31.2.3.1 节 “HTTP 服务器向导”中所述的模块配置启用或禁用脚本语言模块(PHP5、Perl 和 Python)。可以按第 31.2.3.2.2 节 “服务器模块”中所述启用或禁用所有其他模块。
如果要手动激活或停用模块,则分别使用命令 a2enmod mod_foo 或 a2dismodmod_foo。a2enmod -l 将输出当前所有活动模块的列表。
![]() | 包含外部模块的配置文件 |
|---|---|
如果已经手动激活外部模块,则确保在所有虚拟主机配置中装载其配置文件。外部模块的配置文件位于 | |
Apache 文档中对所有基础模块和扩展模块均进行了详细的描述。此处仅提供大多数重要模块的简短描述。请参见 http://httpd.apache.org/docs/2.2/mod/ 以了解有关每个模块的详细信息。
mod_actions
请求某个特定 MIME 类型(如 application/pdf)、带特定扩展名的文件(如 .rpm)或某个特定请求方法(如 GET)时,提供执行脚本的方法。默认情况下启用此模块。
mod_alias
提供 Alias 和 Redirect 指令,可使用这些指令将 URl 映射到特定目录(别名)或将请求的 URL 重定向到其他位置。默认情况下启用此模块。
mod_auth*
身份验证模块提供不同的身份验证方法:使用 mod_auth_basic 的基本身份验证或使用 mod_auth_digest 的摘要身份验证。Apache 2.2 中的摘要身份验证仍处于试验阶段。
mod_auth_basic 和 mod_auth_digest 必须与身份验证提供程序模块 mod_authn_*(例如,用于基于文本文件的身份验证的 mod_authn_file),以及授权模块 mod_authz_*(例如,用于用户授权的 mod_authz_user)结合使用。
有关该主题的更多信息可以从Authentication HOWTO中获取,网址是 http://httpd.apache.org/docs/2.2/howto/auth.html.
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_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.2/content-negotiation.html 获取更多信息。默认情况下启用此模块。
mod_nss
使用 Mozilla 网络安全服务库通过 TLS 1.1 和 TLS 1.2 协议在 Web 服务器与客户端之间启用加密连接。有关详细信息,请参见第 31.7 节 “使用 NSS 设置安全 Web 服务器”。
mod_rewrite
提供 mod_alias 的功能,但功能更全且更为灵活。使用 mod_rewrite,便可根据多个规则、请求报头等来重定向 URL。
mod_setenvif
基于客户端的请求细节(如客户端发送的浏览器字符串或客户端的 IP 地址)来设置环境变量。默认情况下启用此模块。
mod_speling
mod_speling 尝试自动更正 URL 中的印刷错误,例如大小写错误。
mod_ssl
在 Web 服务器和客户端之间启用加密连接。有关详细信息,请参见第 31.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 指令。默认情况下启用此模块。
SUSE Linux Enterprise Server 提供了两个不同的多处理模块 (MPM) 来结合 Apache 使用:
prefork MPM 实现非线程的预生成 Web 服务器。它使 Web 服务器在行为上类似于 Apache 版本 1.x。在该版本中,它隔离每个请求并通过派生单独的子进程来处理请求。这样,有问题的请求就不会影响其他请求,避免了 Web 服务器被锁定。
此基于进程的方法 prefork MPM 虽然提供了稳定性,但比相应的 worker MPM 消耗更多的系统资源。prefork MPM 被视为是基于 Unix 操作系统的默认 MPM。
![]() | 本文档中的 MPM |
|---|---|
本文档假设 Apache 使用 prefork 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 与 | |
此处提供了 SUSE Linux Enterprise Server 随附的所有外部模块的列表。
为 Apache 提供额外支持,以便对由 mod_php5 和 mod_perl 等模块处理的各个 CGI 脚本设置 AppArmor 限制。
包名称:apache2-mod_apparmor |
| 更多信息:Part “Confining Privileges with AppArmor” (↑Security Guide) |
mod_mono
mod_auth_kerb 提供访问 Apache Web 服务器的 Kerberos 身份验证。
包名称:apache2-mod_auth_kerb |
| 更多信息:http://modauthkerb.sourceforge.net/configure.html |
mod_mono
使用 mod_mono 允许您在服务器中运行 ASP.NET 页。
包名:apache-mod_mono |
配置文件:/etc/apache2/conf.d/mod_mono.conf |
mod_perl
mod_perl 使您能够在嵌入的解释器中运行 Perl 脚本。服务器中嵌入的持久解释器能够避免启动外部解释器并且不会损失 Perl 启动时间。
包名称:apache2-mod_perl |
配置文件:/etc/apache2/conf.d/mod_perl.conf |
更多信息:/usr/share/doc/packages/apache2-mod_perl |
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/ |
高级用户可以通过编写自定义模块来扩展 Apache。要开发 Apache 模块或编译第三方模块,就需要 apache2-devel 包以及相应的开发工具。apache2-devel 还包含 apxs2 工具,此工具是编译其他 Apache 模块所必需的。
apxs2 允许从源代码编译和安装模块(包括对配置文件进行必要的更改),这将创建可在运行时装载入 Apache 的动态共享对象 (DSO)。
apxs2 二进制文件在 /usr/sbin 中:
/usr/sbin/apxs2 — 适合用来构建可搭配任何 MPM 使用的扩展模块。安装位置为 /usr/lib/apache2。
/usr/sbin/apxs2-prefork — 适用于 prefork MPM 模块。安装位置为 /usr/lib/apache2-prefork。
/usr/sbin/apxs2-worker — 适用于 worker MPM 模块。安装位置为 /usr/lib/apache2-worker。
使用以下命令从源代码安装并激活模块:
cd /path/to/module/source; apxs2 -cia
mod_foo.c
其中,-c 编译该模块,-i 安装该模块,-a 激活该模块。apxs2 的其他选项在 apxs2(1) 手册页中有描述。
Apache 的通用网关接口 (CGI) 允许您使用程序或脚本(通常指 CGI 脚本)创建动态内容。可以用任何编程语言来编写 CGI 脚本。通常使用诸如 Perl 或 PHP 之类的脚本语言。
为了使 Apache 能够递送由 CGI 脚本创建的内容,需要激活 mod_cgi。另外还需要 mod_alias。默认情况下启用这两种模块。请参见第 31.4.2 节 “激活和停用”来获取有关激活模块的详细信息。
![]() | CGI 安全性 |
|---|---|
允许服务器执行 CGI 脚本是一项潜在的安全性漏洞。请参见第 31.8 节 “避免安全性问题”以了解更多信息。 | |
在 SUSE Linux Enterprise Server 中,仅允许在目录 /srv/www/cgi-bin/ 中执行 CGI 脚本。已配置此位置来执行 CGI 脚本。如果已经创建了虚拟主机配置(请参见第 31.2.2.1 节 “虚拟主机配置”)并且想将脚本放置在特定于主机的目录中,必须解锁并配置此目录。
例 31.5. VirtualHost CGI 配置¶
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。
可通过 Web 服务器访问的文件应由用户 root 拥有。有关更多信息,请参见第 31.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 测试脚本报告”。
如果没有看到测试程序的输出而是看到了错误消息,则请检查以下项:
CGI 查错
是否在更改配置后重装载了服务器?请检查 rcapache2 probe。
如果已经配置了自定义 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,则问题应该不大,但是如果正在使用您自己的程序,则始终要确保它们没有编程错误。
只要在 Web 服务器和客户端之间传送敏感数据(如信用卡信息),就需要具有带身份验证的安全的加密连接。mod_ssl 使用安全套接字层(SSL)和传输层安全(TLS)协议来为客户端和 Web 服务器之间的 HTTP 通信提供强有力的加密机制。使用 SSL/TSL 时,将在 Web 服务器和客户端之间建立专用连接。能够确保数据完整性,并且客户端和服务器能够彼此验证。
基于此目的,服务器在回答对 URL 的任何请求之前,会发送一个 SSL 证书,其中包含证明服务器有效身份的信息。反过来,这保证了该服务器对于通信来说是唯一正确的终端。此外,证书使得在客户端和服务器之间建立起加密连接,确保在不泄露敏感的明文内容的情况下传输信息。
mod_ssl 不实施 SSL/TSL 协议本身,而是充当 Apache 和 SSL 库之间的接口。在 SUSE Linux Enterprise Server 中,将使用 OpenSSL 库。OpenSSL 将自动随 Apache 安装。
![]() | 高于 TLS 1.0 的 TLS 版本 |
|---|---|
openssl 库支持的最高 TLS 版本为 1.0,不支持较新的 TLS 1.1 或 1.2 等版本。 | |
将 mod_ssl 与 Apache 一起使用的最明显效果就是 URL 的前缀为 https://(而不是 http://)。
![]() | 示例证书 |
|---|---|
安装包 | |
为了将 SSL/TSL 与 Web 服务器一起使用,需要创建 SSL 证书。在 Web 服务器和客户端之间授权时需要此证书,以便每一方都能明确地识别另一方。为了确保证书的完整性,证书必须由所有用户都信任的一方签署。
您可创建三种类型的证书:“虚设”证书(仅用于测试)、自我签名证书(用于信任您的指定用户群)和由独立的、众所周知的证书颁发机构 (CA) 签署的证书。
创建证书一般分为两步。首先,生成证书颁发机构的私用密钥,然后使用此密钥签署服务器证书。
![]() | 更多信息 |
|---|---|
要想更多地了解 SSL/TSL 的概念和定义,请参见 http://httpd.apache.org/docs/2.2/ssl/ssl_intro.html。 | |
虚设证书的生成非常简单。只需调用脚本 /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
/root/.mkcert.cfg
还会将 ca.crt 的副本放在 /srv/www/htdocs/CA.crt 下以供下载。
![]() | 仅供测试 |
|---|---|
不能在生产系统上使用虚设证书。它只能用来测试。 | |
如果要为内部网或指定用户群设置安全的 Web 服务器,只需通过您自己的证书颁发机构 (CA) 来签署证书即可。
创建自签署证书由 9 个交互的步骤组成。更改为目录 /usr/share/doc/packages/apache2,然后运行以下命令:./mkcert.sh make --no-print-directory /usr/bin/openssl /usr/sbin/ custom。请勿从此目录外运行该命令。程序将提供一系列的提示,其中一部分需要用户输入。
过程 31.4. 使用 mkcert.sh 创建自签署的证书¶
决定用于证书的签名算法
选择 RSA(R,默认值),因为一些旧的浏览器在使用 DSA 时存在问题。
生成 CA 的 RSA 私用密钥(1024 位)
不需要交互。
生成 CA 的 X.509 证书签署请求
在此处创建 CA 的判别名。这要求您回答几个问题,例如国家/地区名称或组织名称。输入有效数据,因为在此处输入的内容稍后会显示在证书中。无需回答所有问题。如果有问题不适用于您或者您不想回答,请使用“.”. 常用名就是 CA,请选择一个重要的名称,例如我的公司 CA。
![]() | CA 的常用名 |
|---|---|
CA 的常用名必须不同于服务器的常用名,因此请勿在此步骤中选择完全限定的主机名。 | |
为自签署的 CA 生成 X.509 证书
选择证书版本 3(默认值)。
生成 SERVER 的 RSA 私用密钥(1024 位)
不需要交互。
生成 SERVER 的 X.509 证书签署请求
为此处的服务器密钥创建判别名。问题与 CA 判别名的问题几乎相同。在此处输入的数据适用于 Web 服务器,而且可以与 CA 的数据不同。(例如,如果服务器在其他地方)
![]() | 选择常用名 |
|---|---|
在此处输入的常用名必须是安全服务器的全限定主机名(例如,www.example.com)。否则,在访问 Web 服务器时,浏览器将发出一条警告,指示在证书与服务器不匹配。 | |
生成由 CA 签署的 X.509 证书
选择证书版本 3(默认值)。
使用通行口令加密 CA 的 RSA 私用密钥以确保安全性
强烈建议使用口令加密 CA 的私用密钥,所以请选择 Y 并输入一个口令。
使用通行口令加密服务器的 RSA 私用密钥以确保安全性
使用口令加密服务器密钥要求您在每次启动 Web 服务器时输入此口令。这对于在引导时自动启动服务器或重启动 Web 服务器有点困难。因此,通常在回答此问题时选择 N。要了解在没有使用口令加密时您的密钥是不受保护的,并且保证只有授权个人才有权访问此密钥。
![]() | 加密服务器密钥 |
|---|---|
如果选择使用口令加密服务器密钥,则请在 | |
脚本结果页面上将出现一个储存它已经生成的证书和密钥的列表。与脚本输出结果不同的是,文件没有在本地目录 conf 中生成,而是在 /etc/apache2/ 下的适当位置处生成。
最后一步就是将 CA 证书文件从 /etc/apache2/ssl.crt/ca.crt 复制到用户可以访问的位置,从而将它合并到 Web 浏览器中已知、可信的 CA 的列表中。否则,浏览器将指示证书是由未知授权者发出的。证书的有效期为 1 年。
![]() | 自我签名证书 |
|---|---|
仅在 Web 服务器上使用自签署证书,此证书必须可由知道并相信您是证书授权者的人员访问。例如,不建议在公共商店使用此类证书。 | |
签署证书的正式证书颁发机构有很多。证书是由值得信任的第三方签署的,所以可以完全相信。公共操作安全 Web 服务器通常具有正式签署的证书。
最常见的正式 CA 是 Thawte (http://www.thawte.com/) 或 Verisign (http://www.verisign.com)。这些 CA 以及其他 CA 已合并到所有浏览器中,所以由这些证书颁发机构签署的证书将被浏览器自动接受。
请求正式签署的证书时,无需向 CA 发送证书。相反,请发出证书签署请求 (CSR)。要创建 CSR,请调用脚本 /usr/share/ssl/misc/CA.sh -newreq。
首先,脚本将询问加密 CSR 的口令。然后,会要求您输入判别名。这要求您回答几个问题,例如国家/地区名称或组织名称。输入有效的数据,在此处输入的所有内容稍后都会显示在证书中并检查。无需回答所有问题。如果有问题不适用于您或者您不想回答,请使用“.”. 常用名就是 CA,请选择一个重要的名称,例如我的公司 CA。最后,必须输入询问口令和备用的公司名称。
在调用脚本的目录中查找 CSR。文件名是 newreq.pem。
Web 服务器端的 SSL 和 TLS 请求的默认端口是 443。在端口 80 上的“普通” Apache 侦听和端口 443 上支持 SSL/TLS 的 Apache 侦听之间没有冲突。事实上,HTTP 和 HTTPS 可以使用相同的 Apache 实例运行。通常使用一个虚拟主机将请求发送到端口 80 和端口 443 以区分虚拟服务器。
![]() | 防火墙配置 |
|---|---|
记住在端口 443 上为支持 SSL 的 Apache 打开防火墙。可以按Section “Configuring the Firewall with YaST” (Chapter 15, Masquerading and Firewalls, ↑Security Guide)中的描述使用 YaST 来完成此操作。 | |
在全局服务器配置中,SSL 模块默认情况下处于启用状态。如果它在您的主机上已禁用,请使用以下命令激活它:a2enmod ssl。要最终启用 SSL,需要使用标志“SSL”启动服务器。要执行此操作,请调用 a2enflag SSL。如果打算使用口令加密服务器证书,则还应增加 /etc/sysconfig/apache2 中 APACHE_TIMEOUT 的值,这样在 Apache 启动时,您就有足够的时间输入通行口令。重启动服务器可使这些更改生效。仅重装载是不够的。
虚拟主机配置目录中包含模板 /etc/apache2/vhosts.d/vhost-ssl.template,该模板带有详细记录的特定于 SSL 的指令。请参见第 31.2.2.1 节 “虚拟主机配置”了解通用虚拟主机配置。
要开始操作,请将模板复制到 /etc/apache2/vhosts.d/ 并对其进行编辑。调整以下指令的值应该就足够了:
mySSL-host.conf
DocumentRoot
ServerName
ServerAdmin
ErrorLog
TransferLog
默认情况下,不能在仅具有一个 IP 地址的服务器上运行多个启用了 SSL 的虚拟主机。基于名称的虚拟主机要求 Apache 了解已请求了哪些服务器名称。SSL 连接问题在于,此类请求只能在已建立 SSL 连接之后读取(通过使用默认虚拟主机)。因此用户将收到警告消息,指示证书与服务器名称不匹配。
SUSE Linux Enterprise Server 提供了一个 SSL 协议扩展:服务器名称指示 (SNI)。该协议会在 SSL 协商过程中发送虚拟域的名称,从而解决了这一问题。这样服务器就能提前“切换”到正确的虚拟域,并向浏览器显示正确的证书。
SUSE Linux Enterprise Server 上默认会启用 SNI。为了使基于名称的虚拟主机能够使用 SSL,可如第 31.2.2.1.1 节 “基于名称的虚拟主机”中所述配置服务器(请注意,需要将端口 443 而不是端口 80 用于 SSL)。
![]() | SNI 浏览器支持 |
|---|---|
客户端也必须支持 SNI。尽管大多数浏览器都支持 SNI,但一些用于移动硬件的浏览器以及 Windows* XP 上的 Internet Explorer 和 Safari 仍缺少 SNI 支持。有关详细信息,请参见http://en.wikipedia.org/wiki/Server_Name_Indication。
使用指令
在服务器配置中设置为 | |
mod_nss 模块使用传输层安全 (TLS) 协议 1.1 和 1.2 版本提供强加密,使用 mod_ssl 提供的 Apache 时则无法应用这两个协议版本。
apache2 包中的 SSL/TLS 支持一般由 apache 模块 mod_ssl 提供,它使用 openssl 加密库来提供 SSL/TLS。SUSE Linux Enterprise Server 11 SP4 中使用的 openssl 库版本只支持 TLS 1.0 版。要提供 TLS 1.1 和 1.2 支持,只能使用与 SLE 11 SP4 中的众多包不兼容的版本。另一种方法是使用 mozilla-nss 包所提供的 Mozilla 网络安全服务库。
![]() | SSLv2 支持 |
|---|---|
| |
mod_ssl 和 mod_nss 可以同时初始化,但它们的协议处理程序(对于 mod_ssl,处理程序为 SSLEngine on,对于 mod_nss 为 NSSEngine on)无法在全局范围或者存在 VirtualHost 配置指令块的情况下同时运行。
如果仅有一个 VirtualHost 部分的指令 NSSEngine 设置为 on,则它将优先于 Apache 侦听的一个端口的所有其他 VirtualHost 声明(可能在其环境中将 SSLEngine 设置为 on)。不可以在同一个 IP 地址和端口上同时针对不同的 VirtualHost 运行两个模块。如果您需要同时使用 mod_nss 和 mod_ssl 来支持加密连接,应该考虑使用多个 IP 地址,并且将服务器的加密模块配置为与其 IP 地址绑定。如果不需要同时使用两个密码模块,则建议您决定启用其中一个,而将另一个停用。
由于 mmod_nss 对于服务器、CA 证书和私用密钥使用数据库格式,因此需要将基于 mod_ssl 的现有证书进行转换,以便用于 mmod_nss。apache2-mod_nss 包中包含用于执行此任务的 perl 脚本 /usr/sbin/mod_nss_migrate.pl。该脚本会新建数据库。
要列出 NSS 数据库中所含的证书,请使用以下命令:
certutil -d /etc/apache2/mod_nss.d -L
有关 certutil NSS 数据库管理实用程序的详细信息,请使用 certutil --help。
mod_nss 包自带的默认配置文件是 /etc/apache2/conf.d/mod_nss.conf。有关详细信息,请查看文件中的注释。
对公共因特网开放的 Web 服务器需要不断加强管理。对于软件和意外的错误配置,安全问题似乎都是不可避免的。有关如何处理这些问题,在此有一些提示。
在 Apache 软件中发现漏洞时,SUSE 将会发出安全忠告。其中包含修复漏洞的描述,用户应该尽快地依次采纳这些描述。SUSE 安全性声明可以从以下位置处获取:
在 SUSE Linux Enterprise Server 中,默认情况下,DocumentRoot 目录 (/srv/www/htdocs) 和 CGI 目录 (/srv/www/cgi-bin) 的所有权属于 root 用户和组。您不能更改这些权限。如果任何用户都可写入这些目录,则任何用户都可以将文件放入这些目录中。之后,具有 wwwrun 权限(该权限允许用户随意访问文件系统资源)的 Apache 可能会执行这些文件。使用 /srv/www 的子目录可存放虚拟主机的 DocumentRoot 和 CGI 指令,并确保目录和文件属于用户和组 root。
默认情况下,在 /etc/apache2/httpd.conf 中拒绝对整个文件系统的访问。不应该重写这些指令,而是要明确启用对 Apache 可读的所有目录的访问权。有关详细信息,请参见 第 31.2.2.1.3 节 “基本虚拟主机配置”. 如此操作后,请确保任何重要文件(例如口令或系统配置文件)均不能从外部读取。
Perl、PHP、SSI 或任何其他编程语言中的交互脚本基本上可以运行任意命令,因此存在通常的安全性问题。从服务器执行的脚本只能从服务器管理员信任的源安装,允许用户运行他们拥有的所有脚本通常不是好的做法。还建议对所有脚本执行安全性审计。
为了尽可能简化脚本的管理,通常会将 CGI 脚本的执行限制于特定目录而不是全局使用它们。指令 ScriptAlias 和 Option ExecCGI 用于配置。SUSE Linux Enterprise Server 的默认配置不允许随处执行 CGI 脚本。
所有 CGI 脚本都会作为同一个用户运行,所以不同的脚本可能会彼此冲突。模块 suEXEC 允许您在不同的用户和组下运行 CGI 脚本。
启用用户目录(使用 mod_userdir 或 mod_rewrite)时,一定不要使用 .htaccess 文件,这些文件允许用户重写安全设置。至少应该使用指令 AllowOverRide 来限制用户的注册。在 SUSE Linux Enterprise Server 中,.htaccess 文件默认处于启用状态,但用户在使用 mod_userdir(请参见 /etc/apache2/mod_userdir.conf 配置文件)时不允许覆盖任何 Option 指令。
如果 Apache 不启动、网页不可访问或用户无法连接到 Web 服务器,那么找出问题的原因是很重要的。下面是几处查找错误描述的常见位置和需要检查的重要事项:
不要使用二进制文件 /usr/sbin/httpd2 启动和停止 Web 服务器,而应使用 rcapache2 脚本(如第 31.3 节 “启动和停止 Apache”中所述)。它详细描述了错误,甚至还提供解决配置错误的提示。
不管是致命错误还是非致命错误,都请检查 Apache 日志文件了解原因,主要是默认位于 /var/log/apache2/error_log 的错误日志文件。此外,如果需要日志文件记录得更详细一些,可以使用 LogLevel 指令来控制所记录消息的详细程度。
![]() | 简单测试 |
|---|---|
使用命令 tail -F /var/log/apache2/ | |
常见错误之一是在服务器的防火墙配置中未打开针对 Apache 的端口。如果使用 YaST 配置 Apache,有一个单独的选项用于这个具体问题(请参见 第 31.2.3 节 “使用 YaST 配置 Apache”)。如果正在手工配置 Apache,则请通过 YaST 的防火墙模块打开 HTTP 和 HTTPS 的防火墙端口。
如果借助于以上所有信息仍无法找到错误原因,请检查 http://httpd.apache.org/bug_report.html 的联机 Apache 错误数据库。此外,可以通过 http://httpd.apache.org/userslist.html 上的邮件列表联系 Apache 用户社区。建议使用的新闻组是 comp.infosystems.www.servers.unix。
包 apache2-doc 中包含有关本地安装和参考的多种本地化版本的完整 Apache 手册。它在默认情况下是不安装的,最快的安装方法是使用命令 zypper in apache2-doc。一旦安装,Apache 手册便可从 http://localhost/manual/ 获取。还可在 Web 上的 http://httpd.apache.org/docs-2.2/ 访问它。特定于 SUSE 的配置提示可以在目录 /usr/share/doc/packages/apache2/README.* 中获得。
有关 Apache 2.2 中新功能的列表,请参见 http://httpd.apache.org/docs/2.2/new_features_2_2.html。可以在 http://httpd.apache.org/docs-2.2/upgrading.html 获得有关从版本 2.0 升级到 2.2 的信息。
有关第 31.4.5 节 “外部模块”中简述的外部 Apache 模块的更多信息,可在以下位置找到:
mod_mono
mod_perl
mod_php5
mod_python
mod_security
有关开发 Apache 模块和涉及 Apache Web 服务器项目的更多信息,可以从以下位置处获得:
如果遇到特定于 SUSE Linux Enterprise Server 中的 Apache 的问题,请查看“技术信息搜索”,网址为:http://www.novell.com/support。http://httpd.apache.org/ABOUT_APACHE.html 提供了对 Apache 历史的介绍。此页还解释此服务器为什么被称为 Apache。