Linux下配置tomcat+apr+native應對高併發

摘要:在慢速網絡上Tomcat線程數開到300以上的水平,不配APR,基本上300個線程狠快就會用滿,之後的請求就只好等待。可是配上APR以後,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態連接庫來處理文件讀取或網絡傳輸操做,這時併發的線程數量明顯降低,從原來的300可能會立刻降低到只有幾十,新的請求會毫無阻塞的進來。java

1、三種運行模式介紹

Tomcat 有三種(bio,nio.apr) 運行模式,首先來簡單介紹下linux

bio 
bio(blocking I/O),顧名思義,即阻塞式I/O操做,表示Tomcat使用的是傳統的Java I/O操做(即java.io包及其子包)。Tomcat在默認狀況下,就是以bio模式運行的。遺憾的是,就通常而言,bio模式是三種運行模式中性能最低的一種。咱們能夠經過Tomcat Manager來查看服務器的當前狀態。web

nio 
Java SE 1.4及後續版本提供的一種新的I/O操做方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操做的Java API,所以nio也被當作是non-blocking I/O的縮寫。它擁有比傳統I/O操做(bio)更好的併發運行性能。apache

想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol爲 api

<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

要tomcat支持apr,必需要安裝apr和native,這樣tomcat能夠利用apache的apr接口,使用操做系統的部分本地操做,從而提高性能。安全

Tomcat的運行模式有3種.修改他們的運行模式.3種模式的運行是否成功,能夠看他的啓動控制檯,或者啓動日誌.或者登陸他們的默認頁面http://localhost:8080/查看其中的服務器狀態。 ruby

接下來介紹linux下tomcat+apr+native配置服務器

 

2、linux下配置tomcat+apr+native

2.1 安裝包準備

jdk-7u76-linux-x64.tar.gz(必須JDK1.7以上才支持apr)cookie

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

2.2.5 重啓環境變量,使配置生效

source /etc/profile

查看是否生效

   出現如下字樣則表示安裝成功,接下來安裝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 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 &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查看

能夠看到open files已經由默認的1024變成了65535

2.7 啓動tomcat

/home/tomcat7/bin/startup.sh

出現如下提示則表示配置成功

 

3、出錯狀況處理

  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模塊
相關文章
相關標籤/搜索