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_mysql、apache2-mod_fastcgi、apache2-mod_macro、apache2-mod_murka、apache2-mod_perl、apache2-mod_php4、apache2-mod_php5、apache2-mod_python 和 apache2-mod_ruby。
部分模块在本节有很详细的记录。有关基本发布版中其他模块的描述,请访问 Apache 模块万维网站点(http://httpd.apache.org/docs-2.0/mod/)。有关第三方模块,请参见 http://modules.apache.org/。
Apache 模块可以划分为三个不同的类别:基本模块、扩展模块和外部模块。
默认情况下,基础模块将编译到 Apache 中。除非在构建时明确除去,否则它们是可用的。SUSE Linux 中的 Apache 内仅编译了最少的基础模块,但所有的基础模块均作为共享对象可用:它们不包含在 /usr/sbin/httpd2 二进制文件中,而是可以在运行时通过在 /etc/sysconfig/apache2 中配置 APACHE_MODULES 包含进来。
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。
![]() | 提示 |
|---|---|
使用
这意味着不必更改文件的扩展名来将其标记为持有 SSI 元素(在以上示例中为 | |
mod_cgi 使 Apache 可以传递由外部 CGI(通用网关接口,Common Gateway Interface)程序或脚本创建的内容。它作为物理计算机上可用的编程语言和 Apache 万维网服务器之间的实例。在理论上,可以用任何编程语言来编写 CGI 脚本。通常,使用的语言有 Perl 或 C。mod_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_cgi 与 mod_suexec 的结合使用上(请参见 第 46.5.2.1 节 “使用 mod_suexec 作为另一个用户运行 CGI。
”)。此结合允许用特定的用户 ID 来执行 CGI 脚本。通常,只使用 mod_cgi 或 mod_php5 的脚本使用 Apache 用户 ID(在 SUSE Linux 中默认为wwwrun)来执行。在 Apache 中,为编程语言设计的模块(例如 mod_php5 或 mod_ruby)嵌入了持久解释器以使用 Apache 用户 ID 来执行脚本。
因此,带有 mod_suexec 的 CGI 有助于管理的明确性,因为可以将 CGI 进程指派给单个用户,而不是万维网服务器本身。另外,此结合也会使文件系统更安全:脚本只继承用户的文件系统权利。相反,如果使用模块,脚本将获得万维网服务器用户的文件权限,这会导致无意中暴露文件系统中的数据。
当客户程序对万维网服务器的请求结束时,CGI 终止。这意味着 CGI 并不是持久的,并会在终止后释放所有占用的资源。这是很有利的,特别是对于编程错误的情况。如果使用模块,则会累积因编程错误而产生的影响,这是因为解释器是持久性的。这会导致无法释放资源(例如数据库连接)并需要重启动 Apache。
要在 SUSE Linux 中使用 mod_cgi,请将 cgi 添加到 /etc/sysconfig/apache2 的 APACHE_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>
通常,扩展模块包含在 Apache 软件包中,但一般不静态编译到服务器中。在 SUSE Linux 中,它们可用作共享对象,在运行时装载到 Apache 中。
在与 mod_cgi(第 46.5.1.2 节 “通用网关接口:mod_cgi
”)结合之后,mod_suexec 使 CGI 脚本可以作为指定的用户和组来运行。/usr/sbin/suexec2 中的 suEXEC 程序即用于此目的。它是每次执行 CGI 脚本或程序时由 Apache 调用的包装程序。然后包装程序和程序都获得指派的已配置用户和组 ID。这样将作为已配置的用户或组来运行它。
虽然此方法相当程度地降低了用户生成的 CGI 脚本可能有的安全风险,但也请注意几点重要的事项:
suEXEC 的使用注意事项
suEXEC docroot - 所有脚本执行仅限于此基本目录。这意味着 suexec 在 docroot 以外时,无法运行脚本,否则会产生错误。docroot 在 suEXEC 编译时设置,并且不能在运行时更改。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 安全的路径中。safepath 在 suEXEC 编译时设置且不能在运行时更改。SUSE Linux 中的默认 safepath 是 /usr/local/bin:/usr/bin:/bin。
如果 mod_suexec 导致产生错误,请查阅 /var/log/apache2/suexec.log 中的 suexec 日志文件。
要在 SUSE Linux 中使用 mod_suexec,请将 suexec 添加到 /etc/sysconfig/apache2 的 APACHE_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。
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 以区分虚拟服务器。
![]() | 基于名称的虚拟主机和 SSL |
|---|---|
用户不能在仅具有一个 IP 地址的服务器上运行多个支持 SSL 的虚拟主机。连接到此类设置的用户会在每次访问 URL 时接收到警告讯息,指出证书与服务器名称不匹配。每个支持 SSL 的域需要单独的 IP 地址或端口,才能实现基于有效 SSL 证书的通信。 忽略此警告讯息,您仍将获得任何有效 SSL 站点都提供的相同加密级别。这意味着只要警告讯息是可接受的,万维网服务器和客户程序之间的通信仍是安全的。“唯一知晓服务器身份”(由有效的 SSL 证书保证)的这一概念也就失效了。 | |
要激活 SUSE Linux 中的 mod_ssl,请将 ssl 添加到 /etc/sysconfig/apache2 的 APACHE_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>
![]() | 提示 |
|---|---|
不要忘记在端口 443 上为支持 SSL 的 Apache 打开防火墙。可以使用 YaST 通过设置++来完成此操作。然后将 添加到列表中。 | |
正式地说,外部模块不包含在 Apache 发布版中。但是,SUSE Linux 提供了几个外部模块供用户使用。本章简要说明了一些外部模块及其功能。
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/)获得的文档。
PHP 是一种常用的编程语言,最初适用于万维网上的使用。它存在两个版本,PHP4 和 PHP5。PHP4 表示 PHP 的经典概念和方法。PHP5 引入了新的面向对象的编程方法以及许多其他高级功能。mod_php4 和 mod_php5 在 SUSE Linux 中都可用。它们将 PHP 解释器作为持久模块嵌入了 Apache。
要在 SUSE Linux 中使用 mod_php4 或 mod_php5,请分别安装 RPM(apache2-mod_php4、apache2-mod_php5)并使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活模块。
在安装并激活之后,每个模块都有一个单独的配置文件(php4.conf 或 php5.conf)存在于 /etc/apache2/conf.d/ 中。PHP 万维网站点(http://www.php.net)中提供了关于如何将 Apache 与 PHP 一起使用的丰富信息资源。
mod_python 将 Python 解释器嵌入了 Apache。Python 是一种面向对象的编程语言,其语法清晰易读。该语言有一种独特但很方便的功能,即程序结构取决于源代码缩进,而不是通常的划分元素(诸如 begin 和 end)。
要在 SUSE Linux 中使用 mod_python,请安装 apache2-mod_python RPM 并使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活该模块。有关如何使用此模块的更多信息,请查阅可从 mod_python 万维网站点(http://www.modpython.org/)获得的文档。
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)获得的文档。
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)获得的文档。
SUSE Linux 中的 mod_userdir 默认将每个用户的 ~/public_html 文件夹的内容作为公共万维网网页提供。然后访问那些网页的 URL 是 http://www.example.com/~。
username/
![]() | 提示 |
|---|---|
为了安全起见,SUSE Linux 中的 # Main server context UserDir disabled UserDir enabled | |
要在 SUSE Linux 中使用 mod_userdir,请使用 YaST(模块)或在 /etc/sysconfig/apache2 中通过手工配置来激活该模块。有关如何使用此模块的更多信息,请查阅可从 mod_userdir 万维网站点(http://httpd.apache.org/docs-2.0/mod/mod_userdir.html)获得的文档。
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 中通过手工配置来激活该模块。