zoukankan      html  css  js  c++  java
  • Linux下配置tomcat + apr + native应对高并发

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

    一、Tomcat运行模式介绍

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

     (1)BIO 

      BIO(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。

     (2)NIO

     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" /> 
    

     (3)APR 

      (Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。要tomcat支持apr,必须要安装apr和native,这样tomcat可以利用apache的apr接口,使用操作系统的部分本地操作,从而提升性能。

    二、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

         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 CLASSPATH=$JAVA_HOME/lib/
    export PATH=/usr/local/ruby/bin:$PATH:$JAVA_HOME/bin
    

     注:如果用户以非root账号安装jdk,那么需要在root账号下配置jdk。此时jdk的配置路径可以与非root账号的配置路径相同。配置完成后,保证echo $JAVA_HOME非空。示例如下:

    export JAVA_HOME=/opt/jdk1.7.0_79
    export CLASSPATH=$JAVA_HOME/lib/
    

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

    source /etc/profile
    

     查看是否生效

    2.3安装APR

      apr和apr-util的安装,必须以root身份来进行。需要安装apr-1.5.2.tar.gz和apr-util-1.5.4.tar.gz

      2.3.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.3.2 检测、编译、安装

       进入到apr-1.5.2,执行如下命令:

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

     注:/user/local路径为后续native的默认安装路径,请不要做修改。

     进入到apr-util-1.5.4,执行如下命令:

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

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

      由于打开文件会比较多,所以要考虑修改默认打开文件数目

      2.4.1 修改/etc/sysctl.conf

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

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

    * soft nofile 65535
    * hard nofile 65535
    

     2.4.3 加载bridge模块

    modprobe bridge
    

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

    sysctl -p 
    

     2.4.5 再退出重新登陆,用ulimit -a查看

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

     2.5 安装tomcat-native

     2.5.1 解压tomcat-native.tar.gz

    tar -zxvf tomcat-native.tar.gz
    

     2.5.2 进入到解压后的目录

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

     2.5.3 检测、编译、安装

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

     其中加粗部分可以根据实际情况调整。

     2.5 配置tomcat

    <?xml version='1.0' encoding='utf-8'?>
    
    <Server port="9016" shutdown="SHUTDOWN">
    
      <!--关闭https安全验证 -->
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
      <Listener className="org.apache.catalina.core.JasperListener" />
    
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    
    
      <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 className="org.apache.catalina.realm.LockOutRealm">
    
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>
          </Realm>
    
          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
    
             <!-- 配置访问日志格式 -->
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%h %l %u %t "%r" %s %b" />
    
          </Host>
        </Engine>
      </Service>
    </Server>
    

     同时在catalina.sh文件中增加如下配置:

    JAVA_HOME="/opt/jdk1.7.0_79"
    CATALINA_OPTS=-Djava.library.path=/usr/local/apr/lib
    

    完成配置后,启动tomcat,出现以下提示则表示配置成功:

    参见:http://www.cnblogs.com/zishengY/p/7101616.html

  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/7163439.html
Copyright © 2011-2022 走看看