一、Tomcat文件詳解
日誌文件logs
catalina.out
catalina.out其實是tomcat的標準輸出(stdout)和標準出錯(stderr),在tomcat的啓動腳本里指定的,沒有修改的話stdout和stderr會重定向到這裏。
catalina.-.log
訪問日誌信息,訪問的時間、IP、訪問的資料等。
localhost.-.log
運行日誌信息,運行異常、錯誤日誌等。
配置文件conf
server.xml 主要配置文件。
web.xml 缺省的web app配置,WEB-INF/web.xml會覆蓋該配置。
tomcat-users.xml 用戶配置文件。
二、安全配置
修改shutdown命令
# vim server.xml
<Server port="8005" shutdown="SHUTDOWN">
SHUTDOWN修改爲其他字符串
修改用戶名、密碼
# vim tomcat-users.xml
添加以下內容
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="admin" password="redhat" roles="manager-gui"/>
屏蔽後臺管理入口
方法1.控制用戶和權限,廢掉要管理權限的用戶。
方法2.將conf/Catalina/localhost/manager.xml更名。
配置403,404,500錯誤頁面
默認情況下,報出HTTP錯誤的時候會暴露tomcat版本號,需要重新定義錯誤跳轉頁面。
三、項目部署
第一種方法(直接放入 webapps 目錄)
編寫並編譯好的web項目(如果是 eclipse,將項目打成 war 包),放入到 webapps 中
第二種方法(修改 conf/server.xml 文件 )
# vim server.xml
在<Host> </Host>標籤之間輸入項目配置信息
<Context path="/Web" docBase="/Wh_k/test" reloadable="true" />
path:瀏覽器訪問時的路徑名
docBase:web項目的WebRoot所在的路徑,注意是WebRoot的路徑,不是項目的路徑,其實也就是編譯後的項目。
reloadble:設定項目有改動時,tomcat是否重新加載該項目
第三種方法(conf\Catalina\localhost )
# touch test.xml
加入下面配置語句
<Context docBase="/Wh_k/test" reloadable="true" />
總結
① 第一種方法我們需要將編譯好的項目重新 copy 到 webapps 目錄。
② 第二種方法直接在 server.xml 文件中配置,從 tomcat5.0版本後,server.xml 文件作爲啓動的主要配置文件,Tomcat 啓動後便不會再讀取這個文件,因此無法再 tomcat 服務啓動後發佈 web 項目。
③ 第三種方法是通常使用的方法,每個項目分開配置,tomcat 將以\conf\Catalina\localhost 目錄下的 xml 文件的文件名作爲 web 應用的上下文路徑,而不再理會 <Context>中配置的 path 路徑,在配置的時候,可以不用填寫 path。
四、Tomcat性能調優
1、優化內存JDK(最直接優化方式)
主要是對 tomcat 啓動參數優化,在 tomcat 的啓動腳本 catalina.sh 中設置 java_OPTS 參數
參數說明:
-server 啓用jdk 的 server 版
-Xms java虛擬機初始化時的最小內存
-Xmx java虛擬機可使用的最大內存
-XX: PermSize 內存永久保留區域
-XX:MaxNewSize:新生代佔整個堆內存的最大值。
-XX:MaxPermSize 內存最大永久保留區域
配置示例
# vim catalina.sh
添加以下內容:
JAVA_OPTS='-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m'
錯誤提示
1)錯誤提示:java.lang.OutOfMemoryError:Java heap space
Tomcat默認可以使用的內存爲128MB,在較大型的應用項目中,這點內存是不夠的,有可能導致系統無法運行。常見的問題是報Tomcat內存溢出錯誤,Outof Memory(系統內存不足)的異常,從而導致客戶端顯示500錯誤,一般調整Tomcat的-Xms和-Xmx即可解決問題,通常將-Xms和-Xmx設置成一樣,堆的最大值設置爲物理可用內存的最大值的80%。
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)那麼就會產生此錯誤信息了。解決方法:
setJAVA_OPTS=-XX:PermSize=128M
3)在使用-Xms和-Xmx調整tomcat的堆大小時,還需要考慮垃圾回收機制。如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過3-5 秒。如果垃圾收集成爲瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集參數對性能的影響。一般說來,你應該使用物理內存的 80% 作爲堆大小。當增加處理器時,記得增加內存,因爲分配可以並行進行,而垃圾收集不是並行的。
2、優化連接數
2.1.優化線程數
# vim server.xml
增加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.2.使用線程池
# vim 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:線程優先級
3、關閉DNS查詢
enableLookups=”false”
4、配置gzip壓縮(HTTP壓縮)功能
# vim server.xml
●compression="on" 打開壓縮功能
●compressionMinSize="2048"啓用壓縮的輸出內容大小,默認爲2KB
●noCompressionUserAgents="gozilla,traviata" 對於以下的瀏覽器,不啓用壓縮
●compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮
配置示例如下:
<Connector port="9999" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" acceptCount="500" maxThreads="400" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>
5、改變運行模式
tomcat的運行模式有3種:BIO NIO APR
bio
默認的模式,同步並阻塞,服務器實現模式爲一個連接一個線程,性能非常低下,沒有經過任何優化處理和支持。
nio
基於緩衝區、並能提供非阻塞I/O操作的Java API,同一個線程處理多個connection(多路複用),Tomcat 8.x默認情況下全部是運行在nio模式下
想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol爲
<Connector port=”9999″ protocol=”org.apache.coyote.http11.Http11NioProtocol” connectionTimeout=”20000″ URIEncoding=”UTF-8″ useBodyEncodingForURI=”true” enableLookups=”false” redirectPort=”8443″ />
啓動後,就可以生效。
apr
apr的本質就是使用jni技術調用操作系統底層的IO接口,安裝起來最困難,但是從操作系統級別來解決異步的IO問題,大幅度的提高性能。生產環境下用apr是非常必要的。
# yum -y install openssl-devel
# yum -y install apr-devel
# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-connectors/native/1.2.18/source/tomcat-native-1.2.18-src.tar.gz
# tar -xzf tomcat-native-1.2.18-src.tar.gz
# cd tomcat-native-1.2.18-src/native
# ./configure && make && make install
將默認的protocol="HTTP/1.1"修改爲protocol="org.apache.coyote.http11.Http11AprProtocol"
引入apr:配置catalina.sh文件
在原有變量JAVA_OPTS後面追加一行新的配置即可:JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"