Tomcat是基於JAVA開發的一個web容器,下面我們首先了解一下Java。
一、Java的組成
java由4部分組成:
1、java編程語言
2、java類文件
3、java API
4、java虛擬機(jvm)
java編程語言和java API生成.java文件,.java文件通過編譯成爲.class類文件和別的類文件一起通過類加載器在jvm中運行
JRE和JDK
JRE: Java Runtime Environment
JDK:Java Development Kit
JRE顧名思義是java運行時環境,包含了java虛擬機,java基礎類庫。是使用java語言編寫的程序運行所需要的軟件環境,是提供給想運行java程序的用戶使用的。
JDK顧名思義是java開發工具包,是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac,還包含了很多java程序調試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。
J2SE、J2EE和J2ME
針對企業網應用的J2EE(Java 2Enterprise Edition)、針對普通PC應用的J2SE(Java 2 StandardEdition)和針對嵌入式設備及消費類電器的J2ME(Java 2 MicroEdition)三個版本
Java運行時的區域
方法區:線程共享;用於存儲被虛擬加載的類信息、常量、靜態變量等;永久代;
堆:Java堆是jvm所管理的內存中最大的一部分;也是GC管理的主要區域,主流的算法都基於分代收集方式進行:新生代和老年代;線程共享
Java棧:線程私有,存放線程自己的局部變量等信息;
PC寄存器(Program Counter Register),線程獨佔的內存空間;
本地方法棧
Servlet和JSP
當Web服務器(或Servlet引擎,應用服務器)支持JSP引擎時,JSP引擎會照着JSP的語法,將JSP文件轉換成Servlet代碼源文件,接着Servlet會被編譯成Java可執行字節碼(bytecode),並以一般的Servlet方式載入執行
二、Tomcat
Tomcat就是一個Java EE的不完整實現,是一個web容器,也可以稱爲web服務器。它只使用了Java EE附帶的兩個類庫-----Servlet與JSP。
1、架構
核心架構:
server:爲頂級容器,管理多個service的接口。
service:由一個container和多個connector組成,由server進行管理
connector:connector和container通過service交互
container???
一個或者多個Container 可以對應一個Connector,這樣就組成了一個Service,Service生命週期的由Server進行管理
<Server> #頂層元素,代表一個服務器 <Service> #頂層元素,是Connector的集合,只有一個Engine <Connector/> #連接器類元素,代表通信接口 <Engine> #容器類元素,爲特定的Service組件處理所有客戶請求,可包含多個Host <Host> #爲特定的虛擬主機處理所有客戶請求 <Context> #爲特定的WEB應用處理所有客戶請求 </Context> </Host> </Engine> </Service> </Server>
頂級組件:
服務器(server):Tomcat的一個實例,通常一個JVM只能包含一個Tomcat實例;因此,一臺服務器上可以在啓動多個JVM的情況下每一個JVM中啓動一個Tomcat實例,每個實例分屬於一個獨立管理端口。這是一個頂級組件
服務(service):一個服務組件通常包含一個引擎和此引擎相關聯的一個或多個連接器。給服務命名可以方便管理員在日誌文件中識別不同服務產生的日誌。一個server可以包含多個service組件,但通常情況下只爲一個service指派一個server
連接器類組件:
連接器(connectors):負責連接客戶端(可以是瀏覽器或web服務器)請求至Servlet容器內的web應用程序,通常指的是接受客戶發來請求的位置及服務器段分配的端口。默認端口通常是HTTP協議的8080,管理員可以根據自己的需要改變此端口。一個引擎可以連接多個連接器,但這些連接器必須使用不同的端口。默認的連接器是HTTP/1.1的Coyote,同時Tomcat也支持AJP、JServ和JK2連機器。
容器類組件:
引擎(Engine):通常指Cataliana Servlet引擎,它檢查每一個請求的HTTP首部信息辨別此請求應該發往到哪個host或context,並將請求處理後的結果發送給客戶端。一個引擎可以包含多個主機組件。
主機(Host):位於Engine容器中用於接收請求並進行相應處理的主機或虛擬主機,類似於Apache的虛擬主機,但Tomcat只支持基於FQDN的虛擬主機。至少一個主機組件。
上下文(Context):Context組件式最內層組件,代表Web應用程序本身。配置一個Context最主要的就是指定Web應用程序的根目錄,一遍Servlet容器能將用戶請求發往正確的位置。Context組件也可以定義包含錯誤頁,實現用戶訪問發生錯誤時提供友好的提示信息。類似apache中的alias別名。
被嵌套類組件:
閥門(valve):可以定義在任何容器類的組件中,用來記錄客戶端請求/客戶端IP地址和服務器等信息。
日誌記錄器(logger):可以用於除Context之外的任何容器中。記錄日誌
領域(Realm):一個Realm表示一個安全上下文,它是一個授權訪問某個給定Context的用戶列表和某用戶所允許切換的角色相關定義的列表。因此,Realm就像是一個用戶和組相關的數據庫。定義Realm時惟一必須要提供的屬性是classname,它是Realm的多個不同實現,用於表示此Realm認證的用戶及角色等認證信息的存放位置。
2、配置文件及參數說明
Tomcat的配置文件:
server.xml:主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關配置信息
context.xml:每個webapp都可以有專用的配置文件,這些配置文件通常位於webapp應用程序自己的目錄下的WEB-INF目錄中;此context.xml爲每個webapp提供默認配置;
web.xml:每個webapp只有在“部署”後才能被訪問,此文件則用於爲各webapps定義默認的部署方式;遵循Servlet規範標準的配置文件,用於配置servlet,併爲所有的Web應用程序提供包括MIME映射等默認配置信息
tomcat-users.xml:用戶認證的帳號和密碼文件;
catalina.policy:當使用-security選項來啓動tomcat實例時,會讀取此配置文件來實現基於安全策略的運行方式;
catalina.properties:java屬性的定義文件,用於設定類加載器路徑,以及一些與JVM調優相關的參數等;
logging.propeties:日誌系統相關的配置;
元素名 | 屬性 | 解釋 |
Server | className | 這個類必須是org.apache.catalina.Server的實現類,如果沒有指定類名,則使用標準實現。 |
address | 這是等待關閉命令的TCP/IP地址,如果沒有指定,默認使用localhost。 | |
port | 這個端口是用於接收關閉服務的端口,可以設置爲-1來禁用。 | |
shutdown | 這個命令字符串必須通過TCP/IP端口接收,才能關閉Tomcat。 | |
Service | className | 這個類必須是org.apache.catalina.Service的實現類。 |
name | Service的展示名稱,如果使用標準的Catalina組件,這個名稱會包含在日誌信息中。同一個Server下的每個Service的名稱必須唯一。 | |
Connector | allowTrace | 是否允許TRACE HTTP方法,默認false。 |
asyncTimeout | 異步請求超時時間,單位毫秒,默認10000ms(10秒)。 | |
enableLookups | 如果想使用request.getRemoteHost()方法通過DNS查找遠程請求客戶端的真實的主機名,則設置爲true。設置爲false會跳過DNS查找,直接返回IP地址。DNS查找默認禁用。 | |
maxHeaderCount | 一個請求允許最大的請求頭數量。如果超出限制請求會被拒絕。如果爲負值,無限制。默認值100。 | |
maxParameterCount | GET和POST請求的參數(和值)的最大數量,超出的參數會被忽略。如果是0或者小於0,表示無限制。默認爲10000。 | |
maxPostSize | POST請求的最大字節數。如果爲負,無限制。默認2097152字節(即2Mb)。 | |
maxSavePostSize | POST請求的最大保存/緩衝字節數。-1表示無限制,0表示禁用保存/緩衝,默認爲4096字節(4Kb)。 | |
port | TCP端口,用於創建Server socket並等待進入連接。操作系統允許1個服務器監聽1個IP的1個指定端口。如果值爲0,Tomcat會爲這個Connector選擇一個隨機的空閒端口。 | |
protocol | 通信協議。默認爲HTTP/1.1,這個協議使用自動切換機制來選擇阻塞式基於Java的Connector或者基於APR/native的Connector。如果要使用明確的協議,而不是自動切換機制選擇的協議,可以選擇下面的值:
| |
proxyName | 如果當前Connector使用代理配置,使用這個屬性指定Server名稱。這個Server名稱,可以調用request.getServerName()方法返回。 | |
proxyPort | 指定代理的Server端口。 | |
redirectPort | 如果當前Connector不支持SSL請求,但是收到的請求匹配web.xml中配置的security-constraint選項,要求使用SSL端口,那麼Catalina會自動把請求轉發到這個指定端口。 | |
scheme | 給當前協議設置一個名字,這樣可以通過request.getScheme()方法獲得協議名詞,比如給SSL協議取名HTTPS。默認值爲http。URIEncoding:字符編碼。用於URI字節解碼,和URL %xx部分數據的解碼。默認爲ISO-8859-1。 | |
useIPVHosts | 將該屬性設置爲true會導致Tomcat使用收到請求的IP地址,來決定將請求發送到哪個主機。默認false。 | |
acceptCount | 當所有的可用線程都在使用中,傳入連接請求隊列的最大長度。當隊列滿時,任何請求都會被拒絕。默認100。 | |
address | 如果服務器有多個IP,這個屬性指定使用哪個IP地址用於監聽端口。默認使用與服務器關聯的全部IP地址。 | |
compressableMimeType | HTTP壓縮的元數據類型,參數可以使用逗號間隔。默認爲text/html,text/xml,text/plain,text/css,text/javascript,application/javascript。 | |
compression | 爲了節省服務器帶寬,Connector可以使用HTTP/1.1 GZIP壓縮。
| |
compressionMinSize | 當compression設置爲on,指定壓縮前的最小數據量。默認爲2048。 | |
connectionTimeout | 連接超時時間。-1表示無限制。默認值60000ms(60秒)。但server.xml默認配置爲20000。 | |
disableUploadTimeout | 是否禁用上傳超時時間,開啓後,上傳數據的連接使用單獨的超時時間。 | |
connectionUploadTimeout | 上傳數據時,連接超時時間。 | |
executor | 指向Executor元素的引用。如果設置了這個元屬性,並且對應的Executor存在,Connector將使用這個Executor,而其他所有線程相關屬性將被忽略。如果未指定此屬性,Connector會使用一個私有的、內部Executor來提供線程池。 | |
executorTerminationTimeoutMillis | 在關閉Connector之前,那個私有的、內部Executor等待請求處理線程的終結的超時時間。BIO Connector默認值爲0ms。NIO和APR/native Connector默認值爲5000ms。 | |
keepAliveTimeout | 長連接超時時間。Connector在關閉連接之前,會等待另一個HTTP請求的時間。默認值是connectionTimeout的屬性值。-1無超時時間。 | |
maxKeepAliveRequests | HTTP請求最大長連接數量。如果值爲1,禁用長連接。設爲-1,無限制。默認值爲100。 | |
maxConnections | 在任何給定的時間服務器接收並處理的最大連接數。當這個數字已經達到了,服務器將不會接受任何連接,直到連接的數量降到低於此值。基於acceptCount,操作系統可能仍然接收連接。 | |
maxHttpHeaderSize | 請求頭和響應頭的最大字節數。默認8192(8Kb) | |
maxThreads | 最多同時處理的請求的最大線程數量,這決定了同時處理請求的最大數量。默認200。 | |
minSpareThreads | 最小空閒線程數量。默認10。 | |
socketBuffer | Socket輸出緩衝區大小。單位字節。-1表示禁用緩衝區。默認值9000字節。 | |
SSLEnabled | 是否開啓SSL加密傳輸。需要配置secure和scheme屬性。 | |
Context | cookies | 是否使用cookie,可以通過cookie鑑別session。默認true。設置爲false,則無法使用cookie完成session鑑證,然後必須依賴於URL重寫。 |
docBase | 應用程序文件的根目錄。如果應用程序不在Host元素的appBase路徑下,需要設置此屬性。 | |
path | 應用程序的訪問路徑(context path)。 | |
reloadable | 自動重新加載class和jar文件。設置爲true,Catalina會監視/WEB-INF/classes/ 和/WEB-INF/lib目錄下的變動,如果檢測到變動就會自動重新加載應用程序。此功能非常有用但是不建議在生產環境使用。 | |
Engine | defaultHost | 默認的主機名,它必須指向一個Host元素的name屬性。 |
name | Engine的邏輯名稱,用於日誌和錯誤信息。如果在一個Server中使用多個Service元素,每個Engine必須使用唯一的名稱。 | |
jvmRoute | 在負載均衡場景中使用,用以實現會話黏性,此標識在參與集羣的所有節點上必須唯一; | |
Host | appBase | 此Host的webapps目錄,即存放非歸檔的web應用程序的目錄或歸檔後的WAR文件的目錄路徑;可以使用基於$CATALINA_HOME的相對路徑; |
name | 一般是虛擬主機註冊到DNS的網絡名稱。必須有一個Host的name作爲Engine的defaultHost。 | |
autoDelploy | 在Tomcat處於運行狀態時放置於appBase目錄中的應用程序文件是否自動進行deploy;默認爲true; | |
unpackWars | 在啓動此webapps時是否對WAR格式的文檔文件先進行展開;默認爲true; | |
Realm | JAASRealm | 基於Java Authintication and Authorization Service實現用戶認證; |
JDBCRealm | 通過JDBC訪問某關係型數據庫表實現用戶認證; | |
JNDIRealm | 基於JNDI使用目錄服務實現認證信息的獲取; | |
MemoryRealm | 查找tomcat-user.xml文件實現用戶信息的獲取; | |
UserDatabaseRealm | 基於UserDatabase文件(通常是tomcat-user.xml)實現用戶認證,它實現是一個完全可更新和持久有效的MemoryRealm,因此能夠跟標準的MemoryRealm兼容;它通過JNDI實現; | |
Valve | AccessLogValve | 訪問日誌Value; |
ExtendedAccessValve | 擴展功能的訪問日誌Valve; | |
JDBCAccessLogValve | 通過JDBC將訪問日誌信息發送到數據庫中; | |
RequestDumperValve | 請求轉儲Valve; | |
RemoteAddrValve | 基於遠程地址的訪問控制; | |
RemoteHostValve | 基於遠程主機名稱的訪問控制; | |
SemaphoreValve | 用於控制Tomcat主機上任何容器上的併發訪問數量; | |
JvmRouteBinderValve | 在配置多個Tomcat爲以Apache通過mod_proxy或mod_jk作爲前端的集羣架構中,當期望停止某節點時,可以通過此Valve將用記請求定向至備用節點;使用此Valve,必須使用JvmRouteSessionIDBinderListener; | |
ReplicationValve | 專用於Tomcat集羣架構中,可以在某個請求的session信息發生更改時觸發session數據在各節點間進行復制; | |
SingleSignOn | 將兩個或多個需要對用戶進行認證webapp在認證用戶時連接在一起,即一次認證即可訪問所有連接在一起的webapp; | |
ClusterSingleSingOn | 對SingleSignOn的擴展,專用於Tomcat集羣當中,需要結合ClusterSingleSignOnListener進行工作; |
三、Tomcat的安裝
1、安裝jdk
[root@master java]# rpm -ivh jdk-7u80-linux-x64.rpm [root@master bin]# vim /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH [root@master java]# java -version java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
2、安裝tomcat
tomcat下載:http://tomcat.apache.org/
[root@node1 local]# tar -xf apache-tomcat-7.0.82.tar.gz -C /usr/local/ [root@node1 local]# ln -s apache-tomcat-7.0.82 tomcat
tomcat的目錄:
bin:存放命令的 其中Catalina.sh 是tomcat的啓動關閉等程序的管理腳本
conf:tomcat的配置文件
logs:tomcat的日誌文件
tomcat啓動後會在logs裏生成多個日誌文件
catalina.2017-10-30.log tomcat自身運行的日誌,通常也會輸出至catalina.out,
但是應用向console輸出的日誌不會輸出至此
catalina.out catalina.out其實是tomcat的標準輸出(stdout)和標準出錯(stderr),這是在tomcat的啓動腳本里指定的,如果沒有修改的話stdout和stderr會重定向到這裏。所以我們在應用裏使用System.out打印的東西都會到這裏來。另外,如果我們在應用裏使用其他的日誌框架,配置了向Console輸出的,則也會在這裏出現
localhost.2017-10-30.log 應用初始化(listener, filter, servlet)未處理的異常最後被tomcat捕獲而輸出的日誌,而這些未處理異常最終會導致應用無法啓動
localhost_access_log 訪問日誌(需在server.xml中配置)
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
日誌的配置文件在conf/logging.properties中
日誌級別爲:SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)
webapps:應用程序部署的目錄
四、tomcat的部署
1、拷貝你的WAR文件或者你的web應用文件夾到$CATALINA_HOME\webapps下,然後啓動服務器就可以了。這種方式比較簡單,但是web應用程序必須在webapps目錄下。訪問地址如下:
http://localhost:8080/項目名/
2、這種方式可以不必將PetWeb目錄拷貝到webapps下,直接在F:\部署。方法如下,更改$CATALINA_HOME\conf\server.xml文件,在<host>標籤內添加<Context>標籤,內容如下:
<Context docBase="F:/PetWeb" reloadable="false" path="/Pet"/>
其中reloadable="false"表示當應用程序中的內容發生更改之後服務器不會自動加載,這個屬性在開發階段通常都設爲true,方便開發,在發佈階段應該設置爲false,提高應用程序的訪問速度。
docBase爲路徑,可以使用絕對路徑,也可以使用相對路徑,相對路徑相對於webapps。path屬性的值是訪問時的根地址。訪問地址如下:http://localhost:8080/Pet/
3、這種方式和第二種方式差不多,但是不是在Server.xml文件中添加Context標籤,而是在$CATALINA_HOME\conf\Catalina\localhost中添加一個xml文件,如Pet.xml,內容如下:
<Context docBase="F:/PetWeb" reloadable="false" />大家可能發現和第二種方式差不多,但是缺少了path屬性,這種方式服務器會使用.xml的名字作爲path屬性的值。訪問地址如下:http://localhost:8080/Pet/
我們設置虛擬目錄和主目錄,都會在$CATALINA_HOME/localhost目錄下生成相應的Xml文件,因此,當我們在server.Xml裏面刪除了主目錄和虛擬目錄的設置後,如果系統還沒有生效,這時候我們就要察看一下這個目錄下的Xml文件是不是已經被刪除了,如果沒有被刪除,他還是對tomcat起作用的,我們必須手動刪除。
每當我們訪問一個地址的時候,tomcat首先是到$CATALINA_HOME/localhost目錄下去察看有沒有存在主目錄或虛擬目錄的Xml文件,如果有Xml文件,就按Xml裏的路徑進行訪問,如果沒有Xml文件,就到 server.Xml文件裏去察看是否配置context標籤,如果配置了context標籤,則 在$CATALINA_HOME/localhost目錄下生成一個對應的Xml文件,以便於下次直接驗證而不再訪問server.Xml,與此同時打開context裏指定的路徑,如果 server.Xml裏沒有配置context標籤,則返回訪問錯誤頁面。
我們其實可以直接在$CATALINA_HOME/localhost下建立一個Xml文件,用於主目錄或者虛擬目錄,而不需要去修改server.Xml就可以達到配置主目錄和虛擬目錄的目的,具體Xml的格式可以如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/xxxxx"
docBase="/xxx"
reloadable="true" allowLinking="true">
/Context>
具體是主目錄的配置還是虛擬目錄的配置取決於path的值。另外主目錄文件名必須是ROOT.Xml(root大寫),而虛擬目錄的文件名稱和虛擬目錄的名稱一致並且爲小寫.
-Xmx:最大堆內存
-Xms:初始堆內存
-Xmn:年輕代內存大小
年輕代分eden區和survivor區,suvivor一般分兩部分:from,to且永遠有一個是空的
-XX:NewSize:設置 年輕代內存大小
-XX:MaxNewsize:年輕代內存最大大小
-XX:NewRatio:年輕代和年老代比例
-XX:SurvivorRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置爲4,則年輕代與年老代所佔比值爲1:4,年輕代佔整個堆棧的1/5。
-XX:PermSize:持久代初始大小
-XX:MaxPermSize
-Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小爲1M,以前每個線程堆棧大小爲256k。根據應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
收集器設置
-XX:+UseSerialGC:設置串行收集器
-XX:+UseParallelGC:設置並行收集器
-XX:+UseParalledlOldGC:設置並行年老代收集器
-XX:+UseConcMarkSweepGC:設置併發收集器
-Xmx3550m -Xms3550 -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC:設置年老代爲併發收集。
-XX:+UseParNewGC:設置年輕代爲並行收集。可與CMS收集同時使用。JDK5.0以上,JVM會根據系統配置自行設置,所以無需再設置此值。
在tomcat的catalina.sh中設置如下: