ubuntu中的tomcat使用apr模式
據說apr能提高50%效能,介紹是這樣的:
Tomcat支援三種接收請求的處理方式:BIO、NIO、APR 。
1. BIO由於每個請求都要建立一個執行緒來處理,執行緒開銷比較大,不能再高併發的場景,效能也是最低的。
2. NIO是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,比傳統的bio更好的併發效能。
3. APR(Apache Portable Run-time libraries)簡單理解,就是從作業系統級別解決非同步IO問題,大幅度的提高服務
網上找的資料是基於centos的,使用的yum安裝,但這裡是ubuntu,得使用apt-get,
但是yum和apt源的包名不一樣,我第一次有些依賴沒裝上,在安裝apr-util時報錯:xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory,是因為有個expat的依賴沒安裝上,這裡記錄下。
所需軟體
環境 ubuntu14\centos7 所需軟體 tomcat7 * apr-1.6.3 * openssl-1.1.0h 很多資料沒有這一步,但是最後tomcat-native安裝失敗,可能是由於tomcat8、9對ssl版本要求高一點,系統裡預設安裝的1.0.1,我們安裝1.1.0h的版本 * apr-iconv-1.2.2 * apr-util-1.6.1 * tomcat-native(tomcat自帶) PS:文章之前寫的安裝openssl1.1.1,但是有網友說tomcat-native還是安裝失敗,所以這裡改用1.1.0h,果然成功了,linux就這點不安逸,各種版本組合== 文末會列出幾種常見的錯誤
安裝軟體
這是centos的依賴安裝:yum install -y apr-devel openssl-devel gcc make expat-devel libtool
這是ubuntu的依賴安裝:apt-get install libapr1-dev libssl-dev gcc make libexpat1-dev libtool
cd /usr/local/src wget https://mirrors.cnnic.cn/apache/apr/apr-1.6.3.tar.gz tar xf apr-1.6.3.tar.gz cd apr-1.6.3/ ./configure --prefix=/usr/local/apr make && make install cd /usr/local/src wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz ar -xzxf openssl-1.1.0h.tar.gz cd openssl-1.1.0h/ ./config --prefix=/usr/local/openssl -fPIC // 注意這裡需要加入 -fPIC引數,否則後面在安裝tomcat native 元件會出錯 // 注意:不要按照提示去執行 make depend make && make install #openssl安裝完成繼續更新系統環境 #修改歷史的OpenSSL檔案設定備份 mv /usr/bin/openssl /usr/bin/openssl.old mv /usr/include/openssl /usr/include/openssl.old #設定軟連線使其使用新的OpenSSL版本 剛剛安裝的OpenSSL預設安裝在/usr/local/ssl ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl ln -s /usr/local/openssl/include/openssl /usr/include/openssl #更新動態連結庫資料 echo "/usr/local/openssl/lib" >> /etc/ld.so.conf ldconfig -v 我們再來看看 OpenSSL 版本資訊 openssl version,如為1.0.2則成功升級openssl cd /usr/local/src wget https://mirrors.cnnic.cn/apache/apr/apr-iconv-1.2.2.tar.gz tar xf apr-iconv-1.2.2.tar.gz cd apr-iconv-1.2.2/ ./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-iconv make && make install cd /usr/local/src wget https://mirrors.cnnic.cn/apache/apr/apr-util-1.6.1.tar.gz tar xf apr-util-1.6.1.tar.gz cd apr-util-1.6.1/ ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv make && make install cd /usr/local/tomcat/bin/ tar xf tomcat-native.tar.gz cd /usr/local/tomcat/bin/tomcat-native-1.2.16-src/native ./configure --with-apr=/usr/local/apr --with-java-home=/usr/local/jdk8.0 make && make install echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib' >> /etc/profile source /etc/profile
修改配置
vim /usr/local/tomcat/conf/server.xml
<Connector port="80" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="1000"
minSpareThreads="100"
acceptCount="900"
disableUploadTimeout="true"
connectionTimeout="20000"
URIEncoding="UTF-8"
enableLookups="false"
redirectPort="8443"
compression="on"
compressionMinSize="1024"
/>
<!-- Define an AJP 1.3 Connector on port 8009 --> ##註釋掉下面那行,如果不用apache
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
測試
/usr/local/tomcat/bin/catalina.sh run
24-Jan-2018 21:39:17.695 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8
問題總結
1. java.lang.UnsatisfiedLinkError: /usr/local/apr/lib/libtcnative-1.so.0.2.7: /usr/local/apr/lib/libtcnative-1.so.0.2.7: undefined symbol: BN_get_rfc3526_prime_8192
這個是openssl版本和tomcat對不上導致的,具體版本間對應關係得查詢官網資料,我也是瞎摸的,一般編譯tomcat-native時候會有檢查,都通過了就是相容的。
2. requires the APR/native library which is not available
這個是tomcat配置了apr模式執行,但是以來模組沒到位。
3. make tomcat-native 'ERR_remove_thread_state' is deprecated
這個是我用tomcat8.0.36和openssl1.1.0e時候的錯,死活tomcat-native編譯都通不過,最後換成tomcat8.5.15就沒問題了。估計是有一個版本低了。
4. checking for JDK os include directory... Cannot find jni_md.h in /usr/lib/jvm/jre-1.8.0-openjdk.x86_64//configure: error: You should retry --with-os-type=SUBDIR
在/tomcat-native-1.2.12-src/native/下./configure時,出現上面的問題,可能是因為安裝的是jre不是jdk,他需要jni_md.h這個檔案,在/usr/lib/jvm/java/include/linux/下面有,cp /usr/lib/jvm/java/include /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/重新執行configure即可。
總的來說,就是版本依賴問題,得找到一個合適的版本組合~~