1. 程式人生 > 實用技巧 >Tomcat基礎詳解

Tomcat基礎詳解

Tomcat基礎詳解

元件原理圖如下:

blob.png

任何tomcat例項就是一個server,而一個server內部要想能夠解析jsp頁面轉義編譯serlet程式,要靠其引擎來實現

而引擎才是真正意義上執行jsp程式碼的容器,都是tomcat用類來描述這些元件的

同時,為了接受使用者的請求,需要基於connector元件,所謂監聽的套接字的程式,能夠接手使用者的請求,被稱為聯結器

一個server內部可以完全執行N個引擎,無非就是執行多個虛擬機器而已

war包的概念

放在網頁目錄可以直接訪問,而部署的時候可以自動將其展開裝載,而這是部署本身所完成的工作

在實現web站點的時候,在出程式之下有目錄比如/web/htdoc,而在其目錄下有一子目錄/web/htdoc/bbs 而在其下有個論壇程式

這個目錄程式跟其他程式可能不在同一組,而新加的子目錄則需要重新部署,因為其屬於獨立的應用程式,因為每個獨立程式都需要獨立部署

對於tomcat來講每一個host內部還有一子元件,叫做conntest,其作用是為了實現程式的獨立部署

對於tomcat來講要想記錄日誌的話,因此這些都需要使用特殊介面來實現,所以,任何一個需要操作硬體資源的程序,資源都有一個類在實現我們的需求,tomcat也一樣。

常見元件

1.伺服器(server)

例項,通常一個jvm只能包含一個例項,一般情況下,一個物理伺服器可以啟動多個jvm,從而啟動多個例項,但一般不這麼做

2.服務(service)

一個服務元件通常包含一個引擎和此引擎相關聯的一個或多個連結伺服器

3.聯結器(connectors)

一個引擎能配置多個聯結器 但是每個聯結器的埠不能衝突

同時,tomcat也支援AJP JSERV和JK2聯結器,實現讓apache反向代理到後端伺服器的非常高效的傳輸協議

容器類元件

4.引擎

可以自己接收使用者的http請求,並構建響應報文,而且可以在內部處理java程式的整個套間

5.主機

6.上下文

被巢狀類元件

7.閥門

能夠過濾也可以做訪問控制

8.日誌記錄器

9.領域(Realm)

用來實現使用者的認證和授權

對tomcat來講,每種模型上的實現必須開發一種程式,才能完成相應元件的功能,而java中任何程式都是一個類


Tomcat安裝

檢視檔案:

# cat /usr/local/tomcat/conf/server.xml

Listener為偵聽器,通常實現tomcat內部進行通訊的,可在各元件之間完成通訊

<Serverport="8005"shutdown="SHUTDOWN">
<ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on"/>
<ListenerclassName="org.apache.catalina.core.JasperListener"/>
<ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<ListenerclassName="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>


全域性命名資源,方便全域性引用,所以為其起完名稱後可以隨便呼叫的

<GlobalNamingResources>
<Resourcename="UserDatabase"auth="Container"
type="org.apache.catalina.UserDatabase"
description="Userdatabasethatcanbeupdatedandsaved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml"/>#其呼叫tomcat-user.xml配置檔案進行使用者認證
</GlobalNamingResources>


服務類元件配置資訊,將聯結器關聯至引擎上

<Servicename="Catalina">
<Connectorport="8080"protocol="HTTP/1.1"#所在監聽埠,以及協議版本號
connectionTimeout="20000"#連線超時時間,單位毫秒
redirectPort="8443"/>#必要的時候可以做重定向,定義在8443
<Connectorport="8443"protocol="HTTP/1.1"SSLEnabled="true"#埠監聽在8443,協議http1.1
maxThreads="150"scheme="https"secure="true"#最大執行緒,協議版本,安全的
clientAuth="false"sslProtocol="TLS"/>#不驗證客戶端ssl協議用的是tls

<Connectorport="8009"protocol="AJP/1.3"redirectPort="8443"/>

<Enginename="Catalina"defaultHost="localhost">#引擎,名為catalina
<RealmclassName="org.apache.catalina.realm.LockOutRealm">
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/></Realm>
<Hostname="localhost"appBase="webapps"#應用程式存放的位置,相對路徑
unpackWARs="true"autoDeploy="true">#如果是war檔案格式,是否解壓,是否自動部署

#定義閥門,java中類的記錄方式,當前所處域名反過來寫的記錄方式
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log."suffix=".txt"#日誌的命名suffix表示時間戳
pattern="%h%l%u%t&quot;%r&quot;%s%b"/>#訪問日誌的格式
</Host>
</Engine>
</Service>
</Server>



Connector元件:

進入Tomcat的請求可以根據Tomcat的工作模式分為如下兩類:

Tomcat作為應用程式伺服器:請求來自於前端的web伺服器,這可能是Apache, IIS, Nginx等;

Tomcat作為獨立伺服器:請求來自於web瀏覽器;

Tomcat應該考慮工作情形併為相應情形下的請求分別定義好需要的聯結器才能正確接收來自於客戶端的請求。一個引擎可以有一個或多個聯結器,以適應多種請求方式。


聯結器型別:

定義聯結器可以使用多種屬性,有些屬性也只適用於某特定的聯結器型別。一般說來,常見於server.xml中的聯結器型別通常有4種:

1) HTTP聯結器

2) SSL聯結器

3) AJP 1.3聯結器

4) proxy聯結器


HTTP聯結器:

如上面示例server.xml中定義的HTTP聯結器:

<Connectorport="8080"protocol="HTTP/1.1"
maxThreads="150"connectionTimeout="20000"
redirectPort="8443"/>

AJP聯結器:

定義聯結器時可以配置的屬性非常多,但通常定義HTTP聯結器時必須定義的屬性只有“port”,定義AJP聯結器時必須定義的屬性只有"protocol",因為預設的協議為HTTP。以下為常用屬性的說明:

1) address:指定聯結器監聽的地址,預設為所有地址,即0.0.0.0;

2) maxThreads:支援的最大併發連線數,預設為200;

3) port:監聽的埠,預設為0;

4) protocol:聯結器使用的協議,預設為HTTP/1.1,定義AJP協議時通常為AJP/1.3;

5) redirectPort:如果某聯結器支援的協議是HTTP,當接收客戶端發來的HTTPS請求時,則轉發至此屬性定義的埠;

6) connectionTimeout:等待客戶端傳送請求的超時時間,單位為毫秒,預設為60000,即1分鐘;

7) enableLookups:是否通過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;預設為true;

8) acceptCount:設定等待佇列的最大長度;通常在tomcat所有處理執行緒均處於繁忙狀態時,新發來的請求將被放置於等待佇列中;


HTTPS聯結器:

下面是一個定義了多個屬性的SSL聯結器:

<Connectorport="8443"
maxThreads="150"minSpareThreads="25"maxSpareThreads="75"
enableLookups="false"acceptCount="100"debug="0"scheme="https"secure="true"
clientAuth="false"sslProtocol="TLS"/>


啟用manager功能:

編輯tomcat-user.xml,新增如下行:

<rolerolename="manager-gui"/>
<rolerolename="manager-script"/>
<rolerolename="standard"/>
<userusername="tomcat"password="secret"roles="manager-gui,manager-script,standard"/>


啟用host-manager和server status功能:

<rolerolename="admin-gui"/>
<userusername="tomcat"password="s3cret"roles="admin-gui"/>

而後重啟tomcat。

blob.png


Manager的四個管理角色:

manager-gui - allows access to the HTML GUI and the status pages

manager-script - allows access to the text interface and the status pages

manager-jmx - allows access to the JMX proxy and the status pages

manager-status - allows access to the status pages only


轉載於:https://blog.51cto.com/lidongfeng/2063680