本文主要包括tomcat服務(wù)器的web應(yīng)用部署和管理,以及server.xml
的主要配置蜕提。
1、manager應(yīng)用
tomcat本身內(nèi)置了兩個(gè)web應(yīng)用它浅,專門用來管理tomcat鄙麦,它們分別是host-manager(管理virtual host)和manager(管理web應(yīng)用)。
http://localhost:8080/host-manager/html
http://localhost:8080/manager/html
在啟動(dòng)tomcat之后镊折,我們?cè)L問上面的這兩個(gè)網(wǎng)址可以發(fā)現(xiàn)被403了胯府。因?yàn)槲覀冞€沒有在配置文件中增加相關(guān)的用戶,為了保證安全恨胚,這里的用戶默認(rèn)都是禁用的骂因,我們需要自己創(chuàng)建。
我們編輯tomcat目錄下的conf子目錄中的tomcat-users.xml
赃泡,添加對(duì)應(yīng)的配置即可:
<!--admin對(duì)應(yīng)的是host-manager的用戶-->
<!--allows access to the HTML GUI-->
<role rolename="admin-gui"/>
<!--allows access to the text interface-->
<role rolename="admin‐script"/>
<!--manager對(duì)應(yīng)的是manager的用戶-->
<!--allows access to the HTML GUI and the status pages-->
<role rolename="manager-gui"/>
<!--allows access to the text interface and the status pages-->
<role rolename="manager‐script"/>
<!--allows access to the JMX proxy and the status pages-->
<role rolename="manager-jmx"/>
<!--allows access to the status pages only-->
<role rolename="manager-status"/>
<!--我們這里添加一個(gè)用戶寒波,然后定義角色即可-->
<user username="tinychen" password="tinychen#321" roles="admin‐gui,manager-gui"/>
Users with the
admin-gui
role should not be granted theadmin-script
role.注意被授予
admin-gui
權(quán)限的用戶不應(yīng)該授予admin-script
權(quán)限Users with the
manager-gui
role should not be granted either themanager-script
ormanager-jmx
roles.注意被授予
manager-gui
權(quán)限的用戶不應(yīng)該授予manager-script
或manager-jmx
權(quán)限
tomcat9中默認(rèn)是只允許部署tomcat的機(jī)器訪問manger和host-manager的頁(yè)面的,因此我們需要修改tomcat目錄下對(duì)應(yīng)的web應(yīng)用的配置文件:
vim /home/tomcat9/webapps/host-manager/META-INF/context.xml
vim /home/tomcat9/webapps/manager/META-INF/context.xml
然后修改里面限制的IP地址為全部或者自己的IP地址即可升熊。
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)
|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
# 將allow參數(shù)改為
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="^.*$" />
然后我們就可以訪問web界面來查看tomcat服務(wù)器的運(yùn)行狀態(tài)了俄烁。
- manager的web界面
- host-manager的web界面
2、Tomcat的容器架構(gòu)
Tomcat設(shè)計(jì)了4種容器级野,分別是Engine页屠、Host、Context和Wrapper蓖柔。這4種容器是父子關(guān)系辰企, Tomcat通過一種分層的架構(gòu),使得Servlet容器具有很好的靈活性况鸣。
如上圖所示牢贸,我們可以看到:
- 一臺(tái)機(jī)器上可以通過設(shè)置不同的CATALINA_BASE來運(yùn)行多個(gè)tomcat實(shí)例,即可以運(yùn)行多個(gè)server
- 一個(gè)server中只有一個(gè)Engine镐捧,而Engine就是實(shí)現(xiàn)了servlet規(guī)范的引擎潜索,這里就是Catalina
- 一個(gè)engine中可以包含多個(gè)host,即和apache愤估、nginx等服務(wù)器相同帮辟,可以配置多個(gè)virtual host站點(diǎn)
- 一個(gè)host中可以包含多個(gè)context,即可以包含多個(gè)web應(yīng)用
- 一個(gè)warpper表示一個(gè)Servlet玩焰,wrapper 作為容器中的最底層由驹,不能包含子容器
Tomcat使用組合模式來管理這些容器,所有容器組件都實(shí)現(xiàn)了Container接口,因此組合模式可以使得用戶對(duì)單容器對(duì)象(最底層的Wrapper)和組合容器對(duì)象(Context蔓榄、Host或者Engine)的使用具有一致性并炮。
Tomcat 服務(wù)器的配置主要集中于 tomcat/conf
下的 catalina.policy
、 catalina.properties
甥郑、context.xml
逃魄、server.xml
、tomcat-users.xml
澜搅、web.xml
文件伍俘。
Tomcat的這一設(shè)計(jì)思想在其配置文件server.xml
中得到了很好的詮釋,server.xml
是tomcat 服務(wù)器的核心配置文件勉躺,包含了Tomcat的 Servlet 容器 (Catalina)的所有配置癌瘾。下面我們先來了解一下server.xml
文件中的一些主要配置。
3饵溅、server.xml
3.1 server.xml整體架構(gòu)
首先我們需要知道server.xml
中的xml代碼塊分類妨退,tomcat官網(wǎng)將其主要分為四類:
-
Top Level Elements:
server
塊是整個(gè)配置文件的根元素,而service
塊代表與引擎關(guān)聯(lián)的一組連接器(connector)蜕企。 - Connectors :表示外部客戶端向特定服務(wù)發(fā)送請(qǐng)求和接收響應(yīng)的接口(比如我們之前提到的coyote連接器以及對(duì)應(yīng)的NIO等IO模式都是整個(gè)范疇內(nèi)的概念)咬荷。
-
Containers:容器(
Container
)負(fù)責(zé)處理傳入的請(qǐng)求并創(chuàng)建相應(yīng)的響應(yīng)。Engine
處理對(duì)Service的所有請(qǐng)求轻掩,Host
處理對(duì)特定virtual host
的所有請(qǐng)求幸乒,而Context
處理對(duì)特定Web應(yīng)用程序的所有請(qǐng)求。 -
Nested Components:表示可以嵌套在
Container
元素內(nèi)的元素放典。 注意一些元素可以嵌套在任何Container中逝变,而另一些元素只能嵌套在Context
中基茵。
3.2 Top Level Elements
3.2.1 Server塊
Server塊代表的是整個(gè)catalina servlet容器奋构。因此,它必須是conf/server.xml
配置文件中最外面的單個(gè)元素拱层。它的屬性代表了整個(gè)servlet容器的特征弥臼。Tomcat9中默認(rèn)的配置文件中Server
塊內(nèi)嵌的子元素為 Listener
、GlobalNamingResources
根灯、Service
(可以嵌套多個(gè))径缅。具體的每個(gè)屬性參數(shù)我們可以查詢官網(wǎng),下面解釋默認(rèn)的參數(shù)配置烙肺。
<Server port="8005" shutdown="SHUTDOWN">
<!--
port : Tomcat監(jiān)聽的關(guān)閉服務(wù)器的端口
shutdown : 關(guān)閉服務(wù)器的指令字符串
-->
<!-- 以日志形式輸出服務(wù)器纳猪、操作系統(tǒng)、JVM的版本信息 -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- 啟動(dòng)和停止APR桃笙。如果找不到APR庫(kù)會(huì)輸出日志但并不影響tomcat正常啟動(dòng) -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
<!--
注意這里的SSLEngine默認(rèn)是打開的(on)
如果啟用了apr作為連接器的協(xié)議
但是只配置了http而沒有配置https
則會(huì)報(bào)錯(cuò)
-->
<!-- 用于避免JRE內(nèi)存泄漏問題 -->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<!-- 用戶加載(服務(wù)器啟動(dòng))和銷毀(服務(wù)器停止)全局命名服務(wù) -->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<!-- 用于在Context停止時(shí)重建Executor池中的線程氏堤, 以避免ThreadLocal相關(guān)的內(nèi)
存泄漏 -->
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- GlobalNamingResources中定義了全局命名服務(wù): -->
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
<!--這里定義的文件就是我們前面配置manager和host manager的用戶的文件-->
</GlobalNamingResources>
<Service>
...
</Service>
</Server>
3.2.2 Service塊
Service元素用于創(chuàng)建 Service 實(shí)例,默認(rèn)使用 org.apache.catalina.core.StandardService
搏明。 默認(rèn)情況下鼠锈,Tomcat9中默認(rèn)僅指定了Service的名稱為Catalina
闪檬。
<Service name="Catalina">
...
</Service>
Service
可以內(nèi)嵌的元素為 : Listener
、Executor
购笆、Connector
粗悯、Engine
,詳細(xì)的參數(shù)可以點(diǎn)擊這里查看官網(wǎng)
-
Listener
用于為Service
添加生命周期監(jiān)聽器 -
Executor
用于配置Service
共享線程池 -
Connector
用于配置Service
包含的鏈接器 -
Engine
用于配置Service
中連接器(connector
)對(duì)應(yīng)的Servlet 容器引擎
3.3 Executor
executor
表示可組件之間Tomcat中共享的線程池同欠。默認(rèn)情況下样傍,Service
并未添加共享線程池配置。executor
實(shí)現(xiàn)了tomcat中的org.apache.catalina.Executor
接口铺遂。 如果不配置共享線程池铭乾,那么Catalina 各組件在用到線程池時(shí)會(huì)獨(dú)立創(chuàng)建。由于executor
是Service
元素的嵌套元素娃循。為了使它能夠被Connector
使用炕檩,Executor
元素必須出現(xiàn)在server.xml
中的Connector
元素之前。下面展示的是一個(gè)簡(jiǎn)單的executor的配置捌斧,具體的配置參數(shù)可以點(diǎn)這里查看官網(wǎng):
<Executor name="tomcatThreadPool"
namePrefix="catalina‐exec‐"
maxThreads="200"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor"/>
屬性 | 含義 |
---|---|
name | 線程池名稱笛质,用于Connector 中指定。 |
namePrefix | 所創(chuàng)建的每個(gè)線程的名稱前綴捞蚂,一個(gè)單獨(dú)的線程名稱為 namePrefix +threadNumber 妇押。 |
daemon | 是否作為守護(hù)線程(類似于守護(hù)進(jìn)程),默認(rèn)為true |
maxThreads | 線程池中最大線程數(shù)姓迅。 |
minSpareThreads | 活躍線程數(shù)敲霍,也就是核心池線程數(shù),這些線程不會(huì)被銷毀丁存,會(huì)一直存在肩杈。 |
maxIdleTime | 線程空閑時(shí)間,超過該時(shí)間后解寝,空閑線程會(huì)被銷毀扩然,默 認(rèn)值為6000(1分鐘),單位毫秒聋伦。 |
maxQueueSize | 在被執(zhí)行前最大線程排隊(duì)數(shù)目夫偶,默認(rèn)為int 的最大值,也就是廣義的無限觉增。除非特殊情況兵拢,這個(gè)值不需要更改, 否則會(huì)有請(qǐng)求不會(huì)被處理的情況發(fā)生逾礁。 |
prestartminSpareThreads | 啟動(dòng)線程池時(shí)是否啟動(dòng) minSpareThreads 部分線程说铃。 默認(rèn)值為false ,即不啟動(dòng)。 |
threadPriority | 線程池中線程優(yōu)先級(jí)截汪,默認(rèn)值為5疾牲,值從1到10。 |
className | 線程池實(shí)現(xiàn)類衙解,未指定情況下阳柔,默認(rèn)實(shí)現(xiàn)類為 org.apache.catalina.core.StandardThreadExecutor 。 如果想使用自定義線程池首先需要實(shí)現(xiàn) org.apache.catalina.Executor 接口蚓峦。 |
3.4 Connector
Connector 用于創(chuàng)建鏈接器實(shí)例舌剂。默認(rèn)情況下,server.xml 配置了兩個(gè)鏈接器暑椰,一個(gè)支 持HTTP協(xié)議霍转,一個(gè)支持AJP協(xié)議。因此大多數(shù)情況下一汽,我們并不需要新增鏈接器配置避消, 只是根據(jù)需要對(duì)已有鏈接器進(jìn)行優(yōu)化。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-
port
為監(jiān)聽的端口召夹,如果設(shè)置為0岩喷,Tomcat將會(huì)隨機(jī)選擇一個(gè)可用的端口號(hào)給當(dāng)前Connector 使用 -
protocol
為Connector的協(xié)議,這里默認(rèn)的是HTTP和AJP兩種協(xié)議监憎,后面可以指定對(duì)應(yīng)協(xié)議的不同版本纱意,默認(rèn)情況下會(huì)檢測(cè)本機(jī)是否配置了APR庫(kù),如果有并且useAprConnector
設(shè)置為true則會(huì)默認(rèn)使用APR模式的IO協(xié)議鲸阔,如果無則會(huì)使用NIO模式 -
connectionTimeOut
:Connector 接收鏈接后的等待超時(shí)時(shí)間偷霉,單位為毫秒。 -1表示永不超時(shí) -
redirectPort
:當(dāng)前Connector 不支持SSL請(qǐng)求褐筛, 接收到了一個(gè)請(qǐng)求类少, 并且也符合 security-constraint 約束, 需要SSL傳輸死讹,Catalina自動(dòng)將請(qǐng)求重定向到指定的端口 -
executor
: 指定前面提到的共享線程池的名稱瞒滴,也可以通過maxThreads曲梗、minSpareThreads 等屬性對(duì)該connector進(jìn)行單獨(dú)配置對(duì)應(yīng)的內(nèi)部線程池 -
URIEncoding
: 用于指定編碼URI的字符編碼赞警, Tomcat8.x和Tomcat9.x版本默認(rèn)的編碼為 UTF-8 , Tomcat7.x版本默認(rèn)為ISO-8859-1
3.5 engine
Engine 作為Servlet 引擎的頂級(jí)元素,內(nèi)部可以嵌入: Cluster虏两、Listener愧旦、Realm、 Valve和Host定罢。
<Engine name="Catalina" defaultHost="localhost">
……
</Engine>
-
name
:用于指定Engine 的名稱笤虫, 默認(rèn)為Catalina -
defaultHost
:默認(rèn)使用的虛擬主機(jī)名稱,當(dāng)客戶端請(qǐng)求訪問的host無效時(shí),會(huì)跳轉(zhuǎn)到默認(rèn)的host來處理請(qǐng)求
3.6 Host
Host 元素用于配置一個(gè)虛擬主機(jī)琼蚯,它支持以下嵌入元素:Alias酬凳、Cluster、Listener遭庶、 Valve宁仔、Realm、Context
如果在Engine下配置Realm峦睡,那么此配置將在當(dāng)前Engine下的所有Host中共享翎苫。 同樣,如果在Host中配置Realm 榨了,則在當(dāng)前Host下的所有Context 中共享
Context中的Realm優(yōu)先級(jí) > Host的Realm優(yōu)先級(jí) > Engine中的Realm優(yōu)先級(jí)
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Alias>www.example.com</Alias>
<Alias>www.example2.com</Alias>
</Host>
上面這一段Host的配置文件中還額外添加了Valve配置來實(shí)現(xiàn)自定義的日志記錄煎谍。其中一些參數(shù)的詳細(xì)信息和配置方式可以查看官網(wǎng)的說明
。The shorthand pattern
pattern="common"
corresponds to the Common Log Format defined by '%h %l %u %t "%r" %s %b'.
- name: 當(dāng)前Host通用的網(wǎng)絡(luò)名稱龙屉,也就是常用的域名呐粘,如果有多個(gè)域名對(duì)應(yīng)同一個(gè)Host的應(yīng)用,我們可以設(shè)置一個(gè)或多個(gè)Alias來實(shí)現(xiàn)訪問
- appBase:當(dāng)前Host應(yīng)用對(duì)應(yīng)的目錄转捕,當(dāng)前Host上部署的Web應(yīng)用均在該目錄下(相對(duì)路徑和絕對(duì)路徑均可)事哭,默認(rèn)為webapps
- unpackWARs:設(shè)置為true,Host在啟動(dòng)時(shí)會(huì)將appBase目錄下war包解壓為目 錄瓜富。設(shè)置為false鳍咱,Host將直接從war文件啟動(dòng)
- autoDeploy: 控制tomcat是否在運(yùn)行時(shí)定期檢測(cè)并自動(dòng)部署新增或變更的web應(yīng)用
3.7 Context
Context的完整配置官網(wǎng)文檔,Context 用于配置一個(gè)Web應(yīng)用与柑,默認(rèn)的配置如下谤辜。它支持的內(nèi)嵌元素為:CookieProcessor,Loader价捧,Manager丑念,Realm,Resources结蟋,WatchedResource脯倚,JarScanner,Valve嵌屎。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="myAppDeploy" path="/myApp">
....
</Context>
</Host>
- docBase:Web應(yīng)用目錄或者War包的部署路徑推正。可以是絕對(duì)路徑宝惰,也可以是相對(duì)于該Context所屬的Host中的
appBase
的相對(duì)路徑植榕。 - path:Web應(yīng)用的Context的訪問路徑。
假設(shè)tomcat的安裝目錄為/home/tomcat9
尼夺,Host為默認(rèn)的localhost尊残, 則該web應(yīng)用訪問的根路徑為: http://localhost:8080/myApp
炒瘸,對(duì)應(yīng)的部署文件所存放的路徑為:/home/tomcat9/webapps/myAppDeploy