Tomcat在APR连接器上提供HTTP服务
从Tomcat 5.5开始,Tomcat包含叫做APR连接器的另一个Web服务器实现方法。它是在Java和C编程语言中实现的。APR连接器的主要目标是提供髙性能,高稳定性及易于与其他C/C++源码整合,同时仍然提供至少与Tomcat的JIO连接器同样多的功能(通过实现象开源C代码一样的底层网络编码,与JVM的嵌人式网络编码相反)。APR是Apache Portable Runtime的简称,下文称APR (Apache便携式运行时),这是一个独立的开源项目,其目标被陈述为“提供软件开发者可以编码的API,无论在哪个平台上编译这些软件,如果没有同等的行为,并一定要可预测。”简而言之,APR是一个本地库文件, 实现了如Apache httpd或Tomcat的网络服务器利用的许多底层功能。事实上,Apache httpd在Tomcat的底层网络编码的顶端编译的是APR。
使用APR连接器,而不使用JI0或NIO的连接器,原因有以下几点:
HTTPS使用APR连接器吋能会更快,因为APR连接器是叫做OpenSSL库文件的本地 代码而JIO和NIO连接器是纯粹的Java代码,并使用纯粹的Java TLS/SSL编码, 大家都知道,比OpenSSL要慢一些,但是,如果没有使用HTTPS,则不用关心这一点。
对于某些代理场合(主要是AJP),APR可能会更高效。对这种配置,具有最大吞吐是比较重要的。
由于使用的sendfile(2)系统呼叫,所以APR被设计为处理大型静态文本文件(如提供媒体文件)时更高效。
任何连接器实现的所冇底层网络编码都是固有的(native (如JVM是在C/C++中 编写的),因此,无论您是否更喜欢APR,取决于您是喜欢来白ASF还是JVM提供商提供的本地网络編码{native network code)。
APR一个被广泛接受的用于Web服务器的I/O实现,用C编程语言编写(供Apache httpd使用),而且工作正常。
在MS-Windows上,NIO连接器并没有真正起作用,因为NIO似乎在Windows上无 法正常发挥作用,至少在使用Sun的Java VM时是这样。在其他操作系统上,这不成为问题。
APR使用了便携的、安全随机数产生器,从而Tomcat会话ID在Windows上默认是安全的。
APR还有一些其他功能是非常有用的,而核心Java平台并没有提供这些功能。关键 是APR是不同于Java的实现,而且包含一组不同的功能。这些新功能可能会放在任何新版的APR中,而且可以修改APR连接器以充分利用这些功能。
Remy Maucherat(APR连接器的作者及坚定支持者之一)在这里提供了一点启示,发送邮件给Tomcat开发者,列出为什么它认为APR连接器很重要。
除了明显令人感兴趣的功能(epoll/sedfile/openssl)之外,如笔者早期提到的那样,APR具有很多其他用途。根据核心能力,把它放在Tomcat中,使其成为Anpd 的一个Java版本,而且将以非常简单的方式打开所有功能及可能。
假设某人做了衡量纯Java用户的工作,那么最好拥有,但这只是整体的一部分(而且需要APR)
安装APR
要编译并使用APR连接器,首先必须安装APR库文件。您既可以下载APR二进制文件(如果有一个可用干您的操作系统与硬件组合),也可以根据源码编译APR,并安装最 终的二进制文件。
使用二进制发行版
Apache编译在APR二进制文件的顶部,而APR被封装为一个独立的工程,因此APR 二进制发行版文件时用于独立于httpd的下载文件。因为Apache httpd二进制文件就可用于几乎所有的操作系统和计算机硬件组合,因此,应有一个APR二进制文件功能下载并 被安装到操怍系统和硬件结构上。
APR工程网站使二进制文件可用于32位Microsoft Windows,但不是其他操怍系统和硬件 结构。Win32也是Apache Tomcat工程的下载网页提供预编译APR连接器二进制文件的唯 一平台值得庆贺的是大部分操作系统都提供了已经安装的、或很易安装的自身APR二 进制包,例如,如杲使用Fedora Linux (或者用RPM作为包管理器的任何Linux),则可能已经安装了APR。要验证是否巳经安装了APR,则录入:
# rpm -q apr-devel
如果没有全安装,则您可以用下列命令(以root用户)安装这两个包;
# yum install apr apr-devel
假定您拥有yum包工具并设置好了yum知识库。
对其他操作系统,查询您的包管理系统,看看是否已经安装了APR二迸制包,如果没有安装,则上面的指令会安装一个可用的包。
编译并安装APR Connector
解包tomcat-native.tar.gz文件(该文件驻留在Tomcat的bin/目录下)并创建一个目录(要放置APR连接器的二进制文件的目录)
# tar xvf/opt/tomcat/bin/tomcat-native.tar.gz # cd tomcat-native-1.1.6-src/jni/native # mkdir/opt/tomcat/apr-connector
阅读BUILDING文件,获得有关编译APR连接器的最新指令:
# more BUILDING
确信将JAVA_HOME环境变量设置为要运行Tomcat的JVM目录。把bin目录追加到当前shell路径的前面:
# export JAVA_H0HE=/usr/java/jdk1.6.0 # export PATH=$JAVA_HOME/bin:$PATH
然后配置、编译并安装APR连接器(以root的身份):
# ./configure --with-apr=/usr/bin/apr-1-config --prefix=/opt/tomcat/apr-connector # make # make install
该命令将编译APR连接器,并在目录/opt/tomcat/apr-connector下安装最终的二进制文件,您可以将前缀设置为任何想要的目录路径,但是,运行Tomcat的用户账户必须能读取APR连接器的文件。
使用APR连接器配置Tomcat
设置JAVA 0PTS坏境变董,以包含libtcnative和libapr库文件的驻留目录-如下所示:
JAVA_OPTS="-Djava.library.path=/opt/tomcat/apr-connector/lib:/usr/local/lib" export JAVA_OPTS
该项操作必须在启动Tomcat JVM之前设置,从而可以进入Tomcat启动的某个脚本,如靠近CATALINA_HOME/bin/catalina.sh脚本的顶端.如果使用本书提供的Tomcat RPM包,则可以编辑/opt/tomcat/conf/tomcat-env.sh并将其追加到JAVA_0PTS变量设置中。
紧接着,查看文件中的Connector配置元素。server.xml 中任何设置为具有HTTP/1.1或AJP/1.3协议属性的Connector都将在下次重启Tomcat时自动使用APR,前提是假定Tomcat可以加载库文件,默认无需让这些元素使用APR而改变 Connector元素上的设置。但要在毎个Connector上重复检査协议属性。如果想显式配置一个Connector以使用APR,则可按如下方式设置协议属性:
$lt;Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" disableUploadTimeout="false" maxThreads="150" connectionTimeout="20000" redirectPort="8443" />
不一定要改变协议属性,因为在JVM加载APR连接器的库文件时允许使用APR。 然后,重启Tomcat并监视日志信息。标准输出日志(通常叫做catalina.out)应包含类似于下列的内容于其中:
Sep 27, 2007 2:24:28 AM org.apache.coyote.httpll.HttpliAprProtocol init INFO: Initializing Coyote HTTP/1.1 on http-8080 Sep 27, 2007 2:24:28 AM oig-apache.coyote.ajp.AjpAprProtocol init INFO: Initializing Coyote AJP/1.3 on ajp-8009 Sep 27, 1007 2:24:32 AM oig.apache.coyote.http11.Http11AprProtocol start INFO:Starting Coyote HTTP/1.1 on http-8080 Sep 27, 2007 2:24:32 AM org.apache.coyote.ajp.AjpAprProtocal start TNFOi Starting Coyote AJP/1.3 on ajp-8009
如果在日志中没有看到类似的行,则可能是JVM不能加载所有必要的库文件。如果那样,需要重新检查配置文件,并认真检査所追加的每个库文件路径,确保库文件在那些 目录下存在,并且每个目录都可被运行Tomat的用户账户读取。