Tomcat+apr+native应对高并发

Posted L1n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat+apr+native应对高并发相关的知识,希望对你有一定的参考价值。

APR包

链接:https://pan.baidu.com/s/1lEP2YlqP7cJDG0ofRwRyog 
提取码:nng4

 

一、三种运行模式介绍

Tomcat 有三种(bio,nio.apr) 运行模式,首先来简单介绍下

 

bio

bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过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)更好的并发运行性能。

想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为

 
  1. <Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"
  2. connectionTimeout="20000"
  3. URIEncoding="UTF-8"
  4. useBodyEncodingForURI="true"
  5. enableLookups="false"
  6. redirectPort="8443" />
 

apr

(Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

要tomcat支持apr,必须要安装apr和native,这样tomcat可以利用apache的apr接口,使用操作系统的部分本地操作,从而提升性能。

Tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态。

 

二、linux下配置tomcat+apr+native

 

安装包准备

jdk-8u171-linux-x64.tar.gz(必须JDK1.7以上才支持apr)

apr-1.5.2.tar.gz

apr-util-1.5.4.tar.gz

apache-tomcat-8.0.27.tar.gz(解压之后其bin目录下包含tomcat-native的安装包)

 

安装JDK

tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local/

mv /usr/local/jdk1.8.0_171 /usr/local/jdk

/usr/local/jdk/bin/java -version

 
  1. sed -i.ori ‘$a export JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar‘

tail -3 /etc/profile

source /etc/profile

java -version

 

安装tomcat

tar xf apache-tomcat-8.0.27.tar.gz

mv apache-tomcat-8.0.27 tomcat

vim /usr/local/tomcat/bin/catalina.sh

 
  1. JAVA_OPTS="-server -Xms1024M -Xmx1024M -XX:PermSize=512M -XX:MaxNewSize=512M -XX:MaxPermSize=512M"
  2. 添加到脚本最上方
 

修改运行模式

vim /usr/local/tomcat/conf/server.xml

 
  1. <Service name="Catalina">
  2. 在下方添加
  3. <!-- 配置apr -->
  4. <Connector executor="tomcatThreadPool"
  5. port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
  6. URIEncoding="UTF-8" enableLookups="false" acceptCount="50"
  7. connectionTimeout="1000" maxKeepAliveRequests="250"
  8. redirectPort="8443" />

技术图片

 

server.xml完整的配置(参考)

 
  1. <?xml version=‘1.0‘ encoding=‘utf-8‘?>
  2. <Server port="9016" shutdown="SHUTDOWN">
  3. <!--关闭https安全验证 -->
  4. <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
  5. <Listener className="org.apache.catalina.core.JasperListener" />
  6. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  7. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  8. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  9. <GlobalNamingResources>
  10. <Resource name="UserDatabase" auth="Container"
  11. type="org.apache.catalina.UserDatabase"
  12. description="User database that can be updated and saved"
  13. factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  14. pathname="conf/tomcat-users.xml" />
  15. </GlobalNamingResources>
  16. <Service name="Catalina">
  17. <!--The connectors can use a shared executor, you can define one or more named thread pools-->
  18. <!-- 配置线程 -->
  19. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
  20. maxThreads="500" minSpareThreads="25"
  21. maxIdleTime="4000"
  22. />
  23. <!-- 配置apr -->
  24. <Connector executor="tomcatThreadPool"
  25. port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
  26. URIEncoding="UTF-8" enableLookups="false" acceptCount="50"
  27. connectionTimeout="1000" maxKeepAliveRequests="250"
  28. redirectPort="8443" />
  29. <Connector port="9109" protocol="AJP/1.3" redirectPort="8443" />
  30. <Engine name="Catalina" defaultHost="localhost">
  31. <Realm className="org.apache.catalina.realm.LockOutRealm">
  32. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  33. resourceName="UserDatabase"/>
  34. </Realm>
  35. <Host name="localhost" appBase="webapps"
  36. unpackWARs="true" autoDeploy="true">
  37. <!-- 配置访问日志格式 -->
  38. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  39. prefix="localhost_access_log." suffix=".txt"
  40. pattern="%h %l %u %t "%r" %s %b" />
  41. </Host>
  42. </Engine>
  43. </Service>
  44. </Server>
 

安装tomcat-native

cd /usr/local/tomcat/bin

tar xf tomcat-native.tar.gz

cd tomcat-native-1.1.33-src/jni/native

./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/usr/local/jdk && make && make install 
编译前需要安装apr

 

安装apr

需要安装apr-1.5.2.tar.gz和apr-util-1.5.4.tar.gz

tar -xf apr-1.5.2.tar.gz

tar xf apr-util-1.5.4.tar.gz

 

进入到apr-1.5.2,执行

./configure --prefix=/usr/local/apr && make && make install

 

进入到apr-util-1.5.4,执行

./configure --with-apr=/usr/local/apr/ --prefix=/usr/local/apr-utils && make && make install

 

修改最大文件句柄数和打开文件的数目

vim /etc/sysctl.conf

 
  1. net.ipv4.ip_local_port_range = 10240 65535
  2. net.ipv4.ip_nonlocal_bind = 1

vim /etc/security/limits.conf

 
  1. 最后一行添加
  2. * soft nofile 65535
  3. * hard nofile 65535
 

加载bridge模块

modprobe bridge

sysctl -p

 

退出重新登陆(查看修改信息)

ulimit -a 
可以看到open files已经由默认的1024变成了65535

 

启动Tomcat

/usr/local/tomcat/bin/startup.sh 
出来下方提示表示配置成功

技术图片

 

三、出错情况处理

 

启动tomcat时报“The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/local/apr/lib”

解决方案:确保tomcat-native安装成功,否则执行上面命令,如果依旧不成功,请执行下面步骤

vim /usr/local/tomcat/bin/catalina.sh

 
  1. CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
 

安装apr时报‘Neither the JAVA_HOME nor the JRE_HOME environment variable is defined“

解决方案:这是未设置环境JAVA_HOME与JAVA_JRE目录,请确保安装jdk成功,确认/etc/profile环境变量配置正确

 

在执行sysctl -p的时候发现输出出现以下错误

 
  1. net.ipv4.ip_forward = 0
  2. net.ipv4.conf.default.rp_filter = 1
  3. net.ipv4.conf.default.accept_source_route = 0
  4. kernel.sysrq = 0
  5. kernel.core_uses_pid = 1
  6. net.ipv4.tcp_syncookies = 1
  7. error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
  8. error: "net.bridge.bridge-nf-call-iptables" is an unknown key
  9. error: "net.bridge.bridge-nf-call-arptables" is an unknown key
  10. kernel.msgmnb = 65536
  11. kernel.msgmax = 65536
  12. kernel.shmmax = 68719476736
  13. kernel.shmall = 4294967296

原因:上面有3个参数依赖于bridge模块,该模块如果没有加载则会现上面的输出错误

解决方案:执行modprobe bridge命令,加载bridge模块

以上是关于Tomcat+apr+native应对高并发的主要内容,如果未能解决你的问题,请参考以下文章

Linux下配置tomcat+apr+native应对高并发

(转)Linux下配置tomcat+apr+native应对高并发

Tomcat 8/9 基于APR库的高并发性能优化

八cent OS下tomcat启用APR并发模式

SpringBoot内嵌Tomcat开启APR模式,提升并发

SpringBoot内嵌Tomcat开启APR模式,提升并发