46.5. Apache 模块

Apache 软件以模块形式构建:模块处理除部分核心任务之外的所有功能。到目前为止,即使是 HTTP 也是由模块(http_core)处理的。

Apache 模块可以在构建时编译进 Apache 二进制文件中或在运行时动态装载。对于运行时装载,有关手工装载模块的信息请参见 第 46.3.2.2.1 节 “LoadModule module_identifier /path/to/module,有关使用 YaST 的信息请参见 模块

SUSE Linux 中的 Apache 在 apache2 RPM 中提供了以下模块(这里省略前缀“mod_”):access、actions、alias、asis、auth、auth_anon、auth_dbm、auth_digest、auth_ldap、autoindex、cache、case_filter、case_filter_in、cern_meta、cgi、charset_lite、dav、dav_fs、deflate、dir、disk_cache、dumpio、echo、env、expires、ext_filter、file_cache、headers、imap、include、info、ldap、log_config、log_forensic、logio、mem_cache、mime、mime_magic、negotiation、proxy、proxy_connect、proxy_ftp、proxy_http、rewrite、setenvif、speling、ssl、status、suexec、unique_id、userdir、usertrack 和 vhost_alias。此外,SUSE Linux 还提供了需要单独安装的 RPM 包形式的以下 Apache 模块:apache2-mod_auth_mysqlapache2-mod_fastcgiapache2-mod_macroapache2-mod_murkaapache2-mod_perlapache2-mod_php4apache2-mod_php5apache2-mod_pythonapache2-mod_ruby

部分模块在本节有很详细的记录。有关基本发布版中其他模块的描述,请访问 Apache 模块万维网站点(http://httpd.apache.org/docs-2.0/mod/)。有关第三方模块,请参见 http://modules.apache.org/

Apache 模块可以划分为三个不同的类别:基本模块、扩展模块和外部模块。

46.5.1. 基础模块

默认情况下,基础模块将编译到 Apache 中。除非在构建时明确除去,否则它们是可用的。SUSE Linux 中的 Apache 内仅编译了最少的基础模块,但所有的基础模块均作为共享对象可用:它们不包含在 /usr/sbin/httpd2 二进制文件中,而是可以在运行时通过在 /etc/sysconfig/apache2 中配置 APACHE_MODULES 包含进来。

46.5.1.1. 使用 mod_include 的服务器端包含

mod_include 提供了在将数据发送到客户端之前的一种文件处理方式。通常,mod_include 用于将文件包含在一个文档中,这些文件在到达客户端之前分析为 HTML。因此这称为服务器端包含(SSI)。

使用 SSI,可以在服务器端执行特殊命令,由格式化的 SGML 注释触发。这些 SGML 命令的语法为:

<!--#element attribute=value --> 

有关元素特性值的列表,请参见 http://httpd.apache.org/docs-2.0/mod/mod_include.html 处的 mod_include 文档。

要在 SUSE Linux 中使用 mod_include,请将 include 添加到 /etc/sysconfig/apache2 中的 APACHE_MODULES 中或如 模块 中所述使用 YaST。

[Tip]提示

使用 XBitHack 指令(http://httpd.apache.org/docs-2.0/mod/mod_include.html#xbithack)可指示 Apache 为 SSI 指令分析带有 execute 位设置的文件。

这意味着不必更改文件的扩展名来将其标记为持有 SSI 元素(在以上示例中为 .shtml),使用常规的 .html 文件并运行 chmod +x myfile.html 即可。

46.5.1.2. 通用网关接口:mod_cgi

mod_cgi 使 Apache 可以传递由外部 CGI(通用网关接口,Common Gateway Interface)程序或脚本创建的内容。它作为物理计算机上可用的编程语言和 Apache 万维网服务器之间的实例。在理论上,可以用任何编程语言来编写 CGI 脚本。通常,使用的语言有 PerlCmod_cgi 是包含万维网站点上动态内容的最常用方法。

CGI 编程不同于“常规”编程,因为 CGI 程序和脚本必须要能够生成 Content-type:text/html MIME 类型才能产生 HTML 输出。

例 46.11. Perl 中的简单 CGI 脚本

#!/path/to/perl 
print "Content-type:text/html\n\n"; 
print "Hello, World."; 

特别与某种编程语言(例如 mod_php5)绑定的模块和 mod_cgi 之间的区别在于 mod_cgimod_suexec 的结合使用上(请参见 第 46.5.2.1 节 “使用 mod_suexec 作为另一个用户运行 CGI。 ”)。此结合允许用特定的用户 ID 来执行 CGI 脚本。通常,只使用 mod_cgimod_php5 的脚本使用 Apache 用户 ID(在 SUSE Linux 中默认为wwwrun)来执行。在 Apache 中,为编程语言设计的模块(例如 mod_php5mod_ruby)嵌入了持久解释器以使用 Apache 用户 ID 来执行脚本。

因此,带有 mod_suexec 的 CGI 有助于管理的明确性,因为可以将 CGI 进程指派给单个用户,而不是万维网服务器本身。另外,此结合也会使文件系统更安全:脚本只继承用户的文件系统权利。相反,如果使用模块,脚本将获得万维网服务器用户的文件权限,这会导致无意中暴露文件系统中的数据。

当客户程序对万维网服务器的请求结束时,CGI 终止。这意味着 CGI 并不是持久的,并会在终止后释放所有占用的资源。这是很有利的,特别是对于编程错误的情况。如果使用模块,则会累积因编程错误而产生的影响,这是因为解释器是持久性的。这会导致无法释放资源(例如数据库连接)并需要重启动 Apache。

要在 SUSE Linux 中使用 mod_cgi,请将 cgi 添加到 /etc/sysconfig/apache2APACHE_MODULES 中或如 模块 中所述使用 YaST。SUSE Linux 中的 CGI 默认目录是 /srv/www/cgi-bin/

如果手工编辑 Apache 配置文件,请使用此示例作为指南来配置 mod_cgi

例 46.12. 手工激活 mod_cgi

# Global Environment
LoadModule cgi_module /path/to/mod_cgi.so

# Main Server and/or Virtual Host and/or 
# Directory and/or .htaccess context
AddHandler cgi-script .cgi .pl

# Main Server and/or Virtual Host context
ScriptAlias /cgi-bin/ /srv/www/cgi-bin/

# Alternatively, explicitly allow CGI scripts in a directory
# Main Server and/or Virtual Host context
<Directory /srv/www/some/dir>
    Options +ExecCGI
<Directory>
            

46.5.2. 扩展模块

通常,扩展模块包含在 Apache 软件包中,但一般不静态编译到服务器中。在 SUSE Linux 中,它们可用作共享对象,在运行时装载到 Apache 中。

46.5.2.1. 使用 mod_suexec 作为另一个用户运行 CGI。

在与 mod_cgi第 46.5.1.2 节 “通用网关接口:mod_cgi)结合之后,mod_suexec 使 CGI 脚本可以作为指定的用户和组来运行。/usr/sbin/suexec2 中的 suEXEC 程序即用于此目的。它是每次执行 CGI 脚本或程序时由 Apache 调用的包装程序。然后包装程序和程序都获得指派的已配置用户和组 ID。这样将作为已配置的用户或组来运行它。

虽然此方法相当程度地降低了用户生成的 CGI 脚本可能有的安全风险,但也请注意几点重要的事项:

suEXEC 的使用注意事项

  • suEXEC docroot - 所有脚本执行仅限于此基本目录。这意味着 suexec 在 docroot 以外时,无法运行脚本,否则会产生错误。docrootsuEXEC 编译时设置,并且不能在运行时更改。SUSE Linux 中的默认目录是 /srv/www

  • uidmin - 这代表用户执行带有 suEXEC 的脚本所必须使用的最低 ID。这可防止以系统用户(例如用户)来执行脚本。不要使用低于 uidmin 的 ID 创建用户(如果他们要用于 mod_suexec 的话)。SUSE Linux 中的默认 uidmin 是 96。

  • gidmin - 这和 uidmin 是同一个概念,但不同的是,它用于组 ID。SUSE Linux 中的默认 gidmin 是 96。

  • 目录和文件权限 - 相关脚本必须属于指定为 suEXEC 用户和组的同一个用户和组。另外,拥有者以外的任何人员均不能写文件。脚本所在的目录也必须只能由拥有者写入。

  • suEXEC safepath - 脚本中使用的所有程序(例如 Perl)必须驻留在标记为对 suexec 安全的路径中。safepathsuEXEC 编译时设置且不能在运行时更改。SUSE Linux 中的默认 safepath/usr/local/bin:/usr/bin:/bin

如果 mod_suexec 导致产生错误,请查阅 /var/log/apache2/suexec.log 中的 suexec 日志文件。

要在 SUSE Linux 中使用 mod_suexec,请将 suexec 添加到 /etc/sysconfig/apache2APACHE_MODULES 中或如 模块 中所述使用 YaST。请记住需要有 mod_cgi 才能运行 suexec。

第 46.4 节 “虚拟主机” 中所述,在虚拟主机环境中,mod_suexec 是最有用的。要指定某个用户和组来运行 CGI 脚本,请在保存虚拟主机声明的文件(在 SUSE Linux 中默认为 /etc/apache2/vhosts.d/*)中使用以下语法:

例 46.13. mod_suexec 配置

<VirtualHost 192.168.0>
# ...
ScriptAlias /cgi-bin/ /srv/www/vhosts/www.example.com/cgi-bin/
SuexecUserGroup tux users
# ...
</VirtualHost>
            

此示例中的 SuexecUserGroup 用户名 语法为驻留在 /srv/www/vhosts/www.example.com/cgi-bin/ 中的所有脚本指派用户 ID tux 和组 ID users。

46.5.2.2. 安全套接字层和 Apache:mod_ssl

mod_ssl 使用安全套接字层(SSL)和传输层安全(TLS)协议来为客户程序和万维网服务器之间的 HTTP 通信提供强有力的加密机制。基于此目的,服务器在回答对 URL 的任何请求之前,会发送一个 SSL 证书,其中包含证明服务器有效身份的信息。反过来,这保证了该服务器对于通信来说是唯一正确的终端。此外,证书使得在客户程序和服务器之间建立起加密连接,确保在不泄露敏感的明文内容的情况下传输信息。将 mod_ssl 与 Apache 一起使用的最明显效果就是 URL 的前缀为 https://(而不是 http://)。

万维网服务器端的 SSL 和 TLS 请求的默认端口是 443。在端口 80 上的“常规”Apache 监听和端口 443 上支持 SSL/TLS 的 Apache 监听之间没有冲突。事实上,HTTP 和 HTTPS 可以使用相同的 Apache 实例运行。通常使用一个虚拟主机(请参见 第 46.4 节 “虚拟主机”)将请求发送到端口 80 和端口 443 以区分虚拟服务器。

[Important]基于名称的虚拟主机和 SSL

用户不能在仅具有一个 IP 地址的服务器上运行多个支持 SSL 的虚拟主机。连接到此类设置的用户会在每次访问 URL 时接收到警告讯息,指出证书与服务器名称不匹配。每个支持 SSL 的域需要单独的 IP 地址或端口,才能实现基于有效 SSL 证书的通信。

忽略此警告讯息,您仍将获得任何有效 SSL 站点都提供的相同加密级别。这意味着只要警告讯息是可接受的,万维网服务器和客户程序之间的通信仍是安全的。“唯一知晓服务器身份”(由有效的 SSL 证书保证)的这一概念也就失效了。

要激活 SUSE Linux 中的 mod_ssl,请将 ssl 添加到 /etc/sysconfig/apache2APACHE_MODULES 中或如 模块 中所述使用 YaST。此外,必须配置万维网服务器监听标准 HTTPS 端口 443。这可在 /etc/apache2/listen.conf 中通过手工设置来完成或在 YaST 中通过设置菜单项监听来完成(请参见 网络设备选择)。

可以通过作为用户输入 cd /usr/share/doc/packages/apache2; ./certificate.sh 来创建测试 SSL 证书。按屏幕上的说明来建立 SSL 证书。产生的证书文件存放在目录 /etc/apache2/ssl* 中。

可以从供应商(例如 Thawte http://www.thawte.com/ 或 Verisign www.verisign.com)处获得具有全球有效性的“真正”证书。

如果手工编辑 Apache 配置文件,请使用此示例作为指南来配置 mod_ssl

例 46.14. mod_ssl 的手工配置

# Global Environment
# listen on the standard SSL port
Listen 443
# load module only if rcapache2 start-ssl was issued
<IfDefine SSL>
LoadModule ssl_module /path/to/mod_ssl.so
</IfDefine>

# Main Server context
# include global (server-wide) SSL configuration 
# that is not specific to any virtual host
# only if ssl_module was loaded
<IfModule mod_ssl.c>
Include /etc/apache2/ssl-global.conf
</IfModule>
            
[Tip]提示

不要忘记在端口 443 上为支持 SSL 的 Apache 打开防火墙。可以使用 YaST 通过设置安全和用户+防火墙+允许的服务来完成此操作。然后将 HTTPS 服务器添加到允许的服务列表中。

46.5.3. 外部模块

正式地说,外部模块不包含在 Apache 发布版中。但是,SUSE Linux 提供了几个外部模块供用户使用。本章简要说明了一些外部模块及其功能。

46.5.3.1. 使用 Perl 管理 Apache:mod_perl

mod_perl 在 Apache 中嵌入了一个持久的 Perl 解释器。这避免了 mod_cgi 在每次请求 CGI 时均调用一个外部可执行文件所导致的开销。mod_perl 还允许借助于 Perl 编程语言来控制 Apache 功能的许多方面。

要在 SUSE Linux 中使用 mod_perl,请安装 apache2-mod_perl RPM 并使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活该模块。在安装并激活该模块之后,另一个配置文件 mod_perl.conf 将存在于 /etc/apache2/conf.d/ 中。另外,mod_perl 启动脚本安装为 mod_perl-startup.pl。有关如何使用此模块的更多信息,请查阅可从 mod_perl 万维网站点(http://perl.apache.org/)获得的文档。

46.5.3.2. 提供 PHP 服务:mod_php4mod_php5

PHP 是一种常用的编程语言,最初适用于万维网上的使用。它存在两个版本,PHP4 和 PHP5。PHP4 表示 PHP 的经典概念和方法。PHP5 引入了新的面向对象的编程方法以及许多其他高级功能。mod_php4mod_php5 在 SUSE Linux 中都可用。它们将 PHP 解释器作为持久模块嵌入了 Apache。

要在 SUSE Linux 中使用 mod_php4mod_php5,请分别安装 RPM(apache2-mod_php4apache2-mod_php5)并使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活模块。

在安装并激活之后,每个模块都有一个单独的配置文件(php4.confphp5.conf)存在于 /etc/apache2/conf.d/ 中。PHP 万维网站点(http://www.php.net)中提供了关于如何将 Apache 与 PHP 一起使用的丰富信息资源。

46.5.3.3. Python 和 Apache:mod_python

mod_python 将 Python 解释器嵌入了 Apache。Python 是一种面向对象的编程语言,其语法清晰易读。该语言有一种独特但很方便的功能,即程序结构取决于源代码缩进,而不是通常的划分元素(诸如 beginend)。

要在 SUSE Linux 中使用 mod_python,请安装 apache2-mod_python RPM 并使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活该模块。有关如何使用此模块的更多信息,请查阅可从 mod_python 万维网站点(http://www.modpython.org/)获得的文档。

46.5.3.4. Apache 中的 Ruby 解释器:mod_ruby

mod_ruby 将 Ruby 解释器嵌入了 Apache 万维网服务器,允许本机执行 Ruby CGI 脚本。Ruby 是一种相对较新的面向对象的高级编程语言,在某些方面类似于 Perl 和 Python。与 Python 类似,它的语法清楚明了。另一方面,Ruby 采用缩写形式(例如用 $.r 代表在输入文件中读取的最后一行的编号)— 但程序员对此功能褒贬不一。Ruby 的基本概念与 Smalltalk 的基本概念非常类似。

要在 SUSE Linux 中使用 mod_ruby,请安装 apache2-mod_ruby RPM 并使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活该模块。有关如何使用此模块的更多信息,请查阅可从 mod_ruby 万维网站点(http://www.modruby.net/en/index.rbx)获得的文档。

46.5.3.5. 本机文件系统访问:mod_dav

mod_dav 为 Apache 提供了 WebDAV(基于万维网的分布式创作和版本控制)功能。 WebDAV 是 HTTP 协议的扩展功能,允许用户协同编辑和管理远程服务器上的文件。WebDAV 在功能上类似于 FTP,主要区别在于 HTTP 用作支持服务器访问的底层协议。实际上,mod_dav 将 Apache 万维网服务器作为高级远程文件系统。

这对于在不需要的情况下限制可通过 WebDAV 访问的目录,是一种好的做法。至少要采取的防范措施是为 WebDAV 资源设置 HTTP 基本鉴定以及在 Location 指令中设置 Limit 子句。

要访问 WebDAV 资源,客户端需要有支持 WebDAV 的软件。SUSE Linux 已经提供了 WebDAV 功能:前缀为 webdav://webdavs://Konqueror(对于基于 SSL 的 WebDAV 连接)可以用于连接 Apache WebDAV 文件系统。

mod_dav 需要使用模块 mod_dav_fs,该模块提供对 WebDAV 的实际文件系统访问。要在 SUSE Linux 中使用 mod_dav,请使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活该模块。与对 mod_dav_fs 的操作相同。有关如何使用此模块的更多信息,请查阅可从 mod_dav 万维网站点(http://httpd.apache.org/docs-2.0/mod/mod_dav.html)获得的文档。

46.5.3.6. 提供用户主页:mod_userdir

SUSE Linux 中的 mod_userdir 默认将每个用户的 ~/public_html 文件夹的内容作为公共万维网网页提供。然后访问那些网页的 URL 是 http://www.example.com/~username/

[Tip]提示

为了安全起见,SUSE Linux 中的 mod_userdir 禁止访问用户主目录的任何目录。此外,可以使用以下命令特别允许仅某些用户具有公共主页:

# Main server context 
UserDir disabled 
UserDir enabled tux wilber 

要在 SUSE Linux 中使用 mod_userdir,请使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活该模块。有关如何使用此模块的更多信息,请查阅可从 mod_userdir 万维网站点(http://httpd.apache.org/docs-2.0/mod/mod_userdir.html)获得的文档。

46.5.3.7. 更改 URL 布局:mod_rewrite

mod_rewrite 通常称为“URL 处理的瑞士军刀”。它会基于指定的规则集来实时重写所请求的 URL。对于 http://www.example.com/display.php?cat=2&article=1&lang=de,结果通常类似为 http://www.example.com/2/1/de

URL Rewriting Guide 说明了这个功能强大却又复杂的模块的优缺点:

对于 mod_rewrite,您可能会在一开始遇到麻烦并不再使用它,也可能因为它强大的功能而在以后始终乐于使用它。

RewriteRule 集可以在所有配置环境中针对以下对象设置:主服务器、虚拟主机、目录或 .htaccess 文件。要使用 mod_rewrite 进行 URL 重写,请先参阅 http://httpd.apache.org/docs-2.0/misc/rewriteguide.html 中的“URL Rewriting Guide”。

要在 SUSE Linux 中使用 mod_rewrite,请使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活该模块。