Tomcat基礎詳解
組件原理圖如下:
任何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"> <Listener className="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener"/> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
全局命名資源,方便全局引用,所以為其起完名稱後可以隨便調用的
<GlobalNamingResources> <Resource name="UserDatabase"auth="Container" type="org.apache.catalina.UserDatabase" description="User databasethat can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> #其調用tomcat-user.xml配置文件進行用戶認證 </GlobalNamingResources>
服務類組件配置信息,將連接器關聯至引擎上
<Servicename="Catalina"> <Connector port="8080" protocol="HTTP/1.1" #所在監聽端口,以及協議版本號 connectionTimeout="20000" #連接超時時間,單位毫秒 redirectPort="8443" /> #必要的時候可以做重定向,定義在8443 <Connector port="8443"protocol="HTTP/1.1" SSLEnabled="true" #端口監聽在8443,協議http1.1 maxThreads="150" scheme="https" secure="true" #最大線程,協議版本,安全的 clientAuth="false" sslProtocol="TLS" /> #不驗證客戶端 ssl協議用的是tls <Connector port="8009" protocol="AJP/1.3"redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> #引擎,名為catalina <RealmclassName="org.apache.catalina.realm.LockOutRealm"> <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="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 "%r" %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連接器:
<Connector port="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連接器:
<Connector port="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,添加如下行:
<role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="standard"/> <user username="tomcat" password="secret" roles="manager-gui,manager-script,standard"/>
啟用host-manager和server status功能:
<role rolename="admin-gui"/> <user username="tomcat" password="s3cret" roles="admin-gui"/>
而後重啟tomcat。
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
Tomcat基礎詳解