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

  • 相关阅读:
    海康:无法获取未定义或 null 引用的属性“HWP_***
    mariadb:审计插件
    海康:函数执行结果后以XML方式返回
    海康:java sdk 自定义方法与结构体
    websocket:SecurityError5022
    Java中使用DecimalFormat保留两位小数,同时不保留0
    浅谈js作用域与闭包
    [Go] 分析proto序列化每个字段大小
    MySQL 的全文索引.
    带你了解webpack的使用
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/7163439.html
Copyright © 2011-2022 走看看