站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        Tomcat詳解

          PHP:      開發(fā)語言:腳本語言      運行環(huán)境:解釋執(zhí)行          Zend Engine:Opcode              Xcache,APC,eAccelerator          MVC:              data:數(shù)據(jù)              bussiness:業(yè)務(wù)                presentation:展示  C/C++:CPU,OS    移植困難    維護成本高    高速    驅(qū)動    oak:橡樹,智能,  java:      包含四個獨立卻又彼此相關(guān)的技術(shù):          Java程序設(shè)計語言          Java API          Java Class文件格式          JVM:Java Virtual Machine  JVM的實現(xiàn)方式:    1.一次解釋器,解釋字節(jié)碼并執(zhí)行    2.即時編譯器(just-in-time complier)  依賴于更多內(nèi)存緩存解釋后的結(jié)果    3.自適應(yīng)編譯器 緩存20%左右代碼,提高80%左右的速度  Java設(shè)計語言:Sun  Java API:  JVM:Hotspot JVM    JRE:java運行時環(huán)境 運行    JDK:java開發(fā)環(huán)境 開發(fā)(編譯)+運行  JVM:OpenJDK    開發(fā)+運行 開源實現(xiàn)  Java API類庫 第三方類庫  JDK=Java+API+JVM,是用于實現(xiàn)Java程序開發(fā)的最小環(huán)境  JRE=JVM+java SE API  Java應(yīng)用領(lǐng)域的不同,Java可分為三類:    JAVA SE:Standard Edtion    JAVA EE:Enterprise Edition,J2EE    JAVA ME:Mobile Edtion,J2ME  1995年,JAVA 1.0面世, James Gosling, Green Project    applet:小程序 動態(tài)網(wǎng)站    CGI:Common Gateway Interface 協(xié)議        HTML           

        Servlet:CGI JSP:Java Server Page <%language="java"> SSH:struts,Spring,Hebernate JSP–>Servlet(Jasper編譯器)

        Tomcat詳解

          applet, servlet, jsp  JSP:   	.jsp --> .java -->(JVM) .class  JDK: javac, .java --> .class  CGI, Servlet, .java   Web  	Servlet Container: Servlet容器  	Web Container: Web容器  線程私有內(nèi)存區(qū):  	程序計數(shù)器  	java虛擬機棧  線程共享內(nèi)存區(qū):  	方法區(qū)  	堆:java自動內(nèi)存回收,GC(Garbage Collector)  垃圾回收算法:  	1、標記-清除  	2、復(fù)制  		二分之一  	3、標記-整理    垃圾回收器:  	Serial  	ParNew  	Parallel Scavenge  	Serial Old  	Parallel Old    	CMS: Concurrent Mark Sweep  		特點:并發(fā)收集、低停頓  		缺點:無法浮動垃圾、由于基于標記-清除會產(chǎn)生碎片  	G1  安裝:  rpm  通用二進制格式, .bin  源碼
          vim /etc/profile.d/java.sh  export JAVA_HOME=/usr/java/jdk1.6.0_21  export PATH=$PATH:$JAVA_HOME/bin  . /etc/profile.d/java.sh
          java配置參數(shù):  	-XX:+

        Tomcat詳解

          類的生命周期:  Loading:加載  Verification:驗證  Preparation:準備  Resolutin:解析  Initilization:初始化  Using:使用  Unloading:卸載
          Sun JDK監(jiān)控和故障處理工具:  	jps, JVM Process Status Tool: 顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機進程的列表信息  	jstat, JVM Statistics Monitoring Tool:收集并顯示HotSpot虛擬機各方面的運行數(shù)據(jù)  	jinfo:顯示正在運行的某HotSpot虛擬機配置信息  	jmap: 生成某HotSpot虛擬機的內(nèi)存轉(zhuǎn)儲快照;  可視化工具:  	jconsole: Java的監(jiān)控與管理控制臺  	jvisualvm: 

        Tomcat詳解

        Tomcat系列之組件詳解及服務(wù)安裝配置

          Servlet: CGI, java  	硬編碼, html  JSP: <% %>, html  	Jasper, .jsp --> .java  	JSP --> Servlet
          容器類組件:  	Engine, Host, Context  頂級組件:  	Server, Service  Realm(領(lǐng)域): 用戶帳號數(shù)據(jù)庫  Valve(閥門):   	記錄訪問日志  	基于IP認證  Logger: 日志記錄器

        Tomcat詳解

        Tomcat詳解

          常見的web容器有:    商業(yè)版:  ◇ Sun GlassFish Enterprise Server   ◇ Sun Java System Web Server  ◇ JBoss Enterprise Application Platform  ◇ WebLogic Application Server  ◇ Caucho's Resin Server  ◇ WebSphere Application Server  ◇ NetWeaver    非商業(yè)版:  ◇ Apache Tomcat   ◇ Apache Geronimo  ◇ GlassFish   ◇ JBoss Application Server   ◇ Jetty  ◇ Tiny Java Web Server   ◇ Eclipse Virgo  server.xml:  Tomcat各組件間的關(guān)系:    	  		  		  			  				   			  		  	    默認的, 應(yīng)用程序部署描述符  部署:將一個web應(yīng)用程序所依賴到的類裝載進JVM

        Tomcat詳解

        Tomcat詳解

        Tomcat詳解

        Tomcat系列之a(chǎn)pache使用mod_jk和mod_proxy反向代理

        Tomcat詳解

        Tomcat詳解

          添加一個新的Host:  編輯server.xml:                          
          <%@ page language="java" %>  

        TomcatA

        <% session.setAttribute("abc","abc"); %>

        Session ID <%= session.getId() %>
        Created on <%= session.getCreationTime() %>

        Tomcat詳解

        192.168.10.8:8080/

        Tomcat詳解

          Java體系結(jié)構(gòu)包括四個獨立但相關(guān)的技術(shù):  Java程序設(shè)計語言  Java class文件格式  Java API  Java VM  用Java語言編譯源代碼,把它編譯成Java Class文件,然后在Java VM中運行class文件;當(dāng)編寫程序時,通過調(diào)用類(Java API)中的方法來訪問系統(tǒng)資源,而當(dāng)程序運行時,它通過調(diào)用class文件中實現(xiàn)了Java API的方法也滿足程序的Java API調(diào)用。Java VM和Java API一起組成了一個“平臺”,所有Java程序都在其上編譯和運行,因此,它們有時也被稱作Java運行時環(huán)境。    Java VM的主要任務(wù)是裝載class文件并且執(zhí)行其中的字節(jié)碼。Java VM包含一個類裝載器(class loader),它可以從程序和API裝載class文件;而Java API的類只在程序執(zhí)行中需要時才會被裝載。    Java字節(jié)碼由執(zhí)行引擎來執(zhí)行。而不同的Java VM中,其執(zhí)行引擎的實現(xiàn)可能各不相同。最簡單的執(zhí)行引擎不是一次性解釋字節(jié)碼,而另一種稱為“即時編譯器(just-in-time compiler)”的執(zhí)行引擎執(zhí)行速度更快,但要消耗更多的內(nèi)存資源。即時編譯模式下,第一次被執(zhí)行的字節(jié)碼會被編譯成本地機器代碼并緩存下來以實現(xiàn)“復(fù)用”。第三種執(zhí)行引擎是所謂的自適應(yīng)優(yōu)化器,此種方法中,虛擬機始的時候解釋字節(jié)碼,介是會監(jiān)視運行中程序的活動,并且記錄下使用最頻繁的代碼。程序運行時,虛擬機只把那些活動最頻繁的代碼編譯成本地代碼,而不頻繁的代碼則仍然保留為字節(jié)碼由虛擬機解釋執(zhí)行。自適應(yīng)優(yōu)化器可以使得Java VM在80%-90%的時間里執(zhí)行被優(yōu)化過的本地代碼,而只需要編譯10%-20%對性能有影響的代碼。最后一種虛擬機由硬件芯片構(gòu)成,它用本地方法執(zhí)行Java字節(jié)碼,其執(zhí)行引擎內(nèi)嵌于芯片中。    Sun公司創(chuàng)建了第一個Servlet容器,即Java Web Server, 但JWS只是為了演示Servlet的相應(yīng)功能,所以其很不穩(wěn)定。與此同時,ASF創(chuàng)建了JServ項目,一個能夠與apache整合起來的servlet容器。1999年,Sun把JWS捐給了ASF,于是兩個項目合二為一,即今天Tomcat的前身。第一個tomcat版本是Tomcat 3.x系列,而發(fā)布于2001年Tomcat4.0則是在此前基礎(chǔ)上進行了重新設(shè)計和實現(xiàn),其代碼項目被命名為Catalina。目前最新的版本則是7.x系列。    Java SE則包含了Java二進制程序(如JVM和Java字節(jié)碼編譯器)和Java的核心代碼庫,而Jave EE標準則包含了一組適用于創(chuàng)建企業(yè)級Web應(yīng)用程序的API。Jave EE建立在Java SE的基礎(chǔ)上,并依賴于Java SE才能正常工作。當(dāng)然,任何級別的應(yīng)用程序均能從Java EE中獲益,但Jave EE卻更適合解決大型軟件系統(tǒng)設(shè)計中的問題。    JAVA EE包含多個獨立的API,Servlet和JSP就是其中的兩個,而JAVA EE中著名的API中還包含如下的幾個:    JAVA EE APIs:  EJB(Enterprise JavaBeans):JAVA相關(guān)的諸多高級功能的實現(xiàn),如RMI(Remote Method Invocation), 對象/關(guān)系映射,跨越多個數(shù)據(jù)源的分布式事務(wù)等;    JMS(Java Message Service):高性能異步消息服務(wù),實現(xiàn)JAVA EE應(yīng)用程序與非JAVA程序的“透明”通信;    JMX(Java Management Extensions):在程序運行時對其進行交互式監(jiān)控和管理的機制;    JTA(Java Transaction API):允許應(yīng)用程序在自身的一個或多個組件中平滑地處理錯誤的機制;    JavaMail:通過工業(yè)標準的POP/SMTP/IMAP協(xié)議發(fā)送和接收郵件的機制;    Java SE APIs:  JNDI(Java Naming and Directory Interface):用于與LDAP服務(wù)交互的API;  JAXP(Java API for XML Processing):用于分析及轉(zhuǎn)換XML(基于XSLT實現(xiàn));    Java SE API + JDK    JAVA EE Application Servers:  Websphere  Weblogic  oc4j  JBoss  JOnAS  Geronimo  Glassfish    risen    Sun --> TWS    RI: Reference Implimentation      參考實現(xiàn)    ASF:Apache Software Foundation    Jserv    Sun --> ASF    catalina    O'Reilly: Tomcat      男貓    類,.jar  JVM,    Tomcat: Servlet and JSP APIs,  JNDI and JMX APIs.    Tomcat不是一個完整意義上的Jave EE服務(wù)器,它甚至都沒有提供對哪怕是一個主要Java EE API的實現(xiàn);但由于遵守apache開源協(xié)議,tomcat卻又為眾多的java應(yīng)用程序服務(wù)器嵌入自己的產(chǎn)品中構(gòu)建商業(yè)的java應(yīng)用程序服務(wù)器,如JBoss和JOnAS。    盡管Tomcat對Jave EE API的實現(xiàn)并不完整,然而很企業(yè)也在漸漸拋棄使用傳統(tǒng)的Java EE技術(shù)(如EJB)轉(zhuǎn)而采用一些開源組件來構(gòu)建復(fù)雜的應(yīng)用。這些開源組件如Structs、Spring和Hibernate,而Tomcat能夠?qū)@些組件實現(xiàn)完美的支持。    HTTP是一種無狀態(tài)的協(xié)議,在用戶的一次連接請求響應(yīng)完成后,服務(wù)器端將無法識別在后續(xù)的連接請求中再次識別此用戶,交將其所有請求關(guān)聯(lián)起來。為了解決這個問題,java container通過一個臨時的cookie來為此用戶保存一個標識,此標識即所謂的用戶session。  在第一次調(diào)用之后,JSP會被編譯成一個servlet類,在后續(xù)的操作中則可以直接使用此類,從而避免了對每一次調(diào)用的都要重新分析和編譯。因此,類似servlet,JSP的執(zhí)行需要在container中完成。JSP的container跟servlet的container基本相同,但在JSP執(zhí)行之前,需要一些額外的步驟如與servlet代碼建立會話等。Tomcat包含了一個叫做Catalina的Servlet container(執(zhí)行servlet和編譯過的JSP)和一個JSP編譯器(Jasper編譯器)。事實上,一個包含了JSP編譯器和Servlet容器的應(yīng)用程序組合通過被稱作Web容器。    JSP和Servlet的最大區(qū)別在于,Servlet通常需要事先編譯好,而JSP則并非必須事先編譯。這意味著Servlet通常放置于私有資源區(qū)域,而JSP則通常以嵌入代碼的方式包含于HTML頁面文件中,這些HTML文件通常放置在公開資源區(qū)域。    MVC架構(gòu):  Controller,Model和View各自獨立,一個流行的開源實現(xiàn)是Apache Structs框架;目今,設(shè)計優(yōu)良的Web應(yīng)用程序通常用相就的技術(shù)實現(xiàn)相應(yīng)的功能,比如:  1、Servlet用于實現(xiàn)應(yīng)用邏輯;  2、JSP用于內(nèi)容展示;  3、標簽庫和JSP擴展語言用于替換在JSP內(nèi)部嵌入Java代碼,進而降低了HTML維護的復(fù)雜度;  4、MVC框架用于實現(xiàn)展示和應(yīng)用邏輯的分離;    對于一個Web應(yīng)用程序而言,其通常由Servlets、JSP和其它文件等共同組成。這些文件通常被打包成WAR(Web Application Archive)格式,并以.war作為打包后的文件擴展名。而Servlet規(guī)范則定義了在WAR內(nèi)部組織這些文件的標準目錄結(jié)構(gòu)。其目錄和功用如下:  /  Web應(yīng)用程序的根目錄,所有可被公開訪問的文件均放置于此處,如HTML、JSP和圖片文件等;  /WEB-INF  此目錄為私有資源目錄,其內(nèi)部的所有文件和子目錄均不能被公開訪問;包含著此Web應(yīng)用程序的配置文件web.xml(程序結(jié)構(gòu)描述符文件)通常放置于此目錄;  /WEB-INF/classes  當(dāng)前Web應(yīng)用程序的類文件的存在目錄;  /WEB-INF/lib  可被打包為JAR格式的類文件通常放置于此目錄;    安裝tomcat:  一、先安裝JVM  二、安裝配置tomcat    A Tomcat init script for Linux  #!/bin/sh  # Tomcat init script for Linux.  #  # chkconfig: 2345 96 14  # description: The Apache Tomcat servlet/JSP container.  JAVA_HOME=/usr/java/jdk1.7.0_05  CATALINA_HOME=/opt/apache-tomcat-7.0.29  export JAVA_HOME CATALINA_HOME  exec $CATALINA_HOME/bin/catalina.sh $*    Tomcat的架構(gòu):  Tomcat 6支持Servlet 2.5和JSP 2.1的規(guī)范,它由一組嵌套的層次和組件組成,一般可分為以下四類:  頂級組件:位于配置層次的頂級,并且彼此間有著嚴格的對應(yīng)關(guān)系;  連接器:連接客戶端(可以是瀏覽器或Web服務(wù)器)請求至Servlet容器,  容器:包含一組其它組件;  被嵌套的組件:位于一個容器當(dāng)中,但不能包含其它組件;    各常見組件:  1、服務(wù)器(server):Tomcat的一個實例,通常一個JVM只能包含一個Tomcat實例;因此,一臺物理服務(wù)器上可以在啟動多個JVM的情況下在每一個JVM中啟動一個Tomcat實例,每個實例分屬于一個獨立的管理端口。這是一個頂級組件。  2、服務(wù)(service):一個服務(wù)組件通常包含一個引擎和與此引擎相關(guān)聯(lián)的一個或多個連接器。給服務(wù)命名可以方便管理員在日志文件中識別不同服務(wù)產(chǎn)生的日志。一個server可以包含多個service組件,但通常情下只為一個service指派一個server。    連接器類組件:  3、連接器(connectors):負責(zé)連接客戶端(可以是瀏覽器或Web服務(wù)器)請求至Servlet容器內(nèi)的Web應(yīng)用程序,通常指的是接收客戶發(fā)來請求的位置及服務(wù)器端分配的端口。默認端口通常是HTTP協(xié)議的8080,管理員也可以根據(jù)自己的需要改變此端口。一個引擎可以配置多個連接器,但這些連接器必須使用不同的端口。默認的連接器是基于HTTP/1.1的Coyote。同時,Tomcat也支持AJP、JServ和JK2連接器。    容器類組件:  4、引擎(Engine):引擎通是指處理請求的Servlet引擎組件,即Catalina Servlet引擎,它檢查每一個請求的HTTP首部信息以辨別此請求應(yīng)該發(fā)往哪個host或context,并將請求處理后的結(jié)果返回的相應(yīng)的客戶端。嚴格意義上來說,容器不必非得通過引擎來實現(xiàn),它也可以是只是一個容器。如果Tomcat被配置成為獨立服務(wù)器,默認引擎就是已經(jīng)定義好的引擎。而如果Tomcat被配置為Apache Web服務(wù)器的提供Servlet功能的后端,默認引擎將被忽略,因為Web服務(wù)器自身就能確定將用戶請求發(fā)往何處。一個引擎可以包含多個host組件。  5、主機(Host):主機組件類似于Apache中的虛擬主機,但在Tomcat中只支持基于FQDN的“虛擬主機”。一個引擎至少要包含一個主機組件。  6、上下文(Context):Context組件是最內(nèi)層次的組件,它表示W(wǎng)eb應(yīng)用程序本身。配置一個Context最主要的是指定Web應(yīng)用程序的根目錄,以便Servlet容器能夠?qū)⒂脩粽埱蟀l(fā)往正確的位置。Context組件也可包含自定義的錯誤頁,以實現(xiàn)在用戶訪問發(fā)生錯誤時提供友好的提示信息。    被嵌套類(nested)組件:  這類組件通常包含于容器類組件中以提供具有管理功能的服務(wù),它們不能包含其它組件,但有些卻可以由不同層次的容器各自配置。  7、閥門(Valve):用來攔截請求并在將其轉(zhuǎn)至目標之前進行某種處理操作,類似于Servlet規(guī)范中定義的過濾器。Valve可以定義在任何容器類的組件中。Valve常被用來記錄客戶端請求、客戶端IP地址和服務(wù)器等信息,這種處理技術(shù)通常被稱作請求轉(zhuǎn)儲(request dumping)。請求轉(zhuǎn)儲valve記錄請求客戶端請求數(shù)據(jù)包中的HTTP首部信息和cookie信息文件中,響應(yīng)轉(zhuǎn)儲valve則記錄響應(yīng)數(shù)據(jù)包首部信息和cookie信息至文件中。  8、日志記錄器(Logger):用于記錄組件內(nèi)部的狀態(tài)信息,可被用于除Context之外的任何容器中。日志記錄的功能可被繼承,因此,一個引擎級別的Logger將會記錄引擎內(nèi)部所有組件相關(guān)的信息,除非某內(nèi)部組件定義了自己的Logger組件。  9、領(lǐng)域(Realm):用于用戶的認證和授權(quán);在配置一個應(yīng)用程序時,管理員可以為每個資源或資源組定義角色及權(quán)限,而這些訪問控制功能的生效需要通過Realm來實現(xiàn)。Realm的認證可以基于文本文件、數(shù)據(jù)庫表、LDAP服務(wù)等來實現(xiàn)。Realm的效用會遍及整個引擎或頂級容器,因此,一個容器內(nèi)的所有應(yīng)用程序?qū)⒐蚕碛脩糍Y源。同時,Realm可以被其所在組件的子組件繼承,也可以被子組件中定義的Realm所覆蓋。    引擎(Engine):引擎是指處理請求的Servlet引擎組件,即Catalina Servlet引擎,它從HTTPconnector接收請求并響應(yīng)請求。它檢查每一個請求的HTTP首部信息以辨別此請求應(yīng)該發(fā)往哪個host或context,并將請求處理后的結(jié)果返回的相應(yīng)的客戶端。嚴格意義上來說,容器不必非得通過引擎來實現(xiàn),它也可以是只是一個容器。如果Tomcat被配置成為獨立服務(wù)器,默認引擎就是已經(jīng)定義好的引擎。而如果Tomcat被配置為Apache Web服務(wù)器的提供Servlet功能的后端,默認引擎將被忽略,因為Web服務(wù)器自身就能確定將用戶請求發(fā)往何處。一個引擎可以包含多個host組件。    Tomcat連接器架構(gòu):  基于Apache做為Tomcat前端的架構(gòu)來講,Apache通過mod_jk、mod_jk2或mod_proxy模塊與后端的Tomcat進行數(shù)據(jù)交換。而對Tomcat來說,每個Web容器實例都有一個Java語言開發(fā)的連接器模塊組件,在Tomcat6中,這個連接器是org.apache.catalina.Connector類。這個類的構(gòu)造器可以構(gòu)造兩種類別的連接器:HTTP/1.1負責(zé)響應(yīng)基于HTTP/HTTPS協(xié)議的請求,AJP/1.3負責(zé)響應(yīng)基于AJP的請求。但可以簡單地通過在server.xml配置文件中實現(xiàn)連接器的創(chuàng)建,但創(chuàng)建時所使用的類根據(jù)系統(tǒng)是支持APR(Apache Portable Runtime)而有所不同。  APR是附加在提供了通用和標準API的操作系統(tǒng)之上一個通訊層的本地庫的集合,它能夠為使用了APR的應(yīng)用程序在與Apache通信時提供較好伸縮能力時帶去平衡效用。  同時,需要說明的是,mod_jk2模塊目前已經(jīng)不再被支持了,mod_jk模塊目前還apache被支持,但其項目活躍度已經(jīng)大大降低。因此,目前更常用 的方式是使用mod_proxy模塊。    如果支持APR:  1、HTTP/1.1:org.apache.cotote.http11.Http11AprProtocol  2、AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol  如果不支持APR:  HTTP/1.1: org.apache.coyote.http11.Http11Protocol  AJP/1.3: org.apache.jk.server.JkCoyoteHandler    連接器協(xié)議:    Tomcat的Web服務(wù)器連接器支持兩種協(xié)議:AJP和HTTP,它們均定義了以二進制格式在Web服務(wù)器和Tomcat之間進行數(shù)據(jù)傳輸,并提供相應(yīng)的控制命令。    AJP(Apache JServ Protocol)協(xié)議:  目前正在使用的AJP協(xié)議的版本是通過JK和JK2連接器提供支持的AJP13,它基于二進制的格式在Web服務(wù)器和Tomcat之間傳輸數(shù)據(jù),而此前的版本AJP10和AJP11則使用文本格式傳輸數(shù)據(jù)。    HTTP協(xié)議:誠如其名稱所表示,其是使用HTTP或HTTPS協(xié)議在Web服務(wù)器和Tomcat之間建立通信,此時,Tomcat就是一個完全功能的HTTP服務(wù)器,它需要監(jiān)聽在某端口上以接收來自于商前服務(wù)器的請求。    Tomcat的配置文件:  Tomcat的配置文件默認存放在$CATALINA_HOME/conf目錄中,主要有以下幾個:  server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關(guān)配置信息;  web.xml:遵循Servlet規(guī)范標準的配置文件,用于配置servlet,并為所有的Web應(yīng)用程序提供包括MIME映射等默認配置信息;  tomcat-user.xml:Realm認證時用到的相關(guān)角色、用戶和密碼等信息;Tomcat自帶的manager默認情況下會用到此文件;在Tomcat中添加/刪除用戶,為用戶指定角色等將通過編輯此文件實現(xiàn);  catalina.policy:Java相關(guān)的安全策略配置文件,在系統(tǒng)資源級別上提供訪問控制的能力;  catalina.properties:Tomcat內(nèi)部package的定義及訪問相關(guān)的控制,也包括對通過類裝載器裝載的內(nèi)容的控制;Tomcat6在啟動時會事先讀取此文件的相關(guān)設(shè)置;  logging.properties: Tomcat6通過自己內(nèi)部實現(xiàn)的JAVA日志記錄器來記錄操作相關(guān)的日志,此文件即為日志記錄器相關(guān)的配置信息,可以用來定義日志記錄的組件級別以及日志文件的存在位置等;  context.xml:所有host的默認配置信息;    一、server.xml  Tomcat以面向?qū)ο蟮姆绞竭\行,它可以在運行時動態(tài)加載配置文件中定義的對象結(jié)構(gòu),這有點類似于apache的httpd模塊的調(diào)用方式。server.xml中定義的每個主元素都會被創(chuàng)建為對象,并以某特定的層次結(jié)構(gòu)將這些對象組織在一起。下面是個樣樣例配置:                                                                                                                                                                                                                                      server.xml文件中可定義的元素非常多,包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等。    下面簡單介紹幾個常用組件:  1、Server組件    如上面示例文件中定義的:      這會讓Tomcat6啟動一個server實例(即一個JVM),它監(jiān)聽在8005端口以接收shutdown命令。各Server的定義不能使用同一個端口,這意味著如果在同一個物理機上啟動了多個Server實例,必須配置它們使用不同的端口。這個端口的定義用于為管理員提供一個關(guān)閉此實例的便捷途徑,因此,管理員可以直接telnet至此端口使用SHUTDOWN命令關(guān)閉此實例。不過,基于安全角度的考慮,這通常不允許遠程進行。    Server的相關(guān)屬性:  className: 用于實現(xiàn)此Server容器的完全限定類的名稱,默認為org.apache.catalina.core.StandardServer;  port: 接收shutdown指令的端口,默認僅允許通過本機訪問,默認為8005;  shutdown:發(fā)往此Server用于實現(xiàn)關(guān)閉tomcat實例的命令字符串,默認為SHUTDOWN;    2、Service組件:  Service主要用于關(guān)聯(lián)一個引擎和與此引擎相關(guān)的連接器,每個連接器通過一個特定的端口和協(xié)議接收入站請求交將其轉(zhuǎn)發(fā)至關(guān)聯(lián)的引擎進行處理。困此,Service要包含一個引擎、一個或多個連接器。    如上面示例中的定義:      這定義了一個名為Catalina的Service,此名字也會在產(chǎn)生相關(guān)的日志信息時記錄在日志文件當(dāng)中。    Service相關(guān)的屬性:  className: 用于實現(xiàn)service的類名,一般都是org.apache.catalina.core.StandardService。  name:此服務(wù)的名稱,默認為Catalina;    3、Connector組件:  進入Tomcat的請求可以根據(jù)Tomcat的工作模式分為如下兩類:  Tomcat作為應(yīng)用程序服務(wù)器:請求來自于前端的web服務(wù)器,這可能是Apache, IIS, Nginx等;  Tomcat作為獨立服務(wù)器:請求來自于web瀏覽器;    Tomcat應(yīng)該考慮工作情形并為相應(yīng)情形下的請求分別定義好需要的連接器才能正確接收來自于客戶端的請求。一個引擎可以有一個或多個連接器,以適應(yīng)多種請求方式。    定義連接器可以使用多種屬性,有些屬性也只適用于某特定的連接器類型。一般說來,常見于server.xml中的連接器類型通常有4種:  1) HTTP連接器  2) SSL連接器  3) AJP 1.3連接器  4) proxy連接器    如上面示例server.xml中定義的HTTP連接器:            定義連接器時可以配置的屬性非常多,但通常定義HTTP連接器時必須定義的屬性只有“port”,定義AJP連接器時必須定義的屬性只有"protocol",因為默認的協(xié)議為HTTP。以下為常用屬性的說明:  1) address:指定連接器監(jiān)聽的地址,默認為所有地址,即0.0.0.0;  2) maxThreads:支持的最大并發(fā)連接數(shù),默認為200;  3) port:監(jiān)聽的端口,默認為0;  4) protocol:連接器使用的協(xié)議,默認為HTTP/1.1,定義AJP協(xié)議時通常為AJP/1.3;  5) redirectPort:如果某連接器支持的協(xié)議是HTTP,當(dāng)接收客戶端發(fā)來的HTTPS請求時,則轉(zhuǎn)發(fā)至此屬性定義的端口;  6) connectionTimeout:等待客戶端發(fā)送請求的超時時間,單位為毫秒,默認為60000,即1分鐘;  7) enableLookups:是否通過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;默認為true;  8) acceptCount:設(shè)置等待隊列的最大長度;通常在tomcat所有處理線程均處于繁忙狀態(tài)時,新發(fā)來的請求將被放置于等待隊列中;    下面是一個定義了多個屬性的SSL連接器:      4、Engine組件:  Engine是Servlet處理器的一個實例,即servlet引擎,默認為定義在server.xml中的Catalina。Engine需要defaultHost屬性來為其定義一個接收所有發(fā)往非明確定義虛擬主機的請求的host組件。如前面示例中定義的:      常用的屬性定義:  defaultHost:Tomcat支持基于FQDN的虛擬主機,這些虛擬主機可以通過在Engine容器中定義多個不同的Host組件來實現(xiàn);但如果此引擎的連接器收到一個發(fā)往非非明確定義虛擬主機的請求時則需要將此請求發(fā)往一個默認的虛擬主機進行處理,因此,在Engine中定義的多個虛擬主機的主機名稱中至少要有一個跟defaultHost定義的主機名稱同名;  name:Engine組件的名稱,用于日志和錯誤信息記錄時區(qū)別不同的引擎;    Engine容器中可以包含Realm、Host、Listener和Valve子容器。    5、Host組件:  位于Engine容器中用于接收請求并進行相應(yīng)處理的主機或虛擬主機,如前面示例中的定義:                    常用屬性說明:  1) appBase:此Host的webapps目錄,即存放非歸檔的web應(yīng)用程序的目錄或歸檔后的WAR文件的目錄路徑;可以使用基于$CATALINA_HOME的相對路徑;  2) autoDeploy:在Tomcat處于運行狀態(tài)時放置于appBase目錄中的應(yīng)用程序文件是否自動進行deploy;默認為true;  3) unpackWars:在啟用此webapps時是否對WAR格式的歸檔文件先進行展開;默認為true;    虛擬主機定義示例:                                                主機別名定義:  如果一個主機有兩個或兩個以上的主機名,額外的名稱均可以以別名的形式進行定義,如下:      magedu.com      6、Context組件:  Context在某些意義上類似于apache中的路徑別名,一個Context定義用于標識tomcat實例中的一個Web應(yīng)用程序;如下面的定義:                                                                                在Tomcat6中,每一個context定義也可以使用一個單獨的XML文件進行,其文件的目錄為$CATALINA_HOME/conf//。可以用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。    常用的屬性定義有:  1) docBase:相應(yīng)的Web應(yīng)用程序的存放位置;也可以使用相對路徑,起始路徑為此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應(yīng)的Host中appBase中定義的路徑名有包含關(guān)系,比如,如果appBase為deploy,而docBase絕不能為deploy-bbs類的名字;  2) path:相對于Web服務(wù)器根路徑而言的URI;如果為空“”,則表示為此webapp的根路徑;如果context定義在一個單獨的xml文件中,此屬性不需要定義;  3) reloadable:是否允許重新加載此context相關(guān)的Web應(yīng)用程序的類;默認為false;    7、Realm組件:  一個Realm表示一個安全上下文,它是一個授權(quán)訪問某個給定Context的用戶列表和某用戶所允許切換的角色相關(guān)定義的列表。因此,Realm就像是一個用戶和組相關(guān)的數(shù)據(jù)庫。定義Realm時惟一必須要提供的屬性是classname,它是Realm的多個不同實現(xiàn),用于表示此Realm認證的用戶及角色等認證信息的存放位置。  JAASRealm:基于Java Authintication and Authorization Service實現(xiàn)用戶認證;  JDBCRealm:通過JDBC訪問某關(guān)系型數(shù)據(jù)庫表實現(xiàn)用戶認證;  JNDIRealm:基于JNDI使用目錄服務(wù)實現(xiàn)認證信息的獲取;  MemoryRealm:查找tomcat-user.xml文件實現(xiàn)用戶信息的獲取;  UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)實現(xiàn)用戶認證,它實現(xiàn)是一個完全可更新和持久有效的MemoryRealm,因此能夠跟標準的MemoryRealm兼容;它通過JNDI實現(xiàn);    下面是一個常見的使用UserDatabase的配置:        下面是一個使用JDBC方式獲取用戶認證信息的配置:    mysql://localhost/authority" debug="99" drivername="org.gjt.mm.mysql.Driver" rolenamecol="role_name" usercredcol="user_pass" usernamecol="user_name" userroletable="user_roles" usertable="users">    8、Valve組件:  Valve類似于過濾器,它可以工作于Engine和Host/Context之間、Host和Context之間以及Context和Web應(yīng)用程序的某資源之間。一個容器內(nèi)可以建立多個Valve,而且Valve定義的次序也決定了它們生效的次序。Tomcat6中實現(xiàn)了多種不同的Valve:  AccessLogValve:訪問日志Valve  ExtendedAccessValve:擴展功能的訪問日志Valve  JDBCAccessLogValve:通過JDBC將訪問日志信息發(fā)送到數(shù)據(jù)庫中;  RequestDumperValve:請求轉(zhuǎn)儲Valve;  RemoteAddrValve:基于遠程地址的訪問控制;  RemoteHostValve:基于遠程主機名稱的訪問控制;  SemaphoreValve:用于控制Tomcat主機上任何容器上的并發(fā)訪問數(shù)量;  JvmRouteBinderValve:在配置多個Tomcat為以Apache通過mod_proxy或mod_jk作為前端的集群架構(gòu)中,當(dāng)期望停止某節(jié)點時,可以通過此Valve將用記請求定向至備用節(jié)點;使用此Valve,必須使用JvmRouteSessionIDBinderListener;  ReplicationValve:專用于Tomcat集群架構(gòu)中,可以在某個請求的session信息發(fā)生更改時觸發(fā)session數(shù)據(jù)在各節(jié)點間進行復(fù)制;  SingleSignOn:將兩個或多個需要對用戶進行認證webapp在認證用戶時連接在一起,即一次認證即可訪問所有連接在一起的webapp;  ClusterSingleSingOn:對SingleSignOn的擴展,專用于Tomcat集群當(dāng)中,需要結(jié)合ClusterSingleSignOnListener進行工作;    RemoteHostValve和RemoteAddrValve可以分別用來實現(xiàn)基于主機名稱和基于IP地址的訪問控制,控制本身可以通過allow或deny來進行定義,這有點類似于Apache的訪問控制功能;如下面的Valve則實現(xiàn)了僅允許本機訪問/probe:                  其中相關(guān)屬性定義有:  1) className:相關(guān)的java實現(xiàn)的類名,相應(yīng)于分別應(yīng)該為org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;  2) allow:以逗號分開的允許訪問的IP地址列表,支持正則表達式,因此,點號“.”用于IP地址時需要轉(zhuǎn)義;僅定義allow項時,非明確allow的地址均被deny;  3) deny: 以逗號分開的禁止訪問的IP地址列表,支持正則表達式;使用方式同allow;    9、GlobalNamingResources  應(yīng)用于整個服務(wù)器的JNDI映射,此可以避免每個Web應(yīng)用程序都需要在各自的web.xml創(chuàng)建,這在web應(yīng)用程序以WAR的形式存在時尤為有用。它通常可以包含三個子元素:  1) Environment;  2) Resource;  3) ResourceEnvRef;    10、WatchedResource  WatchedResource可以用于Context中監(jiān)視指定的webapp程序文件的改變,并且能夠在監(jiān)視到文件內(nèi)容發(fā)生改變時重新裝載此文件。    11、Listener  Listener用于創(chuàng)建和配置LifecycleListener對象,而LifecycleListener通常被開發(fā)人員用來創(chuàng)建和刪除容器。    11、Loader  Java的動態(tài)裝載功能是其語言功能強大表現(xiàn)之一,Servlet容器使用此功能在運行時動態(tài)裝載servlet和它們所依賴的類。Loader可以用于Context中控制java類的加載。    12、Manager  Manger對象用于實現(xiàn)HTTP會話管理的功能,Tomcat6中有5種Manger的實現(xiàn):  1) StandardManager  Tomcat6的默認會話管理器,用于非集群環(huán)境中對單個處于運行狀態(tài)的Tomcat實例會話進行管理。當(dāng)Tomcat關(guān)閉時,這些會話相關(guān)的數(shù)據(jù)會被寫入磁盤上的一個名叫SESSION.ser的文件,并在Tomcat下次啟動時讀取此文件。  2) PersistentManager  當(dāng)一個會話長時間處于空閑狀態(tài)時會被寫入到swap會話對象,這對于內(nèi)存資源比較吃緊的應(yīng)用環(huán)境來說比較有用。  3)DeltaManager  用于Tomcat集群的會話管理器,它通過將改變了會話數(shù)據(jù)同步給集群中的其它節(jié)點實現(xiàn)會話復(fù)制。這種實現(xiàn)會將所有會話的改變同步給集群中的每一個節(jié)點,也是在集群環(huán)境中用得最多的一種實現(xiàn)方式。  4) BackupManager  用于Tomcat集群的會話管理器,與DeltaManager不同的是,某節(jié)點會話的改變只會同步給集群中的另一個而非所有節(jié)點。  5)SimpleTcpReplicationManager  Tomcat4時用到的版本,過于老舊了。    13、Stores  PersistentManager必須包含一個Store元素以指定將會話數(shù)據(jù)存儲至何處。這通常有兩種實現(xiàn)方式:FileStore和JDBCStore。    14、Resources  經(jīng)常用于實現(xiàn)在Context中指定需要裝載的但不在Tomcat本地磁盤上的應(yīng)用資源,如Java類,HTML頁面,JSP文件等。    15、Cluster  專用于配置Tomcat集群的元素,可用于Engine和Host容器中。在用于Engine容器中時,Engine中的所有Host均支持集群功能。在Cluster元素中,需要直接定義一個Manager元素,這個Manager元素有一個其值為org.apache.catalina.ha.session.DeltaManager或org.apache.catalina.ha.session.BackupManager的className屬性。同時,Cluster中還需要分別定義一個Channel和ClusterListener元素。    15.1、Channel  用于Cluster中給集群中同一組中的節(jié)點定義通信“信道”。Channel中需要至少定義Membership、Receiver和Sender三個元素,此外還有一個可選元素Interceptor。    15.2、Membership  用于Channel中配置同一通信信道上節(jié)點集群組中的成員情況,即監(jiān)控加入當(dāng)前集群組中的節(jié)點并在各節(jié)點間傳遞心跳信息,而且可以在接收不到某成員的心跳信息時將其從集群節(jié)點中移除。Tomcat6中Membership的實現(xiàn)是org.apache.catalina.tribes.membership.McastService。    15.3、Sender  用于Channel中配置“復(fù)制信息”的發(fā)送器,實現(xiàn)發(fā)送需要同步給其它節(jié)點的數(shù)據(jù)至集群中的其它節(jié)點。發(fā)送器不需要屬性的定義,但可以在其內(nèi)部定義一個Transport元素。    15.4 Transport  用于Sender內(nèi)部,配置數(shù)據(jù)如何發(fā)送至集群中的其它節(jié)點。Tomcat6有兩種Transport的實現(xiàn):  1) PooledMultiSender  基于Java阻塞式IO,可以將一次將多個信息并發(fā)發(fā)送至其它節(jié)點,但一次只能傳送給一個節(jié)點。  2)PooledParallelSener  基于Java非阻塞式IO,即NIO,可以一次發(fā)送多個信息至一個或多個節(jié)點。    15.5 Receiver  用于Channel定義某節(jié)點如何從其它節(jié)點的Sender接收復(fù)制數(shù)據(jù),Tomcat6中實現(xiàn)的接收方式有兩種BioReceiver和NioReceiver。    二、web.xml文件  web.xml基于Java Servlet規(guī)范,可被用于每一個Java servlet容器,通常有兩個存放位置,$CATALINA_BASE/conf和每個Web應(yīng)用程序(通常是WEB-INF/web.xml)。Tomcat在deploy一個應(yīng)用程序時(包括重啟或重新載入),它首先讀取conf/web.xml,而后讀取WEB-INF/web.xml。    啟用manager功能:  編輯tomcat-user.xml,添加如下行:            而后重啟tomcat。    啟用host-manager和server status功能:        startup腳本:  #!/bin/sh  # Tomcat init script for Linux.  #  # chkconfig: 2345 96 14  # description: The Apache Tomcat servlet/JSP container.  JAVA_OPTS='-Xms64m -Xmx128m'  JAVA_HOME=/usr/java/jdk1.7.0_05  CATALINA_HOME=/usr/local/apache-tomcat-7.0.29  export JAVA_HOME CATALINA_HOME  exec $CATALINA_HOME/bin/catalina.sh $*    APR即Apache Portable Runtime,原來是apache2的一個庫,后來被獨立成了一個項目。基于此庫文件,Tomcat可以表現(xiàn)出更好的穩(wěn)定性和性能,尤其是Tomcat作為apache的后端Servlet容器時。    事先安裝apr-devel包,而后編譯安裝tomcat的APR JNI。安裝方法如下:  # cd  $CATALINA_HOME/bin  # tar xf tomcat-native.tar.gz  # cd tomcat-native-1.1.22-src/jni/native/  # ./configure --with-apr=/usr --with-ssl --with-apxs  # make && make install    # echo "/usr/local/apr/lib/" > /etc/ld.so.conf.d/apr.conf  # ldconfig    應(yīng)用程序:  jforum  java center home    配置tomcat啟用Manager        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    添加一個新的Host:  編輯server.xml:                              列出所有Deployed的Web應(yīng)用程序:  http://{ hostname }:{ portnumber }/manager/list    Tomcat的連接器分為兩類:HTTP連接器和Web服務(wù)器連接器。    Tomcat的HTTP連接器有三種:  1) 基于java的HTTP/1.1連接器,這也是Tomcat6默認使用的連接器,即Coyote;它是Tomcat作為standalone模式工作時所用到的連接器,可直接響應(yīng)來自用戶瀏覽器的關(guān)于JSP、servlet和HTML的請求;此連接器是一個Java類,定義在server.xml當(dāng)中,默認使用8080端口;  2) Java開發(fā)的高性能NIO HTTP/1.1連接器,它支持非阻塞式IO和Comnet,在基于庫向tomcat發(fā)起請求時,此連接器表現(xiàn)不俗;但其實現(xiàn)不太成熟,有嚴重bug存在;  3) C/C++開發(fā)的native APR HTTP/1.1連接器;在負載較大的場景中,此連接器可以提供非常好的性能;APR即Apache Portable Runtime,它是一個能讓開發(fā)者采用與平臺無關(guān)的風(fēng)格的方式來開發(fā)C/C++代碼本地庫,它能夠很好的跨Windows,     Linux和*nix平臺工作。此連接器從三個主要方面優(yōu)化了系統(tǒng)性能并提升了系統(tǒng)的伸縮能力:(1)使用sendfile()內(nèi)核模式調(diào)用發(fā)送大的靜態(tài)文件;(2) 僅使用一個native code保持大量的連接;(3) 使用能夠加速SSL請求處理的OpenSSL本地代碼;    啟用APR連接器的條件:  1) 將連接器的protocol屬性設(shè)定為org.apache.coyote.http11.Http11AprProtocol;  2) APR的庫文件已經(jīng)在系統(tǒng)庫文件的搜索路徑內(nèi);    基于連接器提供Tomcat6性能的方法:  1) 設(shè)置tcpNoDelay屬性值為“true”;  2) 通過maxKeepAliveRequest屬性調(diào)整允許keep-alive功能的請求的最大數(shù)目,值為1時表示禁用;  3) 調(diào)整socketBuffer屬性的值以改變套接字緩沖的大小;  4) 將enableLookups設(shè)置為false以禁用DNS反解;  5) Tomcat是一個多線程的Servlet容器,使用線程池能對服務(wù)器性能帶去很大影響;這主要通過maxThreads、maxSpareThreads和minSpareThreads來定義;  6) 通過JAVA_OPTS,如-Xms和-Xmx設(shè)定JVM相關(guān)的參數(shù)以定義其使用內(nèi)存的能力;    AJP(Apache JServ Protocol):  AJP是面向數(shù)據(jù)包的基于TCP/IP的協(xié)議,它在Apache和Tomcat的實例之間提供了一個專用的通信信道。目前常用AJP協(xié)議的版本是1.3,它主要有以下特征:  1) 在快速網(wǎng)絡(luò)有著較好的性能表現(xiàn),支持數(shù)據(jù)壓縮傳輸;  2) 支持SSL,加密及客戶端證書;  3) 支持Tomcat實例集群;  4) 支持在apache和tomcat之間的連接的重用;    Apache可以通過mod_jk和mod_proxy模塊跟Tomcat整合,但mod_proxy只有在apache 2.2.x系列的版本才直接提供,但它可以提供更豐富的功能和安全性;而對于apache 1.3.x和2.0.x來說mod_jk才更適用。    配置apache通過mod_proxy模塊與Tomcat連接:    1、檢測當(dāng)前的apache是否支持mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module模塊:  # httpd -D DUMP_MODULES   ……………………   proxy_module (shared)   proxy_balancer_module (shared)   proxy_ftp_module (shared)   proxy_http_module (shared)   proxy_connect_module (shared)   ……………………     2、在httpd.conf的全局配置段或虛擬主機中添加如下內(nèi)容:  ProxyVia On  ProxyRequests Off  ProxyPreserveHost On      Order deny,allow    Allow from all    ProxyPass /examples/jsp ajp://172.16.100.1:8009/examples/jsp  ProxyPassReverse /examples/jsp ajp://172.16.100.1:8009/examples/jsp      Order allow,deny    Allow from all      配置apache和tomcat一起工作:    1、編譯安裝apache:  # ./configure --prefix=/usr/local/apache --enable-proxy --enable-proxy-http --enable-proxy-ajp    2、配置apache加載相應(yīng)的模塊:  LoadModule proxy_module modules/mod_proxy.so  LoadModule proxy_http_module modules/mod_proxy_http.so  LoadModule proxy_ajp_module modules/mod_proxy_ajp.so    3、配置apache代理tomcat:    第一種方法,基于proxy-http:  ProxyPass /my-webapp http://www.magedu.com:8080/my-webapp  ProxyPassReverse /my-webapp http://www.magedu.com:8080/my-webapp  ProxyVia On    第二種方法,基于proxy-ajp:  ProxyPass /my-webapp ajp://tomcathost:8009/my-webapp  ProxyPassReverse /my-webapp ajp://tomcathost:8009/my-webapp  ProxyVia On    4、確保tomcat配置有如上使用的連接器;    tar xf httpd-2.4.2  cd httpd-2.4.2  ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util  --enable-proxy --enable-proxy-http --enable-proxy-ajp  make && make install     tar xf tomcat-connectors-1.2.37-src.tar.gz   cd tomcat-connectors-1.2.37-src/native/  ./configure --with-apxs=/usr/local/apache/bin/apxs   make && make install    server端session:  1、service向用戶瀏覽器發(fā)送cookie,此cookie包含獲取服務(wù)端session的標識。  2、向用戶通過瀏覽器請求同一站點的頁面時,相應(yīng)的cookie信息會隨之發(fā)送。  3、server從cookie信息中識別出與此瀏覽器相關(guān)的session標識,從而判別出當(dāng)前server上此瀏覽器的session信息。    在用戶瀏覽器不支持cookie的場景中,也可以基于URL重寫實現(xiàn)session功能。簡單來講就是server端通過為任何一個響應(yīng)給用戶的URL附加上session id的方式來標識用戶請求。    不過需要注意的是,每個瀏覽器進程都會各自管理各自跟服務(wù)端的會話ID,因此,在服務(wù)器端看來,同一個客戶端上的多個瀏覽器進程會被識別成不同的客戶端。    2012年7月7號:  Tomcat7的配置文件(conf目錄中):  catalina.policy: Tomcat7的安全策略,用于JVM強制將安全策略施加于Webapp;  catalina.properties: Tomcat啟動時會掃描此文件,它包括共享的server、shared loader及JAR等;  server.xml: 主配置文件之一,包含了諸多的重要配置,如IP地址、端口、虛擬主機、context路徑等;  tomcat-users.xml: 基于角色實現(xiàn)的認證及授權(quán)相關(guān)的文件;  logging.properties: Tomcat實例的日志相關(guān)的定義;  web.xml:定義tomcat實例啟動時為所有裝載至當(dāng)前實例中的webapp定義的默認屬性值;當(dāng)然,某webapp也可以定義自己的屬性來替代這里的默認值;  context.xml:     JDBC: (Java Database Connectivity) 基于java的數(shù)據(jù)庫訪問接口, 即用于讓客戶端訪問數(shù)據(jù)庫的API;  JNDI:(Java Naming and Directory Interface), JAVA的API之一,用于向java語言編寫的應(yīng)用程序提供命名及目錄的功能;  DataSource: 用于通過JDBC API連接關(guān)系型數(shù)據(jù)庫的Java對象,通常需要整合進JNDI并將數(shù)據(jù)源對象注冊為一個JNDI的名稱服務(wù);這樣對象可以被程序自身訪問,并用于連接至數(shù)據(jù)庫;一般說來,tomcat7連接至任何數(shù)據(jù)時通常需要提供以下幾個參數(shù):    IP地址    端口號    JNDI名稱    數(shù)據(jù)庫用戶名及其密碼  DBCP:(Dababase Connection Pool), 其通常位于TOMCAT_HOME或CATALINA_HOME/lib/tomcat-dbcp.jar中,用于實現(xiàn)連接池;    Tomcat Manager:  tomcat強大的管理工具,具有以下特性:    遠程deploy新應(yīng)用程序    清理空閑會話    在不重啟container的情況下Undeploy應(yīng)用程序    分析內(nèi)存泄漏    JVM狀態(tài)    服務(wù)器狀態(tài)      然而,在tomcat7中,TM默認是禁用的。要啟用之,需要編輯tomcat-users.xml文件;    Context:  對于應(yīng)用程序來說,context路徑是一個關(guān)鍵屬性,其也經(jīng)常用于虛擬主機的配置及.war文件中的URL映射。使用context可以降低系統(tǒng)負載,因為,當(dāng)某URL請求到達tomcat時,如果沒有context,tomcat需要搜索server.xml或context.xml的配置以確定此URL,否則則需要搜索所有的war文件來查找用戶的請求的資源。    此外,context也可以讓管理員基于每個app提供日志、appBase、DB連接等配置,這極大地增強配置的靈活性;    應(yīng)用程序目錄的結(jié)構(gòu):  /WEB-INF/web.xml:包含當(dāng)前webapp的deploy描述符,如所有的servlets和JSP等動態(tài)文件的詳細信息,會話超時時間和數(shù)據(jù)源等;因此,其也通常用于定義當(dāng)前webapp特有的資源;  /WEB-INF/classes: 包含所有服務(wù)器端類及當(dāng)前應(yīng)用程序相關(guān)的其它第三方類等;  /WEB-INF/lib: 包含JSP所用到的JAR文件;    用于tomcat的webapp即可以多個獨立的文件組成,也可以是jar打包后的單個文件;這些打包后的文件的擴展名可用于判斷其內(nèi)容的類型,如:    EJB通常打包為.jar    webapp通常打包為.war    資源適配器(Resource adapters)通常打包為.rar    企業(yè)級應(yīng)用程序通常打包為.ear,它通常是整合的EJB、webapp及資源適配器文件;    Web服務(wù)通常會打包為.ear或.war;      于是,到底應(yīng)該使用展開格式的文件還是打包為單個文件的格式,就需要根據(jù)需要進行了。一般說來,如果滿足以下場景,就應(yīng)該使用展開后的格式,而非打包格式:  1、需要在將來的某個時候更新應(yīng)用程序中的部分內(nèi)容;使用展開的格式可以避免重新deploy應(yīng)用程序;  2、期望使用Tomcat Manager來動態(tài)編輯及選擇deployment descriptor值;  3、應(yīng)用程序中包含靜態(tài)文件,而這些靜態(tài)文件需要定期更新;    Deploy應(yīng)用程序所涉及到的操作:  Deploy: 向tomcat實例提供某應(yīng)用程序源文件,并讓服務(wù)器將類加載進類加器中;這樣,應(yīng)用程序才可以為用戶所使用;  Redeploy:用于更新deployment后的某應(yīng)用程序或應(yīng)用程序的部分內(nèi)容;當(dāng)redeploy整個應(yīng)用程序時,當(dāng)前應(yīng)用程序的所有模塊都必須要redeploy成功,否則整個webapp將會停止 ;  Stop: 卸載當(dāng)前應(yīng)用程序的所有類,并停止向用戶提供服務(wù);不過,其仍然會保留所有已deploy的文件及名稱,并可用于后續(xù)的redeployment或starting;  Start: 重新裝載當(dāng)前應(yīng)用的類至類加載器,并開啟服務(wù);  Undeploy: 停止某已經(jīng)deploy的應(yīng)用程序,并移除deploy產(chǎn)生的文件和名稱;    Tomcat7 deploy應(yīng)用程序的方法:  War格式的應(yīng)用程序:將應(yīng)用程序war文件放置于CATALINA_BASE目錄中并重新啟動tomcat;  沒打包的應(yīng)用程序:將應(yīng)用程序的非歸檔文件旋轉(zhuǎn)于CATALINA_BASE目錄中;  Tomcat Manager:登錄TM而后進行deploy;    telnet webserver    GET / HTTP/1.1  HOST:localhost  Connection:{Keep-Alive|Close}    <%@ page language="java" %>  <%@ page import="java.util.*" %>      <% out.println("Hello,world!"); %>    # mkdir /usr/local/tcinstance2  # cd /usr/local/tcinstance2  # cp -a $CATALINA_HOME/conf .  # mkdir common logs temp server shared webapps work    server.xml:          # set CATALINA_BASE="/usr/local/tcinstance2"  # set CATALINA_HOME="/usr/local/tomcat"  # export CATALINA_BASE CATALINA_HOME  # service tomcat start # Standard way to start on Linux    http://172.16.100.1/manager/html:   http://172.16.100.1/manager/text  http://172.16.100.1/manager/status    會話管理:  標準會話管理器和持久會話管理器    標準會話管理器(StandardManager):      默認保存于$CATALINA_HOME/work/Catalina///下的SESSIONS.ser文件中。    maxActiveSessions:最多允許的活動會話數(shù)量,默認為-1,表示不限制;   maxInactiveInterval:非活動的會話超時時長,默認為60s;  pathname:會話文件的保存目錄;    持久會話管理器(PersistentManager):  將會話數(shù)據(jù)保存至持久存儲中,并且能在服務(wù)器意外中止后重新啟動時重新加載這些會話信息。持久會話管理器支持將會話保存至文件存儲(FileStore)或JDBC存儲(JDBCStore)中。    保存至文件中的示例:            每個用戶的會話會被保存至directory指定的目錄中的文件中,文件名為.session,并通過后臺線程每隔一段時間(checkInterval參數(shù)定義,默認為60秒)檢查一次超時會話。    保存至JDBCStore中的示例:            安裝apache    6.4.1 安裝apr和apr-util    可以從http://apr.apache.org/獲取apr源碼,目前最新的版本是1.4.6。  [root@www.magedu.com  ~]# tar  xf  apr-1.4.6.tar.bz2  [root@www.magedu.com  ~]# cd apr-1.4.6  [root@www.magedu.com  ~]# ./configure --prefix=/usr/local/apr --disable-ipv6  [root@www.magedu.com  ~]# make && make install    apr-util是apr的工具庫,其可以讓程序員更好的使用apr的功能。可以從http://apr.apache.org/獲取apr源碼,目前最新的版本是1.4.1。  [root@www.magedu.com  ~]# tar xf apr-util-1.4.1.tar.bz2  [root@www.magedu.com  ~]# cd apr-util-1.4.1  [root@www apr-util-1.4.1]#  ./configure  --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr  [root@www apr-util-1.4.1]#  make && make install    6.4.2 安裝apache    httpd目前最新的2.4系列版本中引入了event MPM,其在性能上較之其它MPM有了較大的提升,  [root@www.magedu.com  ~]# tar xf httpd-2.4.2  [root@www.magedu.com  ~]# cd httpd-2.4.2  [root@www.magedu.com  ~]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer  --enable-lbmethod-heartbeat --enable-heartbeat --enable-slotmem-shm  --enable-slotmem-plain --enable-watchdog  [root@www.magedu.com  ~]# make && make install    為apache提供init腳本,實現(xiàn)服務(wù)的控制。建立/etc/rc.d/init.d/httpd文件,并添加如下內(nèi)容:    這是個腳本文件,因此需要執(zhí)行權(quán)限;同時,為了讓httpd服務(wù)能夠開機自動啟動,還需要將其添加至服務(wù)列表,并設(shè)置其在3或5級別下自動運行。  chmod  +x  /etc/rc.d/init.d/httpd  chkconfig  --add  httpd  chkconfig  --level  35  httpd  on    6.5  配置apache通過mod_proxy模塊與Tomcat連接    要使用mod_proxy與Tomcat實例連接,需要apache已經(jīng)裝載mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(實現(xiàn)Tomcat集群時用到)等模塊:    # /usr/local/apache/bin/httpd -D DUMP_MODULES | grep  proxy   proxy_module (shared)   proxy_connect_module (shared)   proxy_ftp_module (shared)   proxy_http_module (shared)   proxy_fcgi_module (shared)   proxy_scgi_module (shared)   proxy_ajp_module (shared)   proxy_balancer_module (shared)   proxy_express_module (shared)     2、在httpd.conf的全局配置段或虛擬主機中添加如下內(nèi)容:  ProxyVia Off  ProxyRequests Off  ProxyPreserveHost Off      Require all granted      ProxyPass  /  ajp://172.16.100.1:8009/    ProxyPassReverse  /  ajp://172.16.100.1:8009/      Require all granted      或讓apache跟Tomcat的http連接器進行整合:  ProxyVia Off  ProxyRequests Off  ProxyPass / http://172.16.100.1:8080/  ProxyPassReverse / http://172.16.100.1:8080/      Require all granted        Require all granted      關(guān)于如上apache指令的說明:    ProxyPreserveHost {On|Off}:如果啟用此功能,代理會將用戶請求報文中的Host:行發(fā)送給后端的服務(wù)器,而不再使用ProxyPass指定的服務(wù)器地址。如果想在反向代理中支持虛擬主機,則需要開啟此項,否則就無需打開此功能。    ProxyVia  {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多級代理中控制代理請求的流向。默認為Off,即不啟用此功能;On表示每個請求和響應(yīng)報文均添加Via:;Full表示每個Via:行都會添加當(dāng)前apache服務(wù)器的版本號信息;Block表示每個代理請求報文中的Via:都會被移除。    ProxyRequests {On|Off}:是否開啟apache正向代理的功能;啟用此項時為了代理http協(xié)議必須啟用mod_proxy_http模塊。同時,如果為apache設(shè)置了ProxyPass,則必須將ProxyRequests設(shè)置為Off。    ProxyPass  [path]  !|url  [key=value key=value ...]]:將后端服務(wù)器某URL與當(dāng)前服務(wù)器的某虛擬路徑關(guān)聯(lián)起來作為提供服務(wù)的路徑,path為當(dāng)前服務(wù)器上的某虛擬路徑,url為后端服務(wù)器上某URL路徑。使用此指令時必須將ProxyRequests的值設(shè)置為Off。需要注意的是,如果path以“/”結(jié)尾,則對應(yīng)的url也必須以“/”結(jié)尾,反之亦然。  另外,mod_proxy模塊在httpd 2.1的版本之后支持與后端服務(wù)器的連接池功能,連接在按需創(chuàng)建在可以保存至連接池中以備進一步使用。連接池大小或其它設(shè)定可以通過在ProxyPass中使用key=value的方式定義。常用的key如下所示:  ◇ min:連接池的最小容量,此值與實際連接個數(shù)無關(guān),僅表示連接池最小要初始化的空間大小。  ◇ max:連接池的最大容量,每個MPM都有自己獨立的容量;都值與MPM本身有關(guān),如Prefork的總是為1,而其它的則取決于ThreadsPerChild指令的值。  ◇ loadfactor:用于負載均衡集群配置中,定義對應(yīng)后端服務(wù)器的權(quán)重,取值范圍為1-100。  ◇ retry:當(dāng)apache將請求發(fā)送至后端服務(wù)器得到錯誤響應(yīng)時等待多長時間以后再重試。單位是秒鐘。    如果Proxy指定是以balancer://開頭,即用于負載均衡集群時,其還可以接受一些特殊的參數(shù),如下所示:  ◇lbmethod:apache實現(xiàn)負載均衡的調(diào)度方法,默認是byrequests,即基于權(quán)重將統(tǒng)計請求個數(shù)進行調(diào)度,bytraffic則執(zhí)行基于權(quán)重的流量計數(shù)調(diào)度,bybusyness通過考量每個后端服務(wù)器的當(dāng)前負載進行調(diào)度。  ◇ maxattempts:放棄請求之前實現(xiàn)故障轉(zhuǎn)移的次數(shù),默認為1,其最大值不應(yīng)該大于總的節(jié)點數(shù)。  ◇ nofailover:取值為On或Off,設(shè)置為On時表示后端服務(wù)器故障時,用戶的session將損壞;因此,在后端服務(wù)器不支持session復(fù)制時可將其設(shè)置為On。  ◇ stickysession:調(diào)度器的sticky session的名字,根據(jù)web程序語言的不同,其值為JSESSIONID或PHPSESSIONID。  上述指令除了能在banlancer://或ProxyPass中設(shè)定之外,也可使用ProxySet指令直接進行設(shè)置,如:    BalancerMember  http://www1.magedu.com:8080 loadfactor=1  BalancerMember  http://www2.magedu.com:8080 loadfactor=2  ProxySet  lbmethod=bytraffic      ProxyPassReverse:用于讓apache調(diào)整HTTP重定向響應(yīng)報文中的Location、Content-Location及URI標簽所對應(yīng)的URL,在反向代理環(huán)境中必須使用此指令避免重定向報文繞過proxy服務(wù)器。    6.6  配置apache通過mod_jk模塊與Tomcat連接    mod_jk是ASF的一個項目,是一個工作于apache端基于AJP協(xié)議與Tomcat通信的連接器,它是apache的一個模塊,是AJP協(xié)議的客戶端(服務(wù)端是Tomcat的AJP連接器)。    [root@www.magedu.com  ~]# tar xf tomcat-connectors-1.2.37-src.tar.gz   [root@www.magedu.com  ~]# cd tomcat-connectors-1.2.37-src/native/  [root@www.magedu.com  ~]# ./configure --with-apxs=/usr/local/apache/bin/apxs   [root@www.magedu.com  ~]# make && make install    apache要使用mod_jk連接器,需要在啟動時加載此連接器模塊。為了便于管理與mod_jk模塊相關(guān)的配置,這里使用一個專門的配置文件/etc/httpd/extra/httpd-jk.conf來保存相關(guān)指令及其設(shè)置。其內(nèi)容如下:  # Load the mod_jk  LoadModule  jk_module  modules/mod_jk.so  JkWorkersFile  /etc/httpd/extra/workers.properties  JkLogFile  logs/mod_jk.log  JkLogLevel  debug  JkMount  /*  TomcatA  JkMount  /status/  stat1    除了需要使用LoadModule指令在apache中裝載模塊外,mod_jk還需要在apache的主配置文件中設(shè)置其它一些指令來配置其工作屬性。如JkWorkersFile則用于指定保存了worker相關(guān)工作屬性定義的配置文件,JkLogFile則用于指定mod_jk模塊的日志文件,JkLogLevel則可用于指定日志的級別(info, error, debug),此外還可以使用JkRequestLogFormat自定義日志信息格式。而JkMount(格式: JkMount    )指定則用于控制URL與Tomcat workers的對應(yīng)關(guān)系。    為了讓apache能使用/etc/httpd/extra/httpd-jk.conf配置文件中的配置信息,需要編輯/etc/httpd/httpd.conf,添加如下一行:  Include  /etc/httpd/extra/httpd-jk.conf    對于apache代理來說,每一個后端的Tomcat實例中的engine都可以視作一個worker,而每一個worker的地址、連接器的端口等信息都需要在apache端指定以便apache可以識別并使用這些worker。約定俗成,配置這些信息的文件通常為workers.properties,其具體路徑則是使用前面介紹過的JkWorkersFile指定的,在apache啟動時,mod_jk會掃描此文件獲取每一個worker的配置信息。比如,我們這里使用/etc/httpd/extra/workers.properties。    workers.properties文件一般由兩類指令組成:一是mod_jk可以連接的各worker名稱列表,二是每一個worker的屬性配置信息。它們分別遵循如下使用語法。    worker.list = < a comma separated list of worker names >  worker.  . =     其中worker.list指令可以重復(fù)指定多次,而worker name則是Tomcat中engine組件jvmRoute參數(shù)的值。如:  worker.TomcatA.host=172.16.100.1    根據(jù)其工作機制的不同,worker有多種不同的類型,這是需要為每個worker定義的一項屬性woker..type。常見的類型如下:  ◇ ajp13:此類型表示當(dāng)前worker為一個運行著的Tomcat實例。  ◇ lb:lb即load balancing,專用于負載均衡場景中的woker;此worker并不真正負責(zé)處理用戶請求,而是將用戶請求調(diào)度給其它類型為ajp13的worker。  ◇   status:用戶顯示分布式環(huán)境中各實際worker工作狀態(tài)的特殊worker,它不處理任何請求,也不關(guān)聯(lián)到任何實際工作的worker實例。具體示例如請參見后文中的配置。    worker其它常見的屬性說明:  ◇ host:Tomcat 7的worker實例所在的主機;  ◇ port:Tomcat 7實例上AJP1.3連接器的端口;  ◇ connection_pool_minsize:最少要保存在連接池中的連接的個數(shù);默認為pool_size/2;  ◇ connection_pool_timeout:連接池中連接的超時時長;  ◇ mount:由當(dāng)前worker提供的context路徑,如果有多個則使用空格格開;此屬性可以由JkMount指令替代;  ◇ retries:錯誤發(fā)生時的重試次數(shù);  ◇ socket_timeout:mod_jk等待worker響應(yīng)的時長,默認為0,即無限等待;  ◇ socket_keepalive:是否啟用keep alive的功能,1表示啟用,0表示禁用;  ◇ lbfactor:worker的權(quán)重,可以在負載均衡的應(yīng)用場景中為worker定義此屬性;    另外,在負載均衡模式中,專用的屬性還有:  ◇balance_workers:用于負載均衡模式中的各worker的名稱列表,需要注意的是,出現(xiàn)在此處的worker名稱一定不能在任何worker.list屬性列表中定義過,并且worker.list屬性中定義的worker名字必須包含負載均衡worker。具體示例請參見后文中的定義。  ◇ method:可以設(shè)定為R、T或B;默認為R,即根據(jù)請求的個數(shù)進行調(diào)度;T表示根據(jù)已經(jīng)發(fā)送給worker的實際流量大小進行調(diào)度;B表示根據(jù)實際負載情況進行調(diào)度。  ◇sticky_session:在將某請求調(diào)度至某worker后,源于此址的所有后續(xù)請求都將直接調(diào)度至此worker,實現(xiàn)將用戶session與某worker綁定。默認為值為1,即啟用此功能。如果后端的各worker之間支持session復(fù)制,則可以將此屬性值設(shè)為0。    根據(jù)前文中的指定,這里使用/etc/httpd/extra/workers.properties來定義一個名為TomcatA的worker,并為其指定幾個屬性。文件內(nèi)容如下:  worker.list=TomcatA,stat1  worker.TomcatA.port=8009  worker.TomcatA.host=172.16.100.1  worker.TomcatA.type=ajp13  worker.TomcatA.lbfactor=1  worker.stat1.type = status    至此,一個基于mod_jk模塊與后端名為TomcatA的worker通信的配置已經(jīng)完成,重啟httpd服務(wù)即可生效。    配置基于mod_jk的負載均衡    1、  為了避免用戶直接訪問后端Tomcat實例,影響負載均衡的效果,建議在Tomcat 7的各實例上禁用HTTP/1.1連接器。  2、為每一個Tomcat 7實例的引擎添加jvmRoute參數(shù),并通過其為當(dāng)前引擎設(shè)置全局惟一標識符。如下所示。需要注意的是,每一個實例的jvmRoute的值均不能相同。      而后去配置apache,修改/etc/httpd/extra/httpd-jk.conf為如下內(nèi)容:  LoadModule  jk_module  modules/mod_jk.so  JkWorkersFile  /etc/httpd/extra/workers.properties  JkLogFile  logs/mod_jk.log  JkLogLevel  debug  JkMount  /*  lbcluster1  JkMount  /jkstatus/  stat1    編輯/etc/httpd/extra/workers.properties,添加如下內(nèi)容:  worker.list = lbcluster1,stat1  worker.TomcatA.type = ajp13  worker.TomcatA.host = 172.16.100.1  worker.TomcatA.port = 8009  worker.TomcatA.lbfactor = 5  worker.TomcatB.type = ajp13  worker.TomcatB.host = 172.16.100.2  worker.TomcatB.port = 8009  worker.TomcatB.lbfactor = 5  worker.lbcluster1.type = lb  worker.lbcluster1.sticky_session = 1  worker.lbcluster1.balance_workers = TomcatA, TomcatB  worker.stat1.type = status    演示效果,在TomcatA上某context中(如/test),提供如下頁面  <%@ page language="java" %>

        TomcatA

        <% session.setAttribute("abc","abc"); %>
         Session ID<%= session.getId() %> 
         

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 久久免费国产精品一区二区| 日韩在线精品一二三区| 狠狠色伊人久久精品综合网| 国产精品vⅰdeoxxxx国产| 亚洲AV蜜桃永久无码精品| 亚洲色图国产精品| 国产麻豆一精品一AV一免费| 亚洲午夜精品久久久久久app | 在线精品亚洲| 精品国产青草久久久久福利 | 国产成人精品免费视频网页大全| 亚洲国产精品成人久久蜜臀| 国产三级国产精品国产普男人| 精品久久久久久中文字幕| 精品久久久久久无码中文字幕一区| 亚洲精品无码久久毛片| 欧美精品一区二区在线精品 | 精品黑人一区二区三区| 亚洲精品午夜无码电影网| 精品乱码久久久久久夜夜嗨| 国产精品日韩欧美在线第3页| 热99re久久国超精品首页| 国产乱码精品一区二区三区四川人| 国产精品无码日韩欧| 国语自产精品视频在线区| 欧美精品黑人粗大免费| 亚洲AV无码久久精品色欲| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 精品国产国产综合精品| 国产亚洲精品影视在线产品| 国产精品网址在线观看你懂的 | 国产精品美女久久久网AV| 日韩麻豆国产精品欧美| 亚洲欧美精品伊人久久| 国产精品 码ls字幕影视| 99久久国产主播综合精品| 国产精品 视频一区 二区三区| 国产亚洲精品影视在线产品| 久久精品一区二区三区中文字幕 | 国产欧美精品一区二区色综合| 国产午夜亚洲精品理论片不卡 |