设为首页 收藏本站
查看: 2175|回复: 0

[经验分享] Linux下配置tomcat+apr+native应对高并发

[复制链接]

尚未签到

发表于 2017-12-26 13:38:31 | 显示全部楼层 |阅读模式
  摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待。但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,这时并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来。


一、三种运行模式介绍
  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为
  

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"  connectionTimeout="20000"
  URIEncoding="UTF-8"
  useBodyEncodingForURI="true"
  enableLookups="false"
  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配置

二、linux下配置tomcat+apr+native

2.1 安装包准备
  jdk-7u76-linux-x64.tar.gz(必须JDK1.7以上才支持apr)
  apr-1.5.2.tar.gz
  apr-util-1.5.4.tar.gz
  apache-tomcat-7.0.56.tar.gz(解压之后其bin目录下包含tomcat-native的安装包)

2.2 安装JDK
  这是运行Tomcat的首要环境,所以这一步最先执行。

2.2.1 解压
  

tar -zxvf jdk-7u76-linux-x64.tar.gz  


2.2.2 创建/usr/local/java文件夹
  

mkdir -p /usr/local/java  


2.2.3 移动到/usr/local/java
  

mv jdk1.7.0_76 /usr/local/java  


2.2.4 添加环境变量
  

vi /etc/profile  

  再最后添加上
  

#jdk1.7  
export JAVA_HOME
=/usr/local/java/jdk1.7.0_76
  
export>=$JAVA_HOME/lib/  
export PATH
=/usr/local/ruby/bin:$PATH:$JAVA_HOME/bin  


2.2.5 重启环境变量,使配置生效
  

source /etc/profile  

  查看是否生效
DSC0000.png

  出现以下字样则表示安装成功,接下来安装tomcat

2.3 安装tomcat

2.3.1 解压tomcat
  

tar -zxvf apache-tomcat-7.0.56.tar.gz  


2.3.2 改名为tomcat7
  

mv apache-tomcat-7.0.56 tomcat7  


2.3.3 修改tomcat内存(jvm内存)
  我这里tomcat是放在/home目录下
  

vi /home/tomcat7/bin/catalina.sh  

  在里面添加
  

JAVA_OPTS="-server -Xms1024M -Xmx1024M -XX:PermSize=512M -XX:MaxNewSize=512M -XX:MaxPermSize=512M"  


  2.3.4 修改运行模式
  

vi /home/tomcat7/conf/server.xml  

  添加上
  

<!-- 配置apr -->  <Connector executor="tomcatThreadPool"
  port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
  URIEncoding="UTF-8" enableLookups="false" acceptCount="50"
  connectionTimeout="1000" maxKeepAliveRequests="250"
  redirectPort="8443" />
  

  下面贴出一个server.xml完整的配置
  

<?xml version='1.0' encoding='utf-8'?>  

  
<Server port="9016" shutdown="SHUTDOWN">
  

  <!--关闭https安全验证 -->

  <Listener>
  <Listener>  


  <Listener>
  <Listener>
  <Listener>  

  

  <GlobalNamingResources>
  <Resource name="UserDatabase" auth="Container"
  type="org.apache.catalina.UserDatabase"
  description="User database that can be updated and saved"
  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  

  <Service name="Catalina">
  

  <!--The connectors can use a shared executor, you can define one or more named thread pools-->
  <!-- 配置线程 -->
  <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
  maxThreads="500" minSpareThreads="25"
  maxIdleTime="4000"
  />
  

  <!-- 配置apr -->
  <Connector executor="tomcatThreadPool"
  port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
  URIEncoding="UTF-8" enableLookups="false" acceptCount="50"
  connectionTimeout="1000" maxKeepAliveRequests="250"
  redirectPort="8443" />
  

  <Connector port="9109" protocol="AJP/1.3" redirectPort="8443" />
  

  

  <Engine name="Catalina" defaultHost="localhost">
  


  <Realm>  


  <Realm>  resourceName="UserDatabase"/>
  </Realm>
  

  <Host name="localhost"  appBase="webapps"
  unpackWARs="true" autoDeploy="true">
  

  <!-- 配置访问日志格式 -->

  <Valve>  prefix="localhost_access_log." suffix=".txt"
  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  

  </Host>
  </Engine>
  </Service>
  
</Server>
  


2.4 安装tomcat-native

2.4.1 进入到/home/tomcat7/bin/
  

cd /home/tomcat7/bin  


2.4.2 解压tomcat-native.tar.gz
  

tar -zxvf tomcat-native.tar.gz  


2.4.3 进入到解压后的目录
  

cd tomcat-native-1.1.31-src/jni/native  


2.4.4 检测、编译、安装
  

./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/usr/local/java/jdk1.7.0_76 && make && make install  


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

2.5.1 解压apr-1.5.2.tar.gz和apr-util-1.5.4.tar.gz
  

tar -zxvf apr-1.5.2.tar.gz  

tar -zxvf apr-util-1.5.4.tar.gz  


2.5.2 检测、编译、安装

进入到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  


2.6 修改最大文件句柄数和打开文件的数目
  由于打开文件会比较多,所以要考虑修改默认打开文件数目

2.6.1 修改/etc/sysctl.conf
  

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


2.6.2 在/etc/security/limits.conf最后增加如下两行记录         
  

* soft nofile 65535  * hard nofile 65535
  


2.6.3 加载bridge模块
  

modprobe bridge  


2.6.4 重新载入sysctl,使其改变生效
  

sysctl -p   


2.6.5 再退出重新登陆,用ulimit -a查看
DSC0001.png

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

2.7 启动tomcat
  

/home/tomcat7/bin/startup.sh  

  出现以下提示则表示配置成功
DSC0002.png


三、出错情况处理
  3.1、启动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安装成功,否则执行上面2.5,如果依旧不成功,请执行下面步骤
            #vi /opt/tomcat_api_8035/bin/catalina.sh
            CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
    3.2、安装apr时报‘Neither the JAVA_HOME nor the JRE_HOME environment variable is defined“
         解决方案:这是未设置环境JAVA_HOME与JAVA_JRE目录,请确保安装jdk成功,确认/etc/profile环境变量配置正确
     3.3、在执行sysctl -p的时候发现输出出现以下错误
       net.ipv4.ip_forward = 0
        net.ipv4.conf.default.rp_filter = 1
        net.ipv4.conf.default.accept_source_route = 0
        kernel.sysrq = 0
        kernel.core_uses_pid = 1
        net.ipv4.tcp_syncookies = 1
        error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
        error: "net.bridge.bridge-nf-call-iptables" is an unknown key
        error: "net.bridge.bridge-nf-call-arptables" is an unknown key
        kernel.msgmnb = 65536
        kernel.msgmax = 65536
        kernel.shmmax = 68719476736
        kernel.shmall = 4294967296
      原因:上面有3个参数依赖于bridge模块,该模块如果没有加载则会现上面的输出错误
      解决方案:执行modprobe bridge命令,加载bridge模块

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-428229-1-1.html 上篇帖子: tomcat如何正确的开启远程调试功能 下篇帖子: Tomcat #无法启动8005端口
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表