Tomcat支持三種接收請求的處理方式:BIO、NIO、APR 。
1. BIO由於每個請求都要創建一個線程來處理,線程開銷比較大,不能再高並發的場景,性能也是最低的。 2. NIO是一個基於緩沖區、並能提供非阻塞I/O操作的Java API,比傳統的bio更好的並發性能。 3. APR(Apache Portable Run-time libraries)簡單理解,就是從操作系統級別解決異步IO問題,大幅度的提高服務器的處理和響應性能, 也是Tomcat運行高並發應用的首選模式。
所需軟件的下載地址
https://mirrors.cnnic.cn/apache/apr/ tomcat-native在tomcat的bin下
* apr
* apr-iconv
* apr-util
* tomcat-native
安裝依賴
yum install -y apr-devel openssl-devel gcc make expat-devel libtool
安裝軟件
cd /usr/local/src wget https://mirrors.cnnic.cn/apache/apr/apr-1.6.5.tar.gz tar xf apr-1.6.5.tar.gz cd apr-1.6.5/ ./configure --prefix=/usr/local/apr make && make install 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 /srv/tomcat-8080/bin/ tar xf tomcat-native.tar.gz cd /srv/tomcat-8080/bin/tomcat-native-1.2.23-src/native ./configure --with-apr=/usr/local/apr --with-java-home=/srv/jdk make && make install echo -e 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib\nexport LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib' >> /etc/profile source /etc/profile
修改配置
vim /srv/tomcat-8080/conf/server.xml <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="30"/> <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" acceptCount="900" disableUploadTimeout="true" URIEncoding="UTF-8" enableLookups="false" compression="on" compressionMinSize="1024" /> <!-- Define an AJP 1.3 Connector on port 8009 --> ##注釋掉下面那行,如果不用apache <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
測試
/srv/tomcat-8080/bin/catalina.sh run 14-Oct-2019 14:46:05.122 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
注:如果非root用戶啟動失敗,把apr環境變量在當前用戶的.bash_profile中寫一份
配置說明
Executor參數說明
name:共享線程池的名字。這是Connector為了共享線程池要引用的名字,該名字必須唯一。默認值:None; namePrefix:在JVM上,每個運行線程都可以有一個name 字符串。這一屬性為線程池中每個線程的name字符串設置了一個前綴,Tomcat將把線程號追加到這一前綴的后面。默認值:catalina-exec-; maxThreads:該線程池可以容納的最大線程數。默認值:150; maxIdleTime:在Tomcat關閉一個空閑線程之前,允許空閑線程持續的時間(以毫秒為單位)。只有當前活躍的線程數大於minSpareThread的值,才會關閉空閑線程。默認值:60000(一分鍾)。 minSpareThreads:Tomcat應該始終打開的最小不活躍線程數。默認值:4。 threadPriority:線程的等級。默認是Thread.NORM_PRIORITY
Connector參數說明
maxThreads :Tomcat 使用線程來處理接收的每個請求,這個值表示 Tomcat 可創建的最大的線程數,默認值是 200 minSpareThreads:最小空閑線程數,Tomcat 啟動時的初始化的線程數,表示即使沒有人使用也開這么多空線程等待,默認值是 10。 maxSpareThreads:最大備用線程數,一旦創建的線程超過這個值,Tomcat 就會關閉不再需要的 socket 線程。 上邊配置的參數,最大線程 500(一般服務器足以),要根據自己的實際情況合理設置,設置越大會耗費內存和 CPU,因為 CPU 疲於線程上下文切換,沒有精力提供請求服務了,最小空閑線程數 20,線程最大空閑時間 60 秒,
當然允許的最大線程連接數還受制於操作系統的內核參數設置,設置多大要根據自己的需求與環境。當然線程可以配置在“tomcatThreadPool”中,也可以直接配置在“Connector”中,但不可以重復配置。 URIEncoding:指定 Tomcat 容器的 URL 編碼格式,語言編碼格式這塊倒不如其它 WEB 服務器軟件配置方便,需要分別指定。 connnectionTimeout: 網絡連接超時,單位:毫秒,設置為 0 表示永不超時,這樣設置有隱患的。通常可設置為 30000 毫秒,可根據檢測實際情況,適當修改。 enableLookups: 是否反查域名,以返回遠程主機的主機名,取值為:true 或 false,如果設置為false,則直接返回IP地址,為了提高處理能力,應設置為 false。 disableUploadTimeout:上傳時是否使用超時機制。 connectionUploadTimeout:上傳超時時間,畢竟文件上傳可能需要消耗更多的時間,這個根據你自己的業務需要自己調,以使Servlet有較長的時間來完成它的執行,需要與上一個參數一起配合使用才會生效。 acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可傳入連接請求的最大隊列長度,超過這個數的請求將不予處理,默認為100個。 keepAliveTimeout:長連接最大保持時間(毫秒),表示在下次請求過來之前,Tomcat 保持該連接多久,默認是使用 connectionTimeout 時間,-1 為不限制超時。 maxKeepAliveRequests:表示在服務器關閉之前,該連接最大支持的請求數。超過該請求數的連接也將被關閉,1表示禁用,-1表示不限制個數,默認100個,一般設置在100~200之間。 compression:是否對響應的數據進行 GZIP 壓縮,off:表示禁止壓縮;on:表示允許壓縮(文本將被壓縮)、force:表示所有情況下都進行壓縮,默認值為off,壓縮數據后可以有效的減少頁面的大小,一般可以減小1/3左右,節省帶寬。 compressionMinSize:表示壓縮響應的最小值,只有當響應報文大小大於這個值的時候才會對報文進行壓縮,如果開啟了壓縮功能,默認值就是2048。 compressableMimeType:壓縮類型,指定對哪些類型的文件進行數據壓縮。 noCompressionUserAgents="gozilla, traviata": 對於以下的瀏覽器,不啟用壓縮。 如果已經對代碼進行了動靜分離,靜態頁面和圖片等數據就不需要 Tomcat 處理了,那么也就不需要配置在 Tomcat 中配置壓縮了。