當咱們公司使用tomcat做爲web應用服務器的規模愈來愈大,爲保證Tomcat配置安全,防止信息泄露,惡意攻擊以及配置的安全規範,特制定此Tomcat安全配置規範.本文章從別處轉載並作了補充
javascript
useradd -d /tomcat -u 501 tomcat echo "123" |passwd --stdin tomcat su - tomcat id tomcat # uid=501(tomcat) gid=1000(tomcat) groups=1000(tomcat) pwd # /tomcat
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.55/bin/apache-tomcat-8.5.55.tar.gz tail -5 .bash_profile JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export CATALINA_HOME=/usr/local/tomcat
mkdir webapps tar xvf apache-tomcat-8.5.55.tar.gz -C /tomcat/webapps/ /tomcat/webapps/apache-tomcat-8.5.55/bin/startup.sh
tomcat/webapps/* tomcat/conf/tomcat-user.xml
chmod 744 –R tomcat/bin/*
enableLookups: 調用request,getRemoteHost()執行DNS查詢,以返回遠程主機的主機名,若是設置爲false,css
<Connector enableLookups="false"/>
tomcat做爲一個應用服務器,也是支持 gzip 壓縮功能的。咱們能夠在 server.xml 配置文件中的 Connector 節點中配置以下參數,來實現對指定資源類型進行壓縮。 前端使用nginx做爲反向代理,通常不須要啓用tomcat壓縮功能。html
compression="on" # 打開壓縮功能 compressionMinSize="50" # 啓用壓縮的輸出內容大小,默認爲2KB noCompressionUserAgents="gozilla, traviata" # 對於如下的瀏覽器,不啓用壓縮 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些資源類型須要壓縮
<Server port="8527" shutdown=" dangerous"> <!--Define a non-SSL HTTP/1.1Connector on port 8080--> <Connector port="8080" server="webserver"/> <!--Define an AJP 1.3Connector on port 8528--> <!--Define an accesslog --> <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" resolveHosts="false"/> <Connector port="8528" protocol="AJP/1.3"/> <Context path="" docBase="/home/work/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true"/>
<init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <error-page> <error-code>403</error-code> <location>/forbidden.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/notfound.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/systembusy.jsp</location> </error-page>
# 降權啓動 # telnet管理端口保護 # ajp連接端口保護 # 禁用管理端 # 能夠看上面
Tomcat自己優化前端
# 1.首先對代碼進行動靜分離,讓Tomcat只負責Jsp文件的解析工做。 # 2.Connector鏈接器配置: # Bio,Nio和APR,三種方式性能差異很大,APR性能最好;
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="6000" enableLookups="false" acceptCount="800" redirectPort="8443" />
Tomcat最吃內存,只要內存足夠,就跑的快, 可是據說超過32G可能性能有些不穩定,能夠開多實例java
.nginx
若是系統資源有限,那就須要條魚哦,提升資源使用率web
.shell
優化catalina.sh配置文件,再catlina.sh配置文件添加以下代碼apache
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
server:必定要做爲第一個參數,在多個CPU時性能佳 -Xms:初始堆內存Heap大小,使用的最小內存,cpu性能高時此值應設的大一些 -Xmx:初始堆內存heap最大值,使用的最大內存 上面兩個值是分配JVM的最小和最大內存,取決於硬件物理內存的大小,建議均設爲物理內存的一半。 -XX:PermSize:設定內存的永久保存區域 -XX:MaxPermSize:設定最大內存的永久保存區域 -XX:MaxNewSize: -Xss 15120 這使得JBoss每增長一個線程(thread)就會當即消耗15M內存,而最佳值應該是128K,默認值好像是512k. +XX:AggressiveHeap 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個G的swap。 -Xss:每一個線程的Stack大小 -verbose:gc 現實垃圾收集信息 -Xloggc:gc.log 指定垃圾收集日誌文件 -Xmn:young generation的heap大小,通常設置爲Xmx的三、4分之一 -XX:+UseParNewGC :縮短minor收集的時間 -XX:+UseConcMarkSweepGC :縮短major收集的時間
設置JVM相關運行的參數
瀏覽器
1.32位系統jvm對內存限制不能突破2G,
2.-server: 第一個參數,多個CPU時性能佳,還有一種-client的模式,特色是啓動速度比較快,但運行時性能和內存管理效率不高,一般用於客戶端應用程序或者開發調試,32位環境默認該模式。 server模式特色: 啓動速度比較慢,但運行時性能和內存管理效率很高,適用於生產環境,64位jdk環境默認該模式;
3.-Xms: 表示java初始化堆的大小,-Xms與-Xmx設定同樣的值,避免JVM反覆申請內存,致使性能大起大落,默認爲物理內存物理內存1/64,,默認空閒堆內存小於40%,jvm就會增大堆直到-Xmx的最大限制;
4.-Xmx: 表示最大java堆大小,當應用程序須要的內存超過堆的最大值就會提示內存溢出,而且致使應用服務器崩潰,所以通常建議最大值設置爲可用內存最大值的80%;
使用java -Xmx512M -version命令測試,逐步增大512值,執行正常就表示指定的內存大小可用,不然打印錯誤信息;5.-Xss: 表示每一個java線程堆棧大小,JDK5.0之後每一個線程堆棧大小爲1M,之前每一個線程堆棧大小爲256k,根據應用線程所需內存大小進行調整,相同物理內存下,減小這個值能生成更多的線程,可是操做系統對一個進程內的線程數有限制,通常小的應用,若是棧不是很深,128k夠用的,大的256或512,通常不易超過1M,要否則容易出現out ofmemory,性能影響很大,須要嚴格測試;
Tomcat內存優化主要是對tomcat啓動參數優化,咱們能夠在tomcat的啓動腳本 catalina.sh設置java_OPTS參數
JAVA_OPTS參數說明
-server 啓用jdk 的 server 版; -Xms java虛擬機初始化時的最小內存; -Xmx java虛擬機可以使用的最大內存; -XX: PermSize 內存永久保留區域 -XX:MaxPermSize 內存最大永久保留區域
server.xml優化,大大提升Tomcat處理請求的能力
1.默認配置下,Tomcat會爲每一個鏈接器建立一個綁定的線程池,最大200,服務器啓動默認建立5個空閒進程隨時等待用戶請求。
2.Tomcat7在開啓線程池前,必定要安裝Apr庫,並能夠啓用,不然有錯誤報出,shutdown.sh腳本沒法關閉進程;
3.最大線程500,根據本身實際狀況合理設置,越大越耗費內存和CPU,由於CPU疲於線程上下文切換,沒有精力提供服務了,最小空閒線程數20,線程最大空閒時間60秒,容許最大線程數還受制於操做系統的內核參數設置,根據本身需求和環境;
4.Connection<肯萊克行> Timeout; 網絡鏈接超時,設置爲0表示永不超時,有隱患,一般30000毫秒,根據實際狀況,適當修改;
5.DisableUploadTimout: <滴雖播,啊譜樓的,> 上傳時是否啓用超時機制;
6.ConnectionUploadTimeout: <>上傳超時時間,根據業務本身調,
7.keepalive<K普林>timeout: 表示下次請求過來以前,Tomcat保持該鏈接多久,通常使用Connection Timeout時間8.compression: 是否對響應數據進行Gzip壓縮,壓縮後數據能夠有效減小頁面大小,通常能夠減小1/3左右,節省寬帶;
9.compression<肯坡遜 >MinSize: 表示壓縮響應的最小值,只有當響應報文大小大於這個值的時候纔會對報文進行壓縮;指定壓縮類型,對那些類型文件進行數據壓縮,可是配置了動靜分離,也就不須要配置壓縮了;由於靜態頁面和圖片錄音數據不須要Tomcat處理了;
服務器參數配置
現公司服務器內存通常能夠加到最大2G,因此能夠採起如下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
1 . Tomcat鏈接相關參數
在Tomcat配置文件的server.xml中的
<Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" minProcessors="100" maxProcessors="1000" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>
2 . 調整鏈接器connector的併發鏈接能力
1>參數說明 maxThreads 客戶請求最大線程數 minSpareThreads Tomcat初始化時建立的 socket 線程數 maxSpareThreads Tomcat鏈接器的最大空閒 socket 線程數 enableLookups 若設爲true, 則支持域名解析,可把 ip 地址解析爲主機名 redirectPort 在須要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort 端口 acceptAccount 監聽端口隊列最大數,滿了以後客戶請求會被拒絕(不能小於maxSpareThreads ) connectionTimeout 鏈接超時 minProcessors 服務器建立時的最小處理線程數 maxProcessors 服務器同時最大處理線程數 URIEncoding URL統一編碼 2>Tomcat中的配置示例 <Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>
3 . Tomcat緩存優化
1>參數說明 c ompression 打開壓縮功能 compressionMinSize 啓用壓縮的輸出內容大小,這裏面默認爲2KB compressableMimeType 壓縮類型 connectionTimeout 定義創建客戶鏈接超時的時間. 若是爲 -1, 表示不限制創建客戶鏈接的時間 2>Tomcat中的配置示例 <Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" connectionTimeout="20000" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>
參考舊的配置
<Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" connectionTimeout="20000" URIEncoding="utf-8" acceptCount="200" redirectPort="8443" disableUploadTimeout="true" /> 後來發如今訪問量達到3 百萬多的時候出現性能瓶頸。 2>更改後的配置 <Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" connectionTimeout="20000" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>