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