前言:
簡要介紹下tomcat 的三種運行模式,記錄基於apr模式及支持SSL模式的安裝方式
環境:
本文主要基於ubuntu 安裝tomcat 7,與基於centos並無太大差異,主要差異在於相關依賴包的名稱,在此會給出centos 所需的依賴包名稱。
模式簡介:
BIO模式:阻塞試I/O操作,表示Tomcat 使用傳統java I/O 操作(即java.io包及其子包)。tomcat7及以下版本默認以bio模式運行,由於每個請求都要創建一個線程來處理,線程開銷較大,不能處理高併發場景,在三種模式中性能最低。
NIO模式:是Java SE 1.4及後續版本提供的一種新的I/O 操作方式(即java.nio包及其子包)。是一個基於緩衝區、並能提供非阻塞I/O 操作的Java API,它擁有比傳統I/O (bio)更好的併發運行性能。 如使用NIO模式,需將server.xml內protocol值配置爲如下值:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
默認爲:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
注:tomcat 8 以上版本默認使用NIO模式,無需修改。
APR模式:簡單理解,就是從操作系統級別解決異步IO問題,大幅度的提高服務器的處理和響應性能,也是tomcat運行高併發應用的首選模式。
下面介紹具體啓用APR方式。
啓用APR模式:
在官方下載tomat 7,並解壓到安裝路徑/usr/local/tomcat/,下載解壓過程略
ubuntu 依賴包:
APR 1.2+ development headers (libapr1-dev package) OpenSSL 0.9.7+ development headers (libssl-dev package) JNI headers from Java compatible JDK 1.4+ GNU development environment (gcc, make)
centos 依賴包:
gcc make openssl-devel apr-devel apr-util-devel
安裝相關依賴:
apt-get install libapr1-dev libssl-dev gcc make openjdk-8-jdk -y
安裝APR動態庫:
apr相關源碼已包含在tomcat包內,bin目錄下tomcat-native.tar.gz文件
cd /usr/local/tomcat/bin tar zxf tomcat-native.tar.gz cd tomcat-native-1.2.10-src/native
配置編譯APR:
./configure --libdir=/usr/lib \ --prefix=/usr/local/tomcat/ \ --with-apr=/usr/bin/apr-1-config \ --with-java-home=/usr/lib/jvm/java-8-openjdk-amd64 \ --with-ssl=yes make && make install
至此,如不啓用SSL,那tomcat已可以運行在APR模式了,若仍運行在BIO或NIO模式下,請修改server.xml配置文件,將protocol值配置爲如下值
<Connector protocol="org.apache.coyote.http11.Http11Protocol" port="8080" .../>
基於SSL的APR模式:
若要讓tomcat SSL運行在APR模式上,需要配置SSL證書,此證書可購買、申請/生成免費版本或自簽發。此文利用自簽發證書配置實驗。
簽發證書:
openssl genrsa -des3 -out tomcat.key 1024 openssl rsa -in tomcat.key -out tomcat_np.key openssl req -new -key tomcat_np.key -out tomcat.csr openssl x509 -req -days 365 -in tomcat.csr -signkey tomcat_np.key \ -out tomcat.crt
配置server.xml爲如下值
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" SSLCertificateFile="${catalina.base}/conf/tomcat.crt" SSLCertificateKeyFile="${catalina.base}/conf/tomcat_np.key" SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" />
至此,tomcat在SSL和非SSL下都是運行在APR模式上,但還有一個問題,就是現在tomcat是運行在root 用戶上的,下面介紹如何使tomcat 運行在非root 用戶下,即以daemon模式運行。
基於daemon運行tomcat:
tomcat 二進制包提供了daemon腳本,但是基於jsvc實現的,因此需要編譯commons-daemon-native.tar.gz包內容,生成jsvc執行文件
安裝jsvc
cd /usr/local/tomcat tar zxf commons-daemon-native.tar.gz cd commons-daemon-1.0.15-native-src/unix ./configure --with-java=/usr/lib/jvm/java-8-openjdk-amd64/ make
make後便會在tomcat/bin下面生成jsvc文件
建立運行tomcat用戶
useradd tomcat -M -d / -s /usr/sbin/nologin
編輯daemon.sh配置如下值
test ".$TOMCAT_USER" = . && TOMCAT_USER=tomcat # Set JAVA_HOME to working JDK or JRE JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 # If not set we'll try to guess the JAVA_HOME
在daemon.sh腳本第二行添加
# chkconfig: - 80 20
修改相關目錄權限
chown -R tomcat.tomcat /usr/local/tomcat
添加系統服務
ln -s /usr/local/tomcat/bin/daemon.sh /etc/init.d/tomcat chkconfig tomcat on
至此,SSL APR daemon三種需求均已實現
如若做對tomcat做多實例,尚需對daemon.sh腳本進行修改
驗證APR
tail logs/catalina-daemon.out 一月 05, 2017 5:31:37 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["http-apr-8080"] 一月 05, 2017 5:31:37 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["http-apr-8443"] 一月 05, 2017 5:31:37 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["ajp-apr-8009"] 一月 05, 2017 5:31:37 下午 org.apache.catalina.startup.Catalina start 信息: Server startup in 852 ms
驗證daemon
ps -ef | grep tomcat tomcat 55158 55157 0 17:31 ? 00:00:13 jsvc.exec -java-home /usr/lib/jvm/java-8-openjdk-amd64 -user tomcat -pidfile /usr/local/tomcat/logs/catalina-daemon.pid -wait 10 -outfile /usr/local/tomcat/logs/catalina-daemon.out -errfile &1 -classpath /usr/local/tomcat/bin/bootstrap.jar: /usr/local/tomcat/bin/commons-daemon.jar: /usr/local/tomcat/bin/tomcat-juli.jar -Djava.util.logging.config.file= /usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs= -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap
參考
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html
http://blog.csdn.net/xyang81/article/details/51502766