Tomcat的运行模式Bio/Nio/Apr实战详解
豆豆 2019-12-01 14:33:28 488人已围观
Tomcat Connector有三种运行模式(BIO, NIO, APR),这三种模式的不同之处如下:
bio:
bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。Tomcat7或以下,在Linux系统中默认使用这种方式。我们可以通过Tomcat Manager来查看服务器的当前状态。nio :
是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置(tomcat安装目录/config/server.xml)来启动。apr :
(Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。如何查看tomcat的工作模式:
查看启动日志:
Starting ProtocolHandler ["http-bio-8080"] ==》bio模式
Starting ProtocolHandler ["http-nio-8080"] ==》nio模式
Starting ProtocolHandler ["http-apr-8080"] ==》apr模式
配置tomcat的工作模式前先了解一下HTTP和AJP两种连接器:

拥有HTTP Connector这个连接器,Tomcat才能成为一个web服务器,还可以处理Servlet和jsp。拥有AJP(Apache JServerProtocol)连接器可以通过AJP协议和另一个web容器进行交互,AJP 他的作用就是负责和其他的HTTP服务器建立连接。例如和apche服务器连接,有了这个协议,才可以把apche服务器和tomcat服务器给连接起来。两种连接器关系如下:
基于以上对tomcat连接器的了解,下面就开始修改http连接器。
如何配置tomcat的工作模式(Tomcat-7.0.96为例):
http connector改成:
<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
tomcat7及以下默认就是这样
2、nio config/server.xml 配置 (重启生效)
http connector改成:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
注意:如果是https中同时又80和443这2个端口配置需要都改成:org.apache.coyote.http11.Http11NioProtocol
3、apr config/server.xml 配置 (重启生效)
http connector改成:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
注意:apr模式还需要安装 apr 、 apr-utils 、tomcat-native包。
最后通过网络上的测试对比总结:

Apr宽带占用最高,Bio最低;但Apr的内存占用最高,而Nio的内存占用最低
所以综合来看,Nio适用于一般需求;Apr适用于高并发需求