5、預設tomcat要使用在生產環境需要做哪些優化 lTomcat記憶體優化 Tomcat記憶體優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 JAVA_OPTS 參數。 JAVA_OPTS='-Xms1024m -Xmx2048m -XX ...
5、預設tomcat要使用在生產環境需要做哪些優化
lTomcat記憶體優化
Tomcat記憶體優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 JAVA_OPTS 參數。
JAVA_OPTS='-Xms1024m -Xmx2048m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m'
參數說明:
-server 啟用jdk 的 server 版;
-Xms java虛擬機初始化時的最小記憶體;
-Xmx java虛擬機可使用的最大記憶體;
-XX:PermSize 記憶體永久保留區域
-XX:MaxPermSize 記憶體最大永久保留區域
l壓縮傳輸
tomcat作為一個應用伺服器,也是支持 gzip 壓縮功能的。我們可以在 server.xml 配置文件中的 Connector 節點中配置如下參數,來實現對指定資源類型進行壓縮。
compression="on" # 打開壓縮功能
compressionMinSize="50" # 啟用壓縮的輸出內容大小,預設為2KB
noCompressionUserAgents="gozilla, traviata" # 對於以下的瀏覽器,不啟用壓縮
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些資源類型需要壓縮
提示:
Tomcat 的壓縮是在客戶端請求伺服器對應資源後,從伺服器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程 HTML、CSS、Javascript和Text,它可以節省40% 左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。但是,壓縮會增加 Tomcat 的負擔,因此最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,將壓縮的任務交由 Nginx/Apache 去做。
l多實例
強烈建議不要使用 Tomcat 的虛擬主機,推薦每個站點使用一個實例。即,可以啟動多個 Tomcat,而不是啟動一個 Tomcat 裡面包含多個虛擬主機。因為 Tomcat是多線程,共用記憶體,任何一個虛擬主機中的應用崩潰,都會影響到所有應用程式。雖然採用多實例的方式會產生過多的開銷,但至少保障了應用程式的隔離和安全。
lmaxThreads 連接數限制
maxThreads 是 Tomcat 所能接受最大連接數。一般設置不要超過8000以上,如果你的網站訪問量非常大可能使用運行多個Tomcat實例的方法,即,在一個伺服器上啟動多個tomcat然後做負載均衡處理。
這裡還需要註意的一點是,tomcat 和 php 不同。php可以按照cpu和記憶體的情況去配置連接數,上萬很正常。而 java 還需要註意 jvm 的參數配置。如果不註意就會因為jvm參數過小而崩潰。
預設值:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
修改為:
<Executor
name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="100"
prestartminSpareThreads = "true"
maxQueueSize = "100"
/>
參數解釋:
maxThreads,最大併發數,預設設置 200,一般建議在 500 ~ 800,根據硬體設施和業務來判斷
minSpareThreads,Tomcat 初始化時創建的線程數,預設設置 25
prestartminSpareThreads,在 Tomcat 初始化的時候就初始化 minSpareThreads 的參數值,如果不等於 true,minSpareThreads 的值就沒啥效果了
maxQueueSize,最大的等待隊列數,超過則拒絕請求
l隱藏版本信息
為了避免黑客針對某些版本進行攻擊,因此我們需要隱藏或者偽裝 Tomcat 的版本信息。
針對該信息的顯示是由一個jar包控制的,該jar包存放在 Tomcat 安裝目錄下的lib目錄下,名稱為 catalina.jar。
我們可以通過 jar xf 命令解壓這個 jar 包會得到兩個目錄 META-INF 和 org ,通過修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 欄位來實現來更改我們tomcat的版本信息。
文件信息如下:
[root@localhost ~]# cat org/apache/catalina/util/ServerInfo.properties |grep -v '^$|#'
server.info=Apache Tomcat/7.0.53
server.number=7.0.53.0
server.built=Mar 25 2014 06:20:16
當然,還有另外一種方法來實現隱藏或偽裝Tomcat的版本信息,不過本質和上面一樣,操作如下:
[root@localhost ~]# cd /usr/local/apache-tomcat-7.0.53/lib
[root@localhost lib]# mkdir -p org/apache/catalina/util
[root@localhost lib]# cd org/apache/catalina/util
[root@localhost util]# vim ServerInfo.properties
server.info=nolinux # 如果想修改成其它版本號,把這個地方的值改成其它值就行了
修改完畢之後,重啟 Tomcat即可看到效果!
lconnector連接器的工作方式
之前文件介紹過的 Tomcat 連接器的三種方式: bio、nio 和 apr,三種方式性能差別很大,apr 的性能最優, bio 的性能最差。而 Tomcat 7 使用的 Connector 預設就啟用的 Apr 協議,但需要系統安裝 Apr 庫,否則就會使用 bio 方式。
l禁用DNS查詢
當web應用程式向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過功能變數名稱伺服器查找機器名 轉換為IP地址。
DNS查詢需要占用網路,並且包括可能從很多很遠的伺服器或者不起作用的伺服器上去獲取對應的IP的過程,這樣會消耗一定的時間。
修改server.xml文件中的Connector元素,修改屬性enableLookups參數值: enableLookups="false"
如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址
Tomcat的運行模式有哪幾種?
Tomcat Connector三種運行模式:BIO, NIO, APR
BIO
一個線程處理一個請求。缺點:併發量高時,線程數較多,浪費資源。Tomcat7或以下,在Linux系統中預設使用這種方式。
NIO
利用Java的非同步IO處理,可以通過少量的線程處理大量的請求。Tomcat8在Linux系統中預設使用這種方式。Tomcat7必須修改Connector配置來啟動:
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"/>
Tomcat8以後NIO2模式:
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443"/>
APR
即Apache Portable Runtime,從操作系統層面解決io阻塞問題。Tomcat7或Tomcat8在Win7或以上的系統中啟動預設使用這種方式。Linux如果安裝了apr和native,Tomcat直接啟動就支持apr。
預設的鏈接參數配置:
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
/>
修改為:
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443"/>
參數解釋:
protocol,Tomcat 8 設置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol
protocol,Tomcat 6、7 設置 nio 更好:org.apache.coyote.http11.Http11NioProtocol
enableLookups,禁用DNS查詢
acceptCount,指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,預設設置 100
maxPostSize,以 FORM URL 參數方式的 POST 提交方式,限制提交最大的大小,預設是 2097152(2兆),它使用的單位是位元組。10485760 為 10M。如果要禁用限制,則可以設置為 -1
acceptorThreadCount,用於接收連接的線程的數量,預設值是1。一般這個指需要改動的時候是因為該伺服器是一個多核CPU,如果是多核 CPU 一般配置為 2