tomcat內存優化
Tomcat內存優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 java_OPTS 參數。在 配置文件中的102行添加就行
注意:堆最大值和非堆最大值的總和超過了物理內存或者操作系統的最大限制都會引起服務器啟動不起來。
JAVA_OPTS參數說明
-server 啟用jdk 的 server 版;
-Xms java虛擬機初始化時的最小內存;
-Xmx java虛擬機可使用的最大內存;
-XX: PermSize 內存永久保留區域
-XX:MaxPermSize 內存最大永久保留區域
一般設置-Xms,-Xmx相等以避免在每次GC后調整堆的大小,因為默認空余堆內存小于40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大于70%時,JVM會減少堆直到-Xms的最小限制
現公司服務器內存一般都可以加到最大2G ,所以可以采取以下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
配置完成后可重啟Tomcat
首先查看Tomcat 進程號:
ps aux | grep tomcat #查看tomcat的主進程號
查看參數是否生效
jmap -heap 12222 #12222是主進程號
堆(Heap)和非堆(Non-heap)內存解釋
https://www.cnblogs.com/centos2017/p/9956432.html
## tomcat運行模式的優化
`Tomcat Connector(連接器)有三種運行模式:BIO NIO APR`
**BIO(blocking I/O)**
是基于JAVA的HTTP/1.1連接器,Tomcat7以下版本在默認情況下是以bio模式運行的。一般而言,bio模式是三種運行模式中性能最低的一種。我們可以通過Tomcat Manager來查看服務器的當前狀態。(**Tomcat7** 或以下,在 **Linux** 系統中默認使用這種方式)一個線程處理一個請求,缺點:并發量高時,線程數較多,浪費資源
<Connector port="9090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
#### **NIO(new I/O)**
是一個基于緩沖區、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的并發運行性能。要讓Tomcat以nio模式來運行只需要在Tomcat安裝目錄/conf/server.xml 中將對應的中protocol的屬性值改為 org.apache.coyote.http11.Http11NioProtocol即可利用 Java 的異步請求 IO 處理,可以通過少量的線程處理大量的請求。
**Tomcat8**: 以上版本在 **Linux** 系統中,默認使用的就是NIO模式,不需要額外修改,**Tomcat7**必須修改Connector配置來啟動
<Connector port="9090" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
APR (Apache Portable Runtime/Apache可移植運行時) ( 安裝配置過程相對復雜)
APR(Apache Portable Run-time libraries)簡單理解,就是從操作系統級別解決異步IO問題,大幅度的提高服務器的處理和響應性能, 也是Tomcat運行高并發應用的首選模式。APR是使用原生C語言編寫的非堵塞I/O,利用了操作系統的網絡連接功能,速度很快。但是需先安裝apr和native,能大幅度提升性能,不亞于魔獸開局爆高科技兵種,威力強大
wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
yum install expat-devel openssl gcc
具體安裝部署: https://my.oschina.net/boonya/blog/3019704
### tomcat執行器(線程池)的優化
開啟線程池:打開server.xml中關于線程池的配置
#一般情況下我們不使用Executor開啟線程池,我們在Connector上直接配置
$ vim /usr/local/tomcat/conf/server.xml
<Connector executor="tomcatThreadPool"
port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" #使用NIO
connectionTimeout="40000"
keepAliveTimeout="30000"
maxKeepAliveRequests="8000"
maxHttpHeaderSize="8192"
URIEncoding="UTF-8"
enableLookups="false"
acceptCount="1000"
disableUploadTimeout="true"
redirectPort="8443"
compression="on"
compressionMinSize="1024"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,image/gif,image/jpeg,text/css,application/" />
參數解釋:
port:服務端口TCP端口,默認值為8089;
connectionTimeout:設置連接的超時值,單位毫秒,默認值為60000;
keepAliveTimeout:當http使用keep-alive時在tcp的一個連接中可以接收多個request,意思就是兩個request間的時間限定最大保持時間,超過這個時間,連接將斷開,單位毫秒,默認使用的是connectionTimeout的時間;
maxKeepAliveRequests:在服務器關閉前,該連接最大支持的請求數,超過該請求數的連接也將被關閉,設置為1表示禁用,設置為-1表示不限個數,默認值為100;
maxHttpHeaderSize:HTTP請求和響應頭的最大量,單位字節,默認值為4096字節;
URIEncoding:指定tomcat的url編碼格式;
enableLookups:調用request、getRemoteHost()執行DNS查詢,以返回遠程主機的主機名,如果設置為false,則直接返回IP地址,DNS反查很耗時間
acceptCount:當所以可以處理的線程正在使用的時候,在隊列中排隊請求的最大連接數,當隊列已滿,所有請求都將被拒絕,默認值為100;
disableUploadTimeout:上傳時是否使用超時機制,以是servlet有較長時間來完成它的執行,默認值為false;
redirectPort:如連接器不支持SSL請求,如收到SSL請求,Catalina容器將會自動重定向指定的端口號,讓其進行處理;
compression:是否對響應的數據進行壓縮,off:禁止壓縮,on:允許壓縮(文本將被壓縮),force:表示所有情況下都進行壓縮,默認值為off;
compressionMinSize:啟用壓縮的輸出內容大小,默認為2KB
noCompressionUserAgents:不啟用壓縮的瀏覽器;
compressableMineType:MIME的列表,默認以逗號分隔,默認值為text/html,text/xml,text/plain;
## tomcat版本隱藏
為了避免黑客針對某些版本進行攻擊,因此我們需要隱藏或者偽裝 Tomcat 的版本信息。默認 Tomcat 的版本信息如下:
針對該信息的顯示是由一個jar包控制的,該jar包存放在 Tomcat 安裝目錄下的lib目錄下,名稱為catalina.jar。
我們可以通過 jar xf 命令解壓這個 jar 包會得到兩個目錄 META-INF 和 org ,通過修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段來實現來更改我們tomcat的版本信息。
設置session失效時長
我們都知道,HTTP協議本身是無狀態的(Stateless),這對于一些簡單的頁面展示來說,功能足夠,不受影響。而對于日漸復雜的動態頁面、應用,各種需要登錄認證等場景,就力不從心了。試想對于一個已經登錄的用戶仍然一次次的提示登錄,會是什么感受呢?而為了保持客戶端和服務端交互狀態,可以采取session失效時長
Tomcat的可以在以下幾個地方設置會話超時:
web級別:
在conf /web.xml文件中
< session-config >
< session-timeout > 30 </ session-timeout > #默認就是30分鐘,以分為單位
</ session-config >
webapp級別:
在webapp中的WEB-INF /web.xm
< session-config >
< session-timeout > 30 </ session-timeout > #以分為單位
</ session-config >
應用程序代碼中:硬編碼
session.setMaxInactiveInterval(30 * 60 ); //以秒為單位
優先級,越細粒度優先級越高,也就是3> 2> 1
還要一種配置,但現在比較少見了,因為需要將上下文配置在server.xml里:
這就是修改 conf /server.xml配置文件鐘,是以秒為單位
< Context path = “/ test” docBase = “/ home / httpd / html / test”
defaultSessionTimeOut = “3600” isWARExpanded = “true”
isWARValidated = “false” isInvokerEnabled = “true”
isWorkDirPersistent = “false” />
## 禁用AJP連接器實現動靜分離
#Tomcat 服務器通過Connector連接器組件與客戶程序建立連接,Connector組件負責接收客戶的請求,以及把Tomcat服務器的響應結果發送給客 戶。默認情況下,Tomcat在server.xml中配置了兩種連接器,一種使用ajp,要和apache結合使用,一種使用http。當使用http 時,可以限制ajp端口訪問,在于防止線下測試流量被mod_jk轉發至線上tomcat服務器。可以通過iptables規則限制ajp端口的訪問,或 者直接將改行注釋。
$ vim conf/server.xml
<!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->
# Apache基金下的服務器來做靜態資源處理的,而這部分需要花費大量時間,當用nginx和tomcat做企業級集群的時候,需要禁用掉AJP協議。
#nginx加tomcat實現動靜分離
web客戶1訪問tomcat服務器的 資源index.jsp 是可以直接訪問的,如果我們訪問的是靜態資源,tomcat是不方便處理的它會把這些靜態資源返回給Apache服務器,由他們返回給用戶,所以tomcat服務器相對于nginx服務器在處理靜態資源上效率較低。因此我們的網站服務器一般是Nginx+tomcat,nginx負責處理靜態資源,因此AJP 協議我們在使用nginx+tomcat架構時可以關閉它來進行效率的優化。
文件列表訪問控制
conf/web.xml文件中的default部分listings的配置必須為false,false為不列出目錄文件,true為允許列出,默認為false。
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
### 訪問日志格式規范
# 開啟Referer和User-Agetn是為了一旦出現安全問題能夠更好的根據日志進行排查
$ vim conf/server.xml
<Host name="23.83.xx.xx" 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 %{Referer}i %{User-Agent}i %D" />
<Context docBase="/usr/local/tomcat/webapps/FWYsWeb" path="" reloadable="true"/>
<Context docBase="/usr/local/tomcat/webapps/FWYsWeb" path="/FWYsWeb" reloadable="true"/>
</Host>
配置管理員賬戶
進入conf目錄下,打開tomcat-users.xml,在首尾元素中間加入:
<role rolename="manager"/>
<role rolename="manager-gui"/> #允許訪問html接口(即URL路徑為/manager/html/*)
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
還有很多權限配置可以百度
訪問:http://ip地址:8080/manager/status 就會出現監控頁面