Apache 2.2.0是Apache httpd服务器重要的发布版并且包含了许多重要的变化。其中许多变化是现有模块的改进,但是,还有很多新的模块和在运行功能方面的改进。本文将讨论一些变化的元素(用例子和替代的配置说明)以及讨论什么时候要升级到新的版本和什么时候要等待新的版本。
新功能和改变
新的Apache 2.2.0并不只是现有软件的升级发布版。其中许多代码是新的,或者已经进行了重大的改进,并且扩大了代码的内容以提供额外的功能,或者扩大或简化了目前的功能。
配置方法的变化
Apache中的配置文件一直与其用户保持又爱又恨的关系。一些用户喜欢单一的、全部在一个文件中进行配置的方法。而另一些人喜欢把配置文件分成多个并且使用import指令来插入具体的设置信息。虽然这并不影响设置,使用多个文件更容易理解而且更方便,因为它能够让你把为单个虚拟主机进行的设置放在一个单个的文件中。
Apache发布版软件默认的配置文件是单一类型的,通常包含许多用户不使用或者不理解的指令,并且包含一些不需要用户修改的指令。有些 Linux发布版(例如Gentoo)默认状态已经把这个配置文件分开了。现在Apache 2.2.0里,这已经是标准发布版的一个标准的功能。
主要的httpd.conf文件依然保留。此外,配置文件有选择地包括下列元素的标准配置文件:
•服务器池管理(MPM<多处理模块>配置)
•多语言错误提示
•动态目录列表形式配置(Fancy directory listings)
•语言设置
•用户家目录
•关于用户请求和配置的实时信息(server-info 与/server-status)
•虚拟主机配置
•对Apache手册的访问
•分布式编撰和版本信息(WebDAV)
•种类繁多的默认设置
•SSL配置
文件拆分并不是强制性的。你应该能够毫无问题地使用现有的单一文件配置或者多文件配置。然而,你可以考虑根据默认配置中显示的思路拆分文件。
授权/身份识别模块
虽然授权和身份识别本身没有改变,但是,提供这些功能模块本身已经重建了,并且在某些情况下重新命名了,以便更容易地装载需要的的组件。此外,还增加了一个新的模块以便通过LDAP (mod_authnz_ldap)提供授权。
标准的授权模块已经进行了修改以便保持模块名称和这些模块提供的授权类型之间的一致性。例如,原来的“mod_auth”模块已经分成了 “mod_auth_basic”(现在专门用于HTTP授权)和“mod_authn_file”模块(通过文件向授权提供后端接口)。这些模块的前缀现在具体指明这些模块在授权/身份识别过程中的任务。例如:
•mod_auth_* 指明这类模块是执行HTTP身份识别机制的(如,mod_auth_basic 和 mod_auth_digest等)。
•mod_authn_* 指明这类模块是执行后端身份识别的(如,mod_authn_file 和 mod_authn_dbm)。
•mod_authz_* 指明这类模块是执行授权任务的(如,mod_authz_dbm 和 mod_authz_host)。
•mod_authnz_* 指明这类模块是执行身份识别和授权两项任务的(包括新的mod_authnz_ldap模块)。
这个结果是产生了一套非常直观的模块,能够更精细地管理你的配置中设置的身份识别和授权支持。这还使个性化的身份识别和授权模块更容易开发,因为你能够更方便地与现有的其它模块整合起来。
代理/缓存模块
新增加了一个负载平衡模块“mod_proxy_balancer”。这个模块为主要的“mod_proxy”代理模块提供负载平衡服务。负载平衡器能够通过请求计数和通信量两种指标在多个代理进程间分配请求。请求计数仅计算对服务器的请求的数量并且把请求发布给所有的代理进程,直到每一个代理进程都为同样数量的请求服务。
加权通信量计算原理与简单的请求计数分配基本相同。但是,你可以调整单个代理进程的工作量来让某代理进程执行的请求就会比其他多。配置是按照字节进行的,而不是按照简单的请求。因此,你可以配置一个代理进程处理的字节数量是其他代理进程的一倍,尽管这种情况可能实际的请求数量要少一些。
新的代理平衡器还包括一个额外状态显示,与监视服务器状态和配置的/server-status和/server-info 系统类似。
缓存模块(mod_cache, mod_disk_cache, and mod_mem_cache)在Apache 2.2.0前一直被认为还处于没有正式完成的测试阶段,尽管已经有很多机构在使用这些模块并且并没有遇到什么问题。然而,这些模块现在被认为是已经可以正式在生产环境中应用了。还有一个名为“htcacheclean”的新程序。这个程序能够清除缓存文件的文件数据库。这个程序可以作为一个一般程序或者守护程序来运行,它还能够提供关于缓存目录大小的统计数据。
过滤器模块
mod_filter过滤模块也扩展了功能,允许过滤器根据有条件的规定运行。这就改变了以前的旧模式。根据旧模式,只能根据 AddOutputFilter指令的配置无条件地对文件实施过滤,或者根据AddOutputFilterByType指令稍微灵活一点地对文件实施过滤。
现在,不用增加具体的过滤器来指定文件的类型,我们创建了一个合适的过滤链,输出由过滤链中的每一个过滤器来处理。这就需要宣布可用的过滤器类型、如果必要的话,还要提供源请求(文件类型)和使用的过滤器。
举个例子,以前风格的对服务器端包括文件(SSI)的过滤指示是:
AddOutputFilter INCLUDES .shtml |
现在改为:
FilterDeclare SSI FilterProvider SSI INCLUDES resp=Content-Type $text/html FilterChain SSI |
这个过滤器链声明使我们能够在这个链中的具体点上增加过滤器,甚至指出根据某个具体的条件禁用某个过滤器。例如,你也需要为所有的输出增加 SSL,除非这种输出是一种CGI。你可以通过向这个链增加SSI过滤器来达到目的,但是,当请求是来自一个CGI脚本的时候,你可以删除那个过滤器。
数据库支持
Apache模块中的数据库支持功能通常需要额外的编程以便建立一个wrapper程序以获得数据库的访问权限。例如,如果你要通过MySQL 或者PostgreSQL增加一个基于SQL的身份识别,那么,这个模块必须有自己的SQL数据库接口。编程和性能问题使这种方法成为一种不太理想的解决方案。
Apache现在提供mod_dbd模块,使用一个标准的接口提供数据库的连接。这个模块使用apr_dbd接口。这个接口还意味着这种数据库连接能够通过提供大量的可用连接在一个线程的环境中应用。这应该有助于提高数据库环境的灵活性,并且改善需要数据库连接的模块的性能。
请注意,这不是动态网站中的数据库访问解决方案。但是,在将来,也许能够通过提供诸如mod_perl和mod_php等基于模块的接口来提供这种数据库连接。
模块开发的改变
当制作一些与Apache一起使用的个性化模块的时候,需要开发某些功能的接口。这种接口也做了一些后端的改变。发布版说明提供了更详细的信息。但是,基本的改变包括如下这些方面:
•连接错误记录使这个软件更容易记录与连接有关的错误信息。
•当进行一项配置测试时,测试配置hooks(连线)可提供测试结果。
•堆栈大小可以修改以用于基于线程的MPM。
•协议处理在输出过滤器上实施。为了与过滤系统进行的修改保持一致,过滤器现在要负责为mod_filter模块设置正确的输出类型。
•一个监视器连接能够让模块自动要求定期或者按计划执行工作。
•正则表达式接口已经改变了,而且PCRE(Perl兼容的正则表达式)库已经升级到了5.0版。支持正则表达式的头文件和正则表达式函数数已经修改了。
•新的DBD框架使这个软件很容易与SQL数据库建立接口。但是,应该使用他们自己定制的系统对模块进行修改。
任何使用这些功能的模块都应该相应地升级。
程序的修改
支持Apache httpd服务器的这些程序已经增加了一些小的改进功能。首先,对httpd增加了一个新的命令行选项,这应该能够简化模块可用性的调试。现在总是能够使用-l命令行选项列出内建在httpd运行时代码中的模块列表,例如:
$ httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c |
但是,这个功能仅列出了那些内建在HTTPD二进制代码中的模块,动态装载模块(DSO)没有列出来。对于那些在配置文件里需要动态加载的模块,你通常可以通过使用-L命令行选项列出支持的指令来判断它们是否正确加载。但是,这个方法并不很简单和可靠。
新的-M命令行选项列出了所有的模块、静态链接到httpd服务器的模块和根据配置共享和装载的模块。模块类型(静态或者共享)也将显示出来:
httpd -M Loaded Modules: core_module (static,静态) mpm_prefork_module (static) http_module (static) so_module (static) authn_anon_module (shared,共享) env_module (shared) expires_module (shared) headers_module (shared) mime_module (shared) negotiation_module (shared) setenvif_module (shared) log_config_module (shared) logio_module (shared) cgi_module (shared) alias_module (shared) rewrite_module (shared) userdir_module (shared) info_module (shared) status_module (shared) actions_module (shared) autoindex_module (shared) dir_module (shared) ext_filter_module (shared) deflate_module (shared) include_module (shared) Syntax OK |
这对于找出模块中的问题和找出可用的单个指示是一种非常有用的方法。
通过prefork、worker和event MPM功能现在允许优雅地关闭httpd服务器,使请求能够在服务器完全关闭之前得到服务。你还可以通过在 GracefulShutdownTimeout指令在设置中具体指定超时的时长。这样,无论现有的请求处在什么状态,服务器在超时之后都将关闭。
我应该现在升级还是等待?
选择是否升级到新版本或者继续使用当前版本和安装的软件仍是普遍的难题。
一方面,Apache 2.2.0仅仅是一个已经稳定的和经过良好测试的Apache httpd计划的一个新的发布版。Apache 2.0第一个正式版本的分支v2.0.35是在2002年4月发布的。尽管有许多瑕疵和补丁,Apache 2.0系列软件一直没有出现重大的影响运行的问题。因此,从理论上说,2.2.0实际上是稳定的和经过良好测试的发布版的最新版本。
然而,在授权模块中进行的修改没有经过进一步的测试可能使人们在使用2.2.0版的时候感到担心。这种设置变化肯定意味着你在生产环境中使用 Apache 2.2.0之前,你自己要在测试服务器上进行测试。特别是如果你的Web站点主要依靠Apache软件驱动的身份识别和授权功能时,更要自己进行测试。
如果你与Apache安装软件一起使用个性化开发的模块,你对于立即转移到新版本应该更加小心。正则表达式引擎和API的变化将需要一些重新开发的工作。如果你的模块使用连接到MySQL或者其它数据库的SQL接口,那么,你应该优先于你自己个性化驱动的解决方案使用新的mod_dvd接口。不过,再次提醒一下,这仅影响使用这个技术的模块,而不影响动态驱动的应用程序。
因此,当前的选择是:
●Apache 2.0.55是2.2.0之前最新的稳定的发布版。
●Apache 2.2.0是最新的正式发布版,如果你不怕风险要采用这个新版本的话。
●Apache 1.3.34是最新的Apache 1.x的发布版。
(责任编辑:城尘)