tomcat內(nèi)存優(yōu)化
Tomcat內(nèi)存優(yōu)化主要是對(duì) tomcat 啟動(dòng)參數(shù)優(yōu)化劫狠,我們可以在 tomcat 的啟動(dòng)腳本 catalina.sh 中設(shè)置 java_OPTS 參數(shù)。在 配置文件中的102行添加就行
注意:堆最大值和非堆最大值的總和超過了物理內(nèi)存或者操作系統(tǒng)的最大限制都會(huì)引起服務(wù)器啟動(dòng)不起來。
JAVA_OPTS參數(shù)說明
-server 啟用jdk 的 server 版;
-Xms java虛擬機(jī)初始化時(shí)的最小內(nèi)存;
-Xmx java虛擬機(jī)可使用的最大內(nèi)存氢伟;
-XX: PermSize 內(nèi)存永久保留區(qū)域
-XX:MaxPermSize 內(nèi)存最大永久保留區(qū)域
一般設(shè)置-Xms,-Xmx相等以避免在每次GC后調(diào)整堆的大小幽歼,因?yàn)槟J(rèn)空余堆內(nèi)存小于40%時(shí)朵锣,JVM就會(huì)增大堆直到-Xmx的最大限制;空余堆內(nèi)存大于70%時(shí)试躏,JVM會(huì)減少堆直到-Xms的最小限制
現(xiàn)公司服務(wù)器內(nèi)存一般都可以加到最大2G 猪勇,所以可以采取以下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
配置完成后可重啟Tomcat
首先查看Tomcat 進(jìn)程號(hào):
ps aux | grep tomcat #查看tomcat的主進(jìn)程號(hào)
查看參數(shù)是否生效
jmap -heap 12222 #12222是主進(jìn)程號(hào)
堆(Heap)和非堆(Non-heap)內(nèi)存解釋
https://www.cnblogs.com/centos2017/p/9956432.html
## tomcat運(yùn)行模式的優(yōu)化
`Tomcat Connector(連接器)有三種運(yùn)行模式:BIO NIO APR`
**BIO(blocking I/O)**
是基于JAVA的HTTP/1.1連接器设褐,Tomcat7以下版本在默認(rèn)情況下是以bio模式運(yùn)行的颠蕴。一般而言拉鹃,bio模式是三種運(yùn)行模式中性能最低的一種稿辙。我們可以通過Tomcat Manager來查看服務(wù)器的當(dāng)前狀態(tài)。(**Tomcat7** 或以下,在 **Linux** 系統(tǒng)中默認(rèn)使用這種方式)一個(gè)線程處理一個(gè)請(qǐng)求脆淹,缺點(diǎn):并發(fā)量高時(shí),線程數(shù)較多讹弯,浪費(fèi)資源
<Connector port="9090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
#### **NIO(new I/O)**
是一個(gè)基于緩沖區(qū)月幌、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫西轩。它擁有比傳統(tǒng)I/O操作(bio)更好的并發(fā)運(yùn)行性能员舵。要讓Tomcat以nio模式來運(yùn)行只需要在Tomcat安裝目錄/conf/server.xml 中將對(duì)應(yīng)的中protocol的屬性值改為 org.apache.coyote.http11.Http11NioProtocol即可利用 Java 的異步請(qǐng)求 IO 處理,可以通過少量的線程處理大量的請(qǐng)求藕畔。
**Tomcat8**: 以上版本在 **Linux** 系統(tǒng)中马僻,默認(rèn)使用的就是NIO模式,不需要額外修改注服,**Tomcat7**必須修改Connector配置來啟動(dòng)
<Connector port="9090" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
APR (Apache Portable Runtime/Apache可移植運(yùn)行時(shí)) ( 安裝配置過程相對(duì)復(fù)雜)
APR(Apache Portable Run-time libraries)簡(jiǎn)單理解韭邓,就是從操作系統(tǒng)級(jí)別解決異步IO問題,大幅度的提高服務(wù)器的處理和響應(yīng)性能溶弟, 也是Tomcat運(yùn)行高并發(fā)應(yīng)用的首選模式女淑。APR是使用原生C語言編寫的非堵塞I/O,利用了操作系統(tǒng)的網(wǎng)絡(luò)連接功能辜御,速度很快鸭你。但是需先安裝apr和native,能大幅度提升性能擒权,不亞于魔獸開局爆高科技兵種苇本,威力強(qiáng)大
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執(zhí)行器(線程池)的優(yōu)化
開啟線程池:打開server.xml中關(guān)于線程池的配置
#一般情況下我們不使用Executor開啟線程池,我們?cè)贑onnector上直接配置
$ 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/" />
參數(shù)解釋:
port:服務(wù)端口TCP端口菜拓,默認(rèn)值為8089瓣窄;
connectionTimeout:設(shè)置連接的超時(shí)值,單位毫秒纳鼎,默認(rèn)值為60000俺夕;
keepAliveTimeout:當(dāng)http使用keep-alive時(shí)在tcp的一個(gè)連接中可以接收多個(gè)request,意思就是兩個(gè)request間的時(shí)間限定最大保持時(shí)間贱鄙,超過這個(gè)時(shí)間劝贸,連接將斷開,單位毫秒逗宁,默認(rèn)使用的是connectionTimeout的時(shí)間映九;
maxKeepAliveRequests:在服務(wù)器關(guān)閉前,該連接最大支持的請(qǐng)求數(shù)瞎颗,超過該請(qǐng)求數(shù)的連接也將被關(guān)閉件甥,設(shè)置為1表示禁用捌议,設(shè)置為-1表示不限個(gè)數(shù),默認(rèn)值為100引有;
maxHttpHeaderSize:HTTP請(qǐng)求和響應(yīng)頭的最大量瓣颅,單位字節(jié),默認(rèn)值為4096字節(jié)譬正;
URIEncoding:指定tomcat的url編碼格式宫补;
enableLookups:調(diào)用request、getRemoteHost()執(zhí)行DNS查詢曾我,以返回遠(yuǎn)程主機(jī)的主機(jī)名粉怕,如果設(shè)置為false,則直接返回IP地址抒巢,DNS反查很耗時(shí)間
acceptCount:當(dāng)所以可以處理的線程正在使用的時(shí)候斋荞,在隊(duì)列中排隊(duì)請(qǐng)求的最大連接數(shù),當(dāng)隊(duì)列已滿虐秦,所有請(qǐng)求都將被拒絕平酿,默認(rèn)值為100;
disableUploadTimeout:上傳時(shí)是否使用超時(shí)機(jī)制悦陋,以是servlet有較長(zhǎng)時(shí)間來完成它的執(zhí)行蜈彼,默認(rèn)值為false;
redirectPort:如連接器不支持SSL請(qǐng)求俺驶,如收到SSL請(qǐng)求幸逆,Catalina容器將會(huì)自動(dòng)重定向指定的端口號(hào),讓其進(jìn)行處理暮现;
compression:是否對(duì)響應(yīng)的數(shù)據(jù)進(jìn)行壓縮还绘,off:禁止壓縮,on:允許壓縮(文本將被壓縮)栖袋,force:表示所有情況下都進(jìn)行壓縮拍顷,默認(rèn)值為off;
compressionMinSize:?jiǎn)⒂脡嚎s的輸出內(nèi)容大小塘幅,默認(rèn)為2KB
noCompressionUserAgents:不啟用壓縮的瀏覽器昔案;
compressableMineType:MIME的列表,默認(rèn)以逗號(hào)分隔电媳,默認(rèn)值為text/html踏揣,text/xml,text/plain匾乓;
## tomcat版本隱藏
為了避免黑客針對(duì)某些版本進(jìn)行攻擊捞稿,因此我們需要隱藏或者偽裝 Tomcat 的版本信息。默認(rèn) Tomcat 的版本信息如下:
針對(duì)該信息的顯示是由一個(gè)jar包控制的,該jar包存放在 Tomcat 安裝目錄下的lib目錄下娱局,名稱為catalina.jar彰亥。
我們可以通過 jar xf 命令解壓這個(gè) jar 包會(huì)得到兩個(gè)目錄 META-INF 和 org ,通過修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段來實(shí)現(xiàn)來更改我們tomcat的版本信息。
設(shè)置session失效時(shí)長(zhǎng)
我們都知道铃辖,HTTP協(xié)議本身是無狀態(tài)的(Stateless),這對(duì)于一些簡(jiǎn)單的頁面展示來說猪叙,功能足夠娇斩,不受影響。而對(duì)于日漸復(fù)雜的動(dòng)態(tài)頁面穴翩、應(yīng)用犬第,各種需要登錄認(rèn)證等場(chǎng)景,就力不從心了芒帕。試想對(duì)于一個(gè)已經(jīng)登錄的用戶仍然一次次的提示登錄歉嗓,會(huì)是什么感受呢?而為了保持客戶端和服務(wù)端交互狀態(tài)背蟆,可以采取session失效時(shí)長(zhǎng)
Tomcat的可以在以下幾個(gè)地方設(shè)置會(huì)話超時(shí):
web級(jí)別:
在conf /web.xml文件中
< session-config >
< session-timeout > 30 </ session-timeout > #默認(rèn)就是30分鐘鉴分,以分為單位
</ session-config >
webapp級(jí)別:
在webapp中的WEB-INF /web.xm
< session-config >
< session-timeout > 30 </ session-timeout > #以分為單位
</ session-config >
應(yīng)用程序代碼中:硬編碼
session.setMaxInactiveInterval(30 * 60 ); //以秒為單位
優(yōu)先級(jí),越細(xì)粒度優(yōu)先級(jí)越高带膀,也就是3> 2> 1
還要一種配置志珍,但現(xiàn)在比較少見了,因?yàn)樾枰獙⑸舷挛呐渲迷趕erver.xml里:
這就是修改 conf /server.xml配置文件鐘垛叨,是以秒為單位
< Context path = “/ test” docBase = “/ home / httpd / html / test”
defaultSessionTimeOut = “3600” isWARExpanded = “true”
isWARValidated = “false” isInvokerEnabled = “true”
isWorkDirPersistent = “false” />
## 禁用AJP連接器實(shí)現(xiàn)動(dòng)靜分離
#Tomcat 服務(wù)器通過Connector連接器組件與客戶程序建立連接伦糯,Connector組件負(fù)責(zé)接收客戶的請(qǐng)求,以及把Tomcat服務(wù)器的響應(yīng)結(jié)果發(fā)送給客 戶嗽元。默認(rèn)情況下敛纲,Tomcat在server.xml中配置了兩種連接器,一種使用ajp剂癌,要和apache結(jié)合使用淤翔,一種使用http。當(dāng)使用http 時(shí)佩谷,可以限制ajp端口訪問办铡,在于防止線下測(cè)試流量被mod_jk轉(zhuǎn)發(fā)至線上tomcat服務(wù)器×找可以通過iptables規(guī)則限制ajp端口的訪問寡具,或 者直接將改行注釋。
$ vim conf/server.xml
<!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->
# Apache基金下的服務(wù)器來做靜態(tài)資源處理的稚补,而這部分需要花費(fèi)大量時(shí)間童叠,當(dāng)用nginx和tomcat做企業(yè)級(jí)集群的時(shí)候,需要禁用掉AJP協(xié)議。
#nginx加tomcat實(shí)現(xiàn)動(dòng)靜分離
web客戶1訪問tomcat服務(wù)器的 資源index.jsp 是可以直接訪問的厦坛,如果我們?cè)L問的是靜態(tài)資源五垮,tomcat是不方便處理的它會(huì)把這些靜態(tài)資源返回給Apache服務(wù)器,由他們返回給用戶杜秸,所以tomcat服務(wù)器相對(duì)于nginx服務(wù)器在處理靜態(tài)資源上效率較低放仗。因此我們的網(wǎng)站服務(wù)器一般是Nginx+tomcat,nginx負(fù)責(zé)處理靜態(tài)資源撬碟,因此AJP 協(xié)議我們?cè)谑褂胣ginx+tomcat架構(gòu)時(shí)可以關(guān)閉它來進(jìn)行效率的優(yōu)化诞挨。
文件列表訪問控制
conf/web.xml文件中的default部分listings的配置必須為false,false為不列出目錄文件呢蛤,true為允許列出惶傻,默認(rèn)為false。
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
### 訪問日志格式規(guī)范
# 開啟Referer和User-Agetn是為了一旦出現(xiàn)安全問題能夠更好的根據(jù)日志進(jìn)行排查
$ 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>
配置管理員賬戶
進(jìn)入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"/>
還有很多權(quán)限配置可以百度
訪問:http://ip地址:8080/manager/status 就會(huì)出現(xiàn)監(jiān)控頁面