【WEB】Tomcat基礎使用知識


 

由於當前項目性質原因,從開始到現在使用的WEB服務器都是WAS,而Tomcat的基礎知識也慢慢地被遺忘。由於種種原因,讓我參與到了另外一個全新的項目,使用的是Tomcat6.X,所以復習是必須的,而寫卻卻是復習的一種高效手段。

 

一、Tomcat的基本配置

 

/conf/是Tomcat的配置文件目錄,該目錄下的問題都是和WEB容器的配置相關,以下分別學習一下:

 

content.xml

Tomcat官網這這樣解釋這個文件的:

If Tomcat is unable to identify the appropriate resource factory and/or additional configuration information is required, additional Tomcat specific configuration must be specified before Tomcat can create the resource. Tomcat specific resource configuration is entered in the <Context> elements that can be specified in either $CATALINA_BASE/conf/server.xml or, preferably, the per-web-application context XML file (META-INF/context.xml).

結合我對英文的那么丁點的理解和網友的一些中文介紹,這就是一個JNDI的全局內容配置文件(例如數據量線程池等)。再說就是跟我們平時項目里面的/WEB-INFO/web.xml是類似的,官網還指出:

If a resource has been defined in a <Context> element it is not necessary for that resource to be defined in /WEB-INF/web.xml. However, it is recommended to keep the entry in /WEB-INF/web.xml to document the resource requirements for the web application.

如果項目的web.xml配置了相同的資源,則web.xml的配置會覆蓋content.xml,除非content.xml的配置資源override屬性為true。具體怎么配置就不多說了,如果需要用到,最好看Tomcat官網的配置介紹。

 

logging.properties

從名稱就可以看出,這是Tomcat輸出日志的配置文件,具體的格式說明同樣可參考官方文檔說明

 

tomcat-users.xml

顧名思義,這既是Tomcat管理平台的用戶配置文件,想進入Tomcat控制台操作必須得在這里配置用戶和相關角色。例如:

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users>

<role rolename="tomcat"/>

<role rolename="manager"/>

<role rolename="admin"/>

<user username="tomcat" password="tomcat" roles="tomcat,manager,admin"/>

</tomcat-users>

 

web.xml

如果不熟悉Tomcat配置的人,在這里看到web.xml配置文件的,多少有點驚訝,畢竟我們平時接觸較多的還是項目中/WEB-INFO/下的web.xml配置文件。但別忘了,我們啟動Tomcat后不也是能打開控制台頁面嗎,沒錯,其實這是整個Tomcat工程的WEB配置文件。打開這個web.xml可以看到許多的servlet配置,這些都是Tomcat工程的配置,還有許多MIME(Multipurpose Internet Mail Extensions)的配置,最熟悉莫過於會話的配置:

<session-config> 

    <session-timeout>30</session-timeout> 

</session-config>

為什么我們發布的工程會話都是默認30分鍾超時,就是這里配置的原因,所以說,這個/conf/web.xml的配置參數對整個Tomcat的所有項目都有效,也就是全局共享的。conf/web.xml文件中的設定會應用於所有的web應用程序,而某些web應用程序的WEB-INF/web.xml中的設定只應用於該應用程序本身。

 

server.xml

這是Tomcat算是最基本的配置文件,WEB容器的基本配置都在這里,包括端口、虛擬機、線程池等配置信息。關於這個server.xml的配置說明,網上眾說紛紜的,大家都是站在各自理解的角度去寫並且沒有版本說明。對於配置的准確說明,還是建議看Tomcat官網的官方解釋和例子去理解。

 

catalina.policy

理解這個文件前可能需要先理解一下java.policy的原理,java.policy主要是配置Java的一些代碼調用權限,例如防止第三方jar包對JVM的破壞等,好比System.exit()這個方法是用來結束當前正在運行中的java虛擬機。如果每個人都有權限,那么誰都可以執行,一個不小心給某個人用錯了,那得多蛋疼。沒錯,這可以通過設置java.policy來配置相關權限。當然在現實真正考慮去使用到這一特性的項目,我相信不多。而Tomcat中的安全管理原理基本與前面JDK中的security類似,只是啟動時需要在start后面添加-security參數,tomcat會自動讀取 conf/catalina.policy 文件中的權限配置。附上一句Tomcat官網的一句原話:

The security policies implemented by the Java SecurityManager are configured in the $CATALINA_BASE/conf/catalina.policy file. This file completely replaces the java.policy file present in your JDK system directories. The catalina.policy file can be edited by hand, or you can use the policytool application that comes with Java 1.2 or later.

需要的話可以參考一下這個博客園友的認真介紹和學習java.policy的相關知識。

 

catalina.properties

Tomcat官網介紹

Configuring Package Protection in Tomcat

Starting with Tomcat 5, it is now possible to configure which Tomcat internal package are protected againts package definition and access. See http://java.sun.com/security/seccodeguide.html for more information.

WARNING: Be aware that removing the default package protection could possibly open a security hole

從介紹可以看出這是一個在Tomcat容器里對包權限管理的配置文件,主要包含三部分:

#第一部分:安全設置

package.access

package.definition

#第二部分:類加載設置

common.loader

server.loader

shared.loader

#第三部分:字符緩存設置

tomcat.util.buf.StringCache.byte.enabled

tomcat.util.buf.StringCache.char.enabled

tomcat.util.buf.StringCache.trainThreshold

tomcat.util.buf.StringCache.cacheSize

 

二、Tomcat的安全配置

如果Tomcat是通過其它反向代理服務轉發的話,公網網絡隔離也是必須的安全防護手段,當然,沒有人覺得安全是足夠的,除了網絡的安全限制,Tomcat自身的配置也會關系到Tomcat的使用安全。我主要還是通過網友們的經驗總結出以下幾種安全事項:

 

1、修改shutdown命令字符

在server.xml的server節點有一個shutdown屬性,來看一下官網對這個屬性的解釋:

The command string that must be received via a TCP/IP connection to the specified port number, in order to shut down Tomcat.

也就是說,通過TPC/IP連接后發送這個shutdown屬性配置的字符串命令就可以關閉Tomcat,但有一點要注意,這個連接必須是本地的,但也不排除主機被操控。所以還是建議修改這個端口和關閉命令,也不好讓別人容易猜到。這個修改不影響shutdown.sh的執行,運行shutdown.sh一樣可以關閉服務器。

 

2、增加防火牆

這就是在本地服務器增加防火牆策略,只允許應用訪問的端口進來,其它一概拒絕,也可以確保Tomcat的安全性,這需要因人而已,但也是一個手段。

 

3、Tomcat管理台的安全

Tomcat管理台的文件主要存放在/webapp/下,如果不需要可以全部刪除,又或者通過tomcat-user.xml增加角色和密碼。

 

4、運行錯誤網頁

如果找不到網頁即出現404錯誤,會顯示服務器版本號,服務器配置也一目了然,

為了避免這種情況,希望自定義設置錯誤頁面。

修改/conf/web.xml文件,在文件的倒數第二行(一行之前)加入<error-page>的配置內容,跟在工程的/WEB-INFO/web.xml下配置的規則一樣,然后在/webapp/ROOT/下加入自定義的錯誤頁面。

 

5、屏蔽目錄文件自動列出的方法

修改/ 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>false</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

</servlet>

其中把<param-value>false</param-value>就是代表已經機制目錄文件列表顯示。但在我的Tomcat6.X版本設置為true也顯示不出來,可能跟版本有關。

 

6、以非root用戶運行

這並非只有Tomcat,其它程序都應該盡量用非root運行。

 

7、關閉8009端口

8009端口是tomcat和apache的mod_proxy_ajp,mod_jk溝通的端口,沒有用到就關了。

 

8、Tomcat記錄客戶端的訪問日志

日志是重要的數據參考,有必要可以考慮開啟Tomcat訪問日志,代價是會消耗一定的性能。配置方法是在加上/conf/server.xml配置文件上添加Valve節點,具體配置可以查看Tomcat官方文檔。

 

9、關閉應用自動部署

在/conf/server.xml配置文件的host節點里關閉war自動部署,防止被植入木馬等惡意程序。

 

<Host name="localhost"  appBase="webapps"

            unpackWARs="false" autoDeploy="false"

            xmlValidation="false" xmlNamespaceAware="false">

 

三、Tomcat的監控配置

監控一個系統不可或缺的部分,Tomcat的管理平台是有監控功能的,具體路徑是:

IP:PORT/manager/status

但這並不能滿足遠程腳本監控的需要,此外,Tomcat還支撐通過JMX進行監控,具體配置如下(Tomcat6.x Linux):

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Djava.rmi.server.hostname=192.168.88.128 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access"

這句配置語句是在# ----- Execute The Requested Command -----------------------------------------上面

Java監控例子:

String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi"; 

JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); 

 

Map map = new HashMap(); 

// 用戶名密碼,在jmxremote.password文件中查看 

String[] credentials = new String[] { "monitorRole", "tomcat" }; 

map.put("jmx.remote.credentials", credentials); 

JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map); 

MBeanServerConnection mbsc = connector.getMBeanServerConnection(); 

 

// 端口最好是動態取得 

ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080"); 

MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName); 

 

// tomcat的線程數對應的屬性值 

String attrName = "currentThreadCount"; 

MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes(); 

System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName)); 

注意:我配置調試過程中遇到了無法訪問127.0.0.1地址,原因跟服務器的hostname對應的IP配置(/etc/hosts)有關,如果真遇到了可以網上搜索一下。

 詳細介紹請看Tomcat官網

 

四、Tomcat的性能優化

1、操作系統調優

如果是並發量大的應用,需要設置操作系統的最大文件打開數:

/etc/sysctl.conf

/etc/security/limits.conf

 

2、Java虛擬機調優

具體JVM參數說明不再詳細介紹,網上確實很多,平時我主要調整的還是-Xmx和-Xms。其他使用默認就好。當然,具體問題具體分析。Tomcat的Jvm參數是在(Linux)/bin/ catalina.sh配置文件調整的。

 

3、禁用DNS查詢

在/conf/server.xml配置文件有許多DNS查詢的配置,盡量禁用,畢竟這些性能不能浪費。

 

4、線程池調整

Tomcat容器的線程池配置也是在/conf/server.xml里面配置的,具體的配置參數可以參考官網說明進行適當的調整。

 

5、HTTP協議的調整

Tomcat6.X支持的三種Connector的運行模式分別是

BIO

bio(blocking I/O),顧名思義,即阻塞式I/O操作,表示Tomcat使用的是傳統的Java I/O操作(即java.io包及其子包)。Tomcat在默認情況下,就是以bio模式運行的。遺憾的是,就一般而言,bio模式是三種運行模式中性能最低的一種。

NIO

nio(new I/O),是Java SE 1.4及后續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基於緩沖區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的並發運行性能。

APR

apr(Apache Portable Runtime/Apache可移植運行時),是Apache HTTP服務器的支持庫。你可以簡單地理解為,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,從而大大地提高Tomcat對靜態文件的處理性能。 Tomcat apr也是在Tomcat上運行高並發應用的首選模式。

 

通過以上介紹的得知各種模式的介紹,例如應用是SOA型應用,我想APR的作用不會很大,畢竟不是靜態文件服務器,還是建議了解清楚大概原理再具體問題具體分析使用。

 

6、壓錯傳輸

可以通過對/conf/server.xml的Connector進行配置,屬性為有:

compression="on"  //是否啟用壓縮 on為啟用(文本數據壓縮) off為不啟用, force 壓縮所有數據

compressionMinSize1="2048"  //當超過最小數據大小才進行壓縮

noCompressionUserAgents="gozilla, traviata"  //哪些客戶端發出的請求不壓縮,默認是不限制

compressableMimeType=“text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream” //配置想壓縮的數據類型

 

總結

對於以上提的四大點也算是Tomcat的一個基礎入門使用了解,可能還有所遺漏,后續補充。還是那句話,具體問題需要具體分析,畢竟工具在手上,如何用好也確實是一門技巧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM