經常使用配置詳解
1 目錄結構
/bin:腳本文件目錄。
/common/lib:存放全部web項目均可以訪問的公共jar包(使用Common類加載器加載)。
/conf:存放配置文件,最重要的是server.xml。
/logs:存放日誌文件。
/server/webapps:來管理Tomcat-web服務用的。僅對TOMCAT可見,對全部的WEB APP都不可見(使用Catalina類加載器加載)。
/shared/lib:僅對全部WEB APP可見,對TOMCAT不可見(使用Shared類加載器加載)。
/temp:Tomcat運行時候存放臨時文件用的。
/webapps:web應用發佈目錄。
/work:Tomcat把各類由jsp生成的servlet文件放在這個目錄下。刪除後,啓動時會自動建立。
2 配置文件
server.xml:主要的配置文件。
web.xml:缺省的web app配置,WEB-INF/web.xml會覆蓋該配置。
context.xml:不清楚跟server.xml裏面的context是否有關係。
server.xml配置
server標籤
port:指定一個端口,這個端口負責監聽關閉tomcat的請求。
shutdown:指定向端口發送的命令字符串。
service標籤
name:指定service的名字。
Connector(表示客戶端和service之間的鏈接)標籤javascript
port:指定服務器端要建立的端口號,並在這個端口監聽來自客戶端的請求。
minProcessors:服務器啓動時建立的處理請求的線程數。
maxProcessors:最大能夠建立的處理請求的線程數。
enableLookups:若是爲true,則能夠經過調用request.getRemoteHost()進行DNS查詢來獲得遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址。
redirectPort:指定服務器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口號。
acceptCount:指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理。
connectionTimeout:指定超時的時間數(以毫秒爲單位)。
Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求)標籤
defaultHost:指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是同樣的。
Context(表示一個web應用程序,一般爲WAR文件,關於WAR的具體信息見servlet規範)標籤
docBase:該web應用的文檔基準目錄(Document Base,也稱爲Context Root),或者是WAR文件的路徑。可使用絕對路徑,也可使用相對於context所屬的Host的appBase路徑。
path:表示此web應用程序的url的前綴,這樣請求的url爲http://localhost:8080/path/****。
reloadable:這個屬性很是重要,若是爲true,則tomcat會自動檢測應用程序的/WEB-INF/lib和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,咱們能夠在不重起tomcat的狀況下改變應用程序。
useNaming:若是但願Catalina爲該web應用使能一個JNDI InitialContext對象,設爲true。該InitialialContext符合J2EE平臺的約定,缺省值爲true。
workDir:Context提供的臨時目錄的路徑,用於servlet的臨時讀/寫。利用javax.servlet.context.tempdir屬性,servlet能夠訪問該目錄。若是沒有指定,使用$CATALINA_HOME/work下一個合適的目錄。
swallowOutput:若是該值爲true,System.out和System.err的輸出被重定向到web應用的logger。若是沒有指定,缺省值爲false
debug:與這個Engine關聯的Logger記錄的調試信息的詳細程度。數字越大,輸出越詳細。若是沒有指定,缺省爲0。
host(表示一個虛擬主機)標籤
name:指定主機名。
appBase:應用程序基本目錄,即存放應用程序的目錄。
unpackWARs:若是爲true,則tomcat會自動將WAR文件解壓,不然不解壓,直接從WAR文件中運行應用程序。
Logger(表示日誌,調試和錯誤信息)標籤
className:指定logger使用的類名,此類必須實現org.apache.catalina.Logger接口。
prefix:指定log文件的前綴。
suffix:指定log文件的後綴。
timestamp:若是爲true,則log文件名中要加入時間,以下例:localhost_log.2001-10-04.txt。
Realm(表示存放用戶名,密碼及role的數據庫)標籤
className:指定Realm使用的類名,此類必須實現org.apache.catalina.Realm接口。
Valve(功能與Logger差很少,其prefix和suffix屬性解釋和Logger 中的同樣)標籤
className:指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類能夠記錄應用程序的訪問信息。
directory:指定log文件存放的位置。
pattern:有兩個值,common方式記錄遠程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應代碼,發送的字節數。combined方式比common方式記錄的值更多。
3 配置虛擬目錄
1)直接部署到webapps目錄下面訪問。
2)修改conf/server.xml文件。在<Host name="localhost" appBase="webapps" unpackWARs="true" xmlValidation="false" xmlNamespaceAware="false"></host>中加入<Context path="/test" docBase="webdemo" debug="0" reloadable="true" />。docBase目錄默認使用appBase="webapps"這個目錄。也能夠是絕對路徑。
配置主目錄,能夠將path=""。
3)當項目沒有放在webapps目錄下時,能夠在conf/Catalina/localhost新建一個XXX.XML文件。裏面加入<Context docBase="E:webdemo" debug="0" reloadable="true" />。
注意:這裏的path屬性不須要設置,設置了也不會起做用的。
也可使用該方法創建主目錄指向另外一個目錄,例如:<Context docBase="E:webdemo" debug="0" reloadable="true" />命名爲ROOT.xml,這樣默認訪問的主目錄就被修改過了。
4 配置鏈接數
maxThreads:Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數。
acceptCount:指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理。
minSpareThreads:Tomcat初始化時建立的線程數。
maxSpareThreads:一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程。
enableLookups:是否反查域名,取值爲:true或false。爲了提升處理能力,應設置爲false
connectionTimeout:網絡鏈接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。默承認設置爲20000毫秒。
web server容許的最大鏈接數還受制於操做系統的內核參數設置,一般Windows是2000個左右,Linux是1000個左右。
5 配置內存大小
修改bin/catalina.bat中的set CATALINA_OPTS=-Xms64m -Xmx128m。
Xms指最小內存,Xmx指最大內存。
6 安全配置
1)將<Server port="8005" shutdown="SHUTDOWN">SHUTDOWN修改成其餘一些字符串。不然就容易被人給中止掉了。
2)對應tomcat3.1中,屏蔽目錄文件自動列出
修改conf/web.xml中的
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value><!-- 改爲false -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
3)訪問日誌設置
在server.xml中加入
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
這樣訪問日誌會記錄到Logs中。
4)修改用戶名、密碼
conf/tomcat-users.xml
5)屏蔽後臺管理入口
方法一:從控制用戶和權限着手。廢掉要管理權限的用戶就能夠了。
方法二:將conf/Catalina/localhost/manager.xml更名。
6)配置403,404,500錯誤頁面
默認狀況下,報出HTTP錯誤的時候會暴露tomcat版本號。若是不想暴露的話,就須要從新定義錯誤跳轉頁面。
<error-page>
<error-code>401</error-code>
<location>/401.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
注意:在測試的時候碰到一個奇怪的現象,平時項目裏面的時候測試正常的。但是今天在tomcat目錄裏面新建一個測試目錄測試並不能跳轉到指定錯誤頁面。暫時不知道爲何。
7 配置Log4j日誌記錄
項目中拋出的異常,拋到tomcat中的異常會被tomcat記錄下來,存放至logs/localhost.yyyy-MM-dd.log文件中。
平時咱們在項目中使用的log4j記錄日誌跟tomcat是沒有任何關係的,是獨立的一個程序,記錄的文件是自定義的。
咱們能夠在tomcat中定義一個log4j的公共日誌處理方式,這樣在項目中就不須要在定義log4j的配置了。
1)將log4j-1.2.15.jar加入到commonlib目錄。
2)將log4j.properties加入到commonclasses目錄。
內容例如:
# Output pattern : date [thread] priority category - message
log4j.rootLogger=DEUBG, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=${catalina.home}/logs/tomcat_app.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#3rd party library level
log4j.logger.org.hibernate.cache=ERROR
注意:咱們項目中使用e.printStackTrace();輸出的異常會在控制檯輸出來,可是,不會記錄到tomcat日誌中。
並且,也不會記錄到log4j的日誌中。要想記錄到log4j日誌中,必須使用log4j輸出來。
因此,實際上web項目中進行異常處理應該將e.printStackTrace();寫寫法多改爲log4j的形式纔對!
可是,實際項目中不少項目多偷懶使用了e.printStackTrace();方式輸出異常。當出現異常的時候在控制檯上查看一下就能夠了,也不考慮實際運行時候的維護。假若有人不當心關了控制檯,那麼,你不就看不到異常了嗎?
我的介意使用log4j的形式記入web異常!
8 Tomcat5亂碼問題
Tomcat5跟Tomcat4對參數處理是不同的,在Tomcat4中get與post的編碼是同樣的,因此只要在過濾器中經過request.setCharacterEncoding()設定一次就能夠解決get與set的問題。然而,在Tomcat5中,get與post的處理是分開的,對get請求使用URIEncoding進行處理,對post使用request.setCharacterEncoding()處理。Tomcat5中,在server.xml的Connector元素增長了如下配置參數:
URIEncoding:用來設定經過URI傳遞的css
tomcat優化配置參數
優化內存,主要是在bin/catalina.bat/sh 配置文件中進行。linux上,在catalina.sh中添加:html
JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M"
其中:前端
• -server:啓用jdk的server版本。
• -Xms:虛擬機初始化時的最小堆內存。
• -Xmx:虛擬機可以使用的最大堆內存。 #-Xms與-Xmx設成同樣的值,避免JVM由於頻繁的GC致使性能大起大落
• -XX:PermSize:設置非堆內存初始值,默認是物理內存的1/64。
• -XX:MaxNewSize:新生代佔整個堆內存的最大值。
• -XX:MaxPermSize:Perm(俗稱方法區)佔整個堆內存的最大值,也稱內存最大永久保留區域。
1)錯誤提示:java.lang.OutOfMemoryError:Java heap spacejava
Tomcat默承認以使用的內存爲128MB,在較大型的應用項目中,這點內存是不夠的,有可能致使系統沒法運行。常見的問題是報Tomcat內存溢出錯誤,Outof Memory(系統內存不足)的異常,從而致使客戶端顯示500錯誤,通常調整Tomcat的-Xms和-Xmx便可解決問題,一般將-Xms和-Xmx設置成同樣,堆的最大值設置爲物理可用內存的最大值的80%。linux
set JAVA_OPTS=-Xms512m-Xmx512m
2)錯誤提示:java.lang.OutOfMemoryError: PermGenspace程序員
PermGenspace的全稱是Permanent Generationspace,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGenspace中,它和存放類實例(Instance)的Heap區域不一樣,GC(Garbage Collection)不會在主程序運行期對PermGenspace進行清理,因此若是你的應用中有很CLASS的話,就極可能出現PermGen space錯誤,這種錯誤常見在web服務器對JSP進行precompile的時候。若是你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。解決方法:web
setJAVA_OPTS=-XX:PermSize=128M
3)在使用-Xms和-Xmx調整tomcat的堆大小時,還須要考慮垃圾回收機制。若是系統花費不少的時間收集垃圾,請減少堆大小。一次徹底的垃圾收集應該不超過3-5 秒。若是垃圾收集成爲瓶頸,那麼須要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集參數對性能的影響。通常說來,你應該使用物理內存的 80% 做爲堆大小。當增長處理器時,記得增長內存,由於分配能夠並行進行,而垃圾收集不是並行的。面試
二、鏈接數優化:
#優化鏈接數,主要是在conf/server.xml配置文件中進行修改。數據庫
2.一、優化線程數
找到Connector port="8080" protocol="HTTP/1.1",增長maxThreads和acceptCount屬性(使acceptCount大於等於maxThreads),以下:
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />
其中:
• maxThreads:tomcat可用於請求處理的最大線程數,默認是200
• minSpareThreads:tomcat初始線程數,即最小空閒線程數
• maxSpareThreads:tomcat最大空閒線程數,超過的會被關閉
• acceptCount:當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理.默認100
2.二、使用線程池
在server.xml中增長executor節點,而後配置connector的executor屬性,以下:
<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>
其中:
• namePrefix:線程池中線程的命名前綴
• maxThreads:線程池的最大線程數
• minSpareThreads:線程池的最小空閒線程數
• maxIdleTime:超過最小空閒線程數時,多的線程會等待這個時間長度,而後關閉
• threadPriority:線程優先級
注:當tomcat併發用戶量大的時候,單個jvm進程確實可能打開過多的文件句柄,這時會報java.net.SocketException:Too many open files錯誤。可以使用下面步驟檢查:
• ps -ef |grep tomcat 查看tomcat的進程ID,記錄ID號,假設進程ID爲10001
• lsof -p 10001|wc -l 查看當前進程id爲10001的 文件操做數
• 使用命令:ulimit -a 查看每一個用戶容許打開的最大文件數
三、Tomcat Connector三種運行模式(BIO, NIO, APR)
3.一、三種模式比較:
1)BIO:一個線程處理一個請求。缺點:併發量高時,線程數較多,浪費資源。Tomcat7或如下在Linux系統中默認使用這種方式。
2)NIO:利用Java的異步IO處理,能夠經過少許的線程處理大量的請求。Tomcat8在Linux系統中默認使用這種方式。Tomcat7必須修改Connector配置來啓動(conf/server.xml配置文件):
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>
3)APR(Apache Portable Runtime):從操做系統層面解決io阻塞問題。Linux若是安裝了apr和native,Tomcat直接啓動就支持apr。
3.二、apr模式
安裝apr以及tomcat-native
yum -y install apr apr-devel
進入tomcat/bin目錄,好比:
cd /opt/local/tomcat/bin/
tar xzfv tomcat-native.tar.gz
cd tomcat-native-1.1.32-src/jni/native
./configure --with-apr=/usr/bin/apr-1-config
make && make install
#注意最新版本的tomcat自帶tomcat-native.war.gz,不過其版本相對於yum安裝的apr太高,configure的時候會報錯。
解決:yum remove apr apr-devel –y,卸載yum安裝的apr和apr-devel,下載最新版本的apr源碼包,編譯安裝;或者下載低版本的tomcat-native編譯安裝
安裝成功後還須要對tomcat設置環境變量,方法是在catalina.sh文件中增長1行:
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
#apr下載地址:http://apr.apache.org/download.cgi
#tomcat-native下載地址:http://tomcat.apache.org/download-native.cgi
修改8080端對應的conf/server.xml
protocol="org.apache.coyote.http11.Http11AprProtocol"
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
enableLookups="false"
redirectPort="8443"
URIEncoding="UTF-8" />
PS:啓動之後查看日誌 顯示以下表示開啓 apr 模式
Sep 19, 2016 3:46:21 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8081"]
tomcat常見面試題
1、Tomcat的缺省是多少,怎麼修改
Tomcat的缺省端口號是8080.修改Tomcat端口號:
1.找到Tomcat目錄下的conf文件夾
2.進入conf文件夾裏面找到server.xml文件
3.打開server.xml文件
4.在server.xml文件裏面找到下列信息
maxThreads=」150″ minSpareThreads=」25″ maxSpareThreads=」75″ enableLookups=」false」 redirectPort=」8443″ acceptCount=」100″ connectionTimeout=」20000″ disableUploadTimeout=」true」 />
5.把port=」8080″改爲port=」8888″,而且保存
6.啓動Tomcat,而且在IE瀏覽器裏面的地址欄輸入http://127.0.0.1:8888/
七、tomcat默認採用的BIO模型,在幾百併發下性能會有很嚴重的降低。tomcat自帶還有NIO的模型,另外也能夠調用APR的庫來實現操做系統級別控制。NIO模型是內置的,調用很方便,只須要將上面配置文件中protocol修改爲 org.apache.coyote.http11.Http11NioProtocol,重啓便可生效。以下面的參數配置,默認的是HTTP/1.1。
<Connector port=」8080″ protocol=」org.apache.coyote.http11.Http11NioProtocol」 connectionTimeout=」20000″ redirectPort=」8443″ maxThreads=」500″ minSpareThreads=」20″ acceptCount=」100″ disableUploadTimeout=」true」
enableLookups=」false」 URIEncoding=」UTF-8″ />
2、tomcat 如何優化?
一、優化鏈接配置.這裏以tomcat7的參數配置爲例,須要修改conf/server.xml文件,修改鏈接數,關閉客戶端dns查詢。
參數解釋:
URIEncoding=」UTF-8″ :使得tomcat能夠解析含有中文名的文件的url,真方便,不像apache裏還有搞個mod_encoding,還要手工編譯
maxSpareThreads : 若是空閒狀態的線程數多於設置的數目,則將這些線程停止,減小這個池中的線程總數。
minSpareThreads : 最小備用線程數,tomcat啓動時的初始化的線程數。
enableLookups : 這個功效和Apache中的HostnameLookups同樣,設爲關閉。
connectionTimeout : connectionTimeout爲網絡鏈接超時時間毫秒數。
maxThreads : maxThreads Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數,即最大併發數。
acceptCount : acceptCount是當線程數達到maxThreads後,後續請求會被放入一個等待隊列,這個acceptCount是這個隊列的大小,若是這個隊列也滿了,就直接refuse connection
maxProcessors與minProcessors : 在 Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、可以獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閒時間保持最低,從而接受更多的請求。
一般Windows是1000個左右,Linux是2000個左右。
useURIValidationHack:
咱們來看一下tomcat中的一段源碼:
【security】
if (connector.getUseURIValidationHack()) {
String uri = validate(request.getRequestURI());
if (uri == null) {
res.setStatus(400);
res.setMessage(「Invalid URI」);
throw new IOException(「Invalid URI」);
} else {
req.requestURI().setString(uri);
// Redoing the URI decoding
req.decodedURI().duplicate(req.requestURI());
req.getURLDecoder().convert(req.decodedURI(), true);
能夠看到若是把useURIValidationHack設成」false」,能夠減小它對一些url的沒必要要的檢查從而減省開銷。
enableLookups=」false」 : 爲了消除DNS查詢對性能的影響咱們能夠關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數值。
disableUploadTimeout :相似於Apache中的keeyalive同樣
給Tomcat配置gzip壓縮(HTTP壓縮)功能
compression=」on」 compressionMinSize=」2048″ compressableMimeType=」text/html,text/xml,text/javascript,text/css,text/plain」
HTTP 壓縮能夠大大提升瀏覽網站的速度,它的原理是,在客戶端請求網頁後,從服務器端將網頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML,CSS,Javascript , Text ,它能夠節省40%左右的流量。更爲重要的是,它能夠對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人。
1)compression=」on」 打開壓縮功能
2)compressionMinSize=」2048″ 啓用壓縮的輸出內容大小,這裏面默認爲2KB
3)noCompressionUserAgents=」gozilla, traviata」 對於如下的瀏覽器,不啓用壓縮
4)compressableMimeType=」text/html,text/xml」 壓縮類型
最後不要忘了把8443端口的地方也加上一樣的配置,由於若是咱們走https協議的話,咱們將會用到8443端口這個段的配置,對吧?{
tomcat設置https端口時,8443和443區別:
1. 8443端口在訪問時須要加端口號,至關於http的8080,不可經過域名直接訪問,須要加上端口號;https://yuming.com:8443。
2. 443端口在訪問時不須要加端口號,至關於http的80,可經過域名直接訪問;例:https://yuming.com。
*問:https使用域名訪問網站,而不顯示端口號?
答:將端口號設置爲443,便可經過域名直接訪問網站
}
<!–enable tomcat ssl–>
<Connector port=」8443″ protocol=」HTTP/1.1″ URIEncoding=」UTF-8″ minSpareThreads=」25″ maxSpareThreads=」75″ enableLookups=」false」 disableUploadTimeout=」true」 connectionTimeout=」20000″ acceptCount=」300″ maxThreads=」300″ maxProcessors=」1000″ minProcessors=」5″ useURIValidationHack=」false」 compression=」on」 compressionMinSize=」2048″ compressableMimeType=」text/html,text/xml,text/javascript,text/css,text/plain」
SSLEnabled=」true」scheme=」https」 secure=」true」clientAuth=」false」 sslProtocol=」TLS」keystoreFile=」d:/tomcat2/conf/shnlap93.jks」 keystorePass=」aaaaaa」/>
好了,全部的Tomcat優化的地方都加上了。
二、優化JDK
Tomcat默承認以使用的內存爲128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增長以下設置:
JAVA_OPTS=」‘$JAVA_OPTS」 -Xms[初始化內存大小] -Xmx[可使用的最大內存]
或
設置環境變量:export JAVA_OPTS=」」$JAVA_OPTS」 -Xms[初始化內存大小] -Xmx[可使用的最大內存]」
通常說來,你應該使用物理內存的 80% 做爲堆大小。若是本機上有Apache服務器,能夠先折算Apache須要的內存,而後修改堆大小。建議設置爲70%;建議設置[[初始化內存大小]等於[可使用的最大內存],這樣能夠減小平凡分配堆而下降性能。
本例使用加入環境變量的方式:
# vi /etc/profile
加入:export JAVA_OPTS=」」$JAVA_OPTS」 -Xms700 —Xmx700
# source /etc/profile
【參數說明】
-Xms 是指設定程序啓動時佔用內存大小。通常來說,大點,程序會啓動的 快一點,可是也可能會致使機器暫時間變慢。
-Xmx 是指設定程序運行期間最大可佔用的內存大小。若是程序運行須要佔 用更多的內存,超出了這個設置值,就會拋出OutOfMemory 異常。
-Xss 是指設定每一個線程的堆棧大小。這個就要依據你的程序,看一個線程 大約須要佔用多少內存,可能會有多少線程同時運行等。
-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64 。
-XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。
3、tomcat 有那幾種Connector 運行模式?
tomcat的運行模式有3種.修改他們的運行模式.3種模式的運行是否成功,能夠看他的啓動控制檯,或者啓動日誌.或者登陸他們的默認頁面http://localhost:8080/查看其中的服務器狀態。
1)bio
默認的模式,性能很是低下,沒有通過任何優化處理和支持.
2)nio
利用java的異步io護理技術,no blocking IO技術.
想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol爲
<Connector port=」80″ protocol=」org.apache.coyote.http11.Http11NioProtocol」 connectionTimeout=」20000″ URIEncoding=」UTF-8″ useBodyEncodingForURI=」true」 enableLookups=」false」 redirectPort=」8443″ />啓動後,就能夠生效。
3)apr
安裝起來最困難,可是從操做系統級別來解決異步的IO問題,大幅度的提升性能.
必需要安裝apr和native,直接啓動就支持apr。下面的修改純屬多餘,僅供你們擴充知識,但仍然須要安裝apr和native。如nio修改模式,修改protocol爲org.apache.coyote.http11.Http11AprProtocol
4、tomcat調優
1. JVM參數調優:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。這兩個值的大小通常根據須要進行設置。當應用程序須要的內存超出堆的最大值時虛擬機就會提示內存溢出,而且致使應用服務崩潰。所以通常建議堆的最大值設置爲可用內存的最大值的80%。在catalina.bat中,設置JAVA_OPTS='-Xms256m -Xmx512m',表示初始化內存爲256MB,可使用的最大內存爲512MB。
2. 禁用DNS查詢
當web應用程序想要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者經過域名服務器查找機器名轉換爲IP地址。DNS查詢須要佔用網絡,而且包括可能從不少很遠的服務器或者不起做用的服務器上去獲取對應的IP的過程,這樣會消耗必定的時間。爲了消除DNS查詢對性能的影響咱們能夠關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數值:
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" />
Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
3. 調整線程數
經過應用程序的鏈接器(Connector)進行性能控制的的參數是建立的處理請求的線程數。Tomcat使用線程池加速響應速度來處理請求。在Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、可以獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最大利用率的高效程序,使空閒時間保持最低,從而接受更多的請求。
Tomcat4中能夠經過修改minProcessors和maxProcessors的值來控制線程數。這些值在安裝後就已經設定爲默認值而且是足夠使用的,可是隨着站點的擴容而改大這些值。minProcessors服務器啓動時建立的處理請求的線程數應該足夠處理一個小量的負載。也就是說,若是一天內每秒僅發生5次單擊事件,而且每一個請求任務處理須要1秒鐘,那麼預先設置線程數爲5就足夠了。但在你的站點訪問量較大時就須要設置更大的線程數,指定爲參數maxProcessors的值。maxProcessors的值也是有上限的,應防止流量不可控制(或者惡意的服務攻擊),從而致使超出了虛擬機使用內存的大小。若是要加大併發鏈接數,應同時加大這兩個參數。web server容許的最大鏈接數還受制於操做系統的內核參數設置,一般Windows是2000個左右,Linux是1000個左右。
在Tomcat5對這些參數進行了調整,請看下面屬性:
maxThreads Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數。
acceptCount 指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理。
connnectionTimeout 網絡鏈接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。一般可設置爲30000毫秒。
minSpareThreads Tomcat初始化時建立的線程數。
maxSpareThreads 一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程。
最好的方式是多設置幾回而且進行測試,觀察響應時間和內存使用狀況。在不一樣的機器、操做系統或虛擬機組合的狀況下可能會不一樣,並且並非全部人的web站點的流量都是同樣的,所以沒有一刀切的方案來肯定線程數的值。
Tomcat做爲Web服務器,它的處理性能直接關係到用戶體驗,下面是幾種常見的優化措施:
1、掉對web.xml的監視,把jsp提早編輯成Servlet。有富餘物理內存的狀況,加大tomcat使用的jvm的內存
2、服務器資源
服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。
(1) 對於高併發狀況下會有大量的運算,那麼CPU的速度會直接影響處處理速度。
(2) 內存在大量數據處理的狀況下,將會有較大的內存容量需求,能夠用-Xmx -Xms -XX:MaxPermSize等參數對內存不一樣功能塊進行劃分。咱們以前就遇到過內存分配不足,致使虛擬機一直處於full GC,從而致使處理能力嚴重降低。
(3) 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成爲性能瓶頸。最好的辦法仍是利用下面提到的緩存。
3、利用緩存和壓縮
對於靜態頁面最好是可以緩存起來,這樣就沒必要每次從磁盤上讀。這裏咱們採用了Nginx做爲緩存服務器,將圖片、css、js文件都進行了緩存,有效的減小了後端tomcat的訪問。
另外,爲了能加快網絡傳輸速度,開啓gzip壓縮也是必不可少的。但考慮到tomcat已經須要處理不少東西了,因此把這個壓縮的工做就交給前端的Nginx來完成。
除了文本能夠用gzip壓縮,其實不少圖片也能夠用圖像處理工具預先進行壓縮,找到一個平衡點可讓畫質損失很小而文件能夠減少不少。曾經我就見過一個圖片從300多kb壓縮到幾十kb,本身幾乎看不出來區別。
4、採用集羣
單個服務器性能老是有限的,最好的辦法天然是實現橫向擴展,那麼組建tomcat集羣是有效提高性能的手段。咱們仍是採用了Nginx來做爲請求分流的服務器,後端多個tomcat共享session來協同工做。
5、 優化tomcat參數
這裏以tomcat7的參數配置爲例,須要修改conf/server.xml文件,主要是優化鏈接配置,關閉客戶端dns查詢。
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="20"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8" />
5、Tomcat 部署項目的三種方法
目錄
- 一、下載 Tomcat 服務器
- 二、啓動並部署 Tomcat 服務器
- 三、Tomcat 的目錄結構
- 四、部署項目的第一種方法(項目直接放入 webapps 目錄中)
- 五、部署項目的第二種方法(修改 conf/server.xml 文件 )
- 六、部署項目的第三種方法(apache-tomcat-7.0.52\conf\Catalina\localhost )
一、下載 Tomcat 服務器
①、官網下載地址:http://tomcat.apache.org/
②、tomcat 8.0 64位百度雲下載地址:http://pan.baidu.com/s/1slbKPsx 密碼:ewui
③、tomcat 8.0 32位百度雲下載地址:http://pan.baidu.com/s/1o8G28rS 密碼:k11n
二、啓動並部署 Tomcat 服務器
①、解壓 tomcat 安裝包到一個非中文目錄下
②、配置環境變量。JAVA_HOME(指向 JDK 安裝的根目錄)
③、雙擊 apache-tomcat-6.0.16\bin 目錄下的 startup.bat,啓動服務器(若是一閃而過,那就是沒有配置 JAVA_HOME 的環境變量)
④、在瀏覽器中輸入 http://localhost:8080
注意:Tomcat 啓動不了的時候注意配置 JAVA_HOME:C:\Program Files\Java\jdk1.6.0_43這是安裝 JDK的根目錄
三、Tomcat 的目錄結構
四、部署項目的第一種方法(項目直接放入 webapps 目錄中)
一、將編寫並編譯好的web項目(注意要是編譯好的,若是是 eclipse,能夠將項目打成 war 包放入),放入到 webapps 中

二、啓動tomcat服務器(雙擊 apache-tomcat-6.0.16\bin 目錄下的 startup.bat,啓動服務器)

三、在瀏覽器輸入:http://localhost:8080/項目名/訪問的文件名

五、部署項目的第二種方法(修改 conf/server.xml 文件 )
①、打開tomcat下conf/server.xml,在<Host> </Host>標籤之間輸入項目配置信息
1
|
<Context path=
"/WebProject"
docBase= "D:/WebProject" reloadable= "true" />
|
path:瀏覽器訪問時的路徑名
docBase:web項目的WebRoot所在的路徑,注意是WebRoot的路徑,不是項目的路徑。其實也就是編譯後的項目
reloadble:設定項目有改動時,tomcat是否從新加載該項目
②、雙擊 startup.bat,啓動 tomcat 服務器,而後在瀏覽器輸入訪問的項目名稱路徑

注意:若是你配置的 path="/xx",那麼訪問的時候就是這樣:

六、部署項目的第三種方法(apache-tomcat-7.0.52\conf\Catalina\localhost )
①、進入到 apache-tomcat-7.0.52\conf\Catalina\localhost 目錄,新建一個 項目名.xml 文件

②、在 那個新建的 xml 文件中,增長下面配置語句(和上面的是同樣的,可是不須要 path 配置,加上也沒什麼用)
1
|
<Context docBase=
"D:/WebProject"
reloadable= "true" />
|

③、在瀏覽器輸入路徑:localhost:8080/xml文件名/訪問的文件名

總結:
①、第一種方法比較普通,可是咱們須要將編譯好的項目從新 copy 到 webapps 目錄下,多出了兩步操做
②、第二種方法直接在 server.xml 文件中配置,可是從 tomcat5.0版本開始後,server.xml 文件做爲 tomcat 啓動的主要配置文件,一旦 tomcat 啓動後,便不會再讀取這個文件,所以沒法再 tomcat 服務啓動後發佈 web 項目
③、第三種方法是最好的,每一個項目分開配置,tomcat 將以\conf\Catalina\localhost 目錄下的 xml 文件的文件名做爲 web 應用的上下文路徑,而再也不理會 <Context>中配置的 path 路徑,所以在配置的時候,能夠不寫 path。
一般咱們使用第三種方法