Tomcat篇04-部署和管理

image

本文主要包括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 the admin-script role.

注意被授予admin-gui權(quán)限的用戶不應(yīng)該授予admin-script權(quán)限

Users with the manager-gui role should not be granted either the manager-script or manager-jmx roles.

注意被授予manager-gui權(quán)限的用戶不應(yīng)該授予manager-scriptmanager-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界面
image
  • host-manager的web界面
image

2、Tomcat的容器架構(gòu)

Tomcat設(shè)計(jì)了4種容器级野,分別是Engine页屠、Host、Context和Wrapper蓖柔。這4種容器是父子關(guān)系辰企, Tomcat通過一種分層的架構(gòu),使得Servlet容器具有很好的靈活性况鸣。

image

如上圖所示牢贸,我們可以看到:

  • 一臺(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.policycatalina.properties甥郑、context.xml逃魄、server.xmltomcat-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 Elementsserver塊是整個(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)嵌的子元素為 ListenerGlobalNamingResources根灯、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)嵌的元素為 : ListenerExecutor购笆、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)建。由于executorService元素的嵌套元素娃循。為了使它能夠被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 &quot;%r&quot; %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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寝衫,隨后出現(xiàn)的幾起案子顷扩,更是在濱河造成了極大的恐慌,老刑警劉巖慰毅,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屎即,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡事富,警方通過查閱死者的電腦和手機(jī)技俐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來统台,“玉大人雕擂,你說我怎么就攤上這事〖” “怎么了井赌?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贵扰。 經(jīng)常有香客問我仇穗,道長(zhǎng),這世上最難降的妖魔是什么戚绕? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任纹坐,我火速辦了婚禮,結(jié)果婚禮上舞丛,老公的妹妹穿的比我還像新娘耘子。我一直安慰自己,他們只是感情好球切,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布谷誓。 她就那樣靜靜地躺著,像睡著了一般吨凑。 火紅的嫁衣襯著肌膚如雪捍歪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天鸵钝,我揣著相機(jī)與錄音糙臼,去河邊找鬼。 笑死蒋伦,一個(gè)胖子當(dāng)著我的面吹牛弓摘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痕届,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼韧献,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了研叫?” 一聲冷哼從身側(cè)響起锤窑,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚷炉,沒想到半個(gè)月后渊啰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡申屹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年绘证,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哗讥。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚷那,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杆煞,到底是詐尸還是另有隱情魏宽,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布决乎,位于F島的核電站队询,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏构诚。R本人自食惡果不足惜蚌斩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望范嘱。 院中可真熱鬧凳寺,春花似錦、人聲如沸彤侍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盏阶。三九已至晒奕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間名斟,已是汗流浹背脑慧。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砰盐,地道東北人闷袒。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像岩梳,于是被迫代替她去往敵國(guó)和親囊骤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晃择,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容