jjklm

          Tomcat詳解

          轉(zhuǎn)載 http://blog.csdn.net/DarkXie/archive/2004/10/25/TOMCATAPP.aspx
          謹(jǐn)以此文送給所有正在使用TOMCAT或者打算使用的人們,向TOMCAT的所有開發(fā)人員致敬!

          以下的文章全部是摘自另外一位仁兄的BLOG,叫什么忘了,真是不好意思啊~~~~~~

          一、小貓TOMCAT其實很可愛

          2003年底,我換公司了,同樣也換了WEBAPP,TOMCAT出現(xiàn)在我的面前(以前使用weblogic),我有點(diǎn)茫然,免費(fèi)的東西真的能用的好么?擔(dān)心ING......(其實是在火星呆太久)出門一打聽,原來此貓出自名門-jakarta項目,2001年度最具創(chuàng)新的java產(chǎn)品(Most Innovative Java Product),又有JAVA的老大SUN的力捧(官方推薦的servlet和jsp容器),以后就靠它吃飯了。不說二話,搞起來先:

          1、 安裝

          TOMCAT最新版本是5.0.29(http://jakarta.apache.org/site/binindex.cgi

          如果在WINDOWS下它可以自動找到你的JDK或者set JAVA_HOME=c:/jdk

          在LINUX下需要先解壓,然后設(shè)置JAVA_HOME

          export JAVA_HOME=/usr/local/jdk

          2、 RUN

          設(shè)置完畢后就可以運(yùn)行tomcat服務(wù)器了,進(jìn)入tomcat的bin目錄,WINDOWS下用startup啟動tomcat,linux下用startup.sh,相應(yīng)的關(guān)閉tomcat的命令為shutdown和shutdown.sh。

          啟動服務(wù)后在瀏覽器里輸入http://localhost:8080來測試一下

          3、 目錄結(jié)構(gòu)

          Bin:存放啟動和關(guān)閉tomcat腳本。

          Conf:包含不同的配置文件,server.xml(Tomcat的主要配置文件)。

          Work:存放jsp編譯后產(chǎn)生的class文件。

          Webapp:存放應(yīng)用程序示例,以后你要部署的應(yīng)用程序也要放到此目錄。

          Logs:存放日志文件

          Comm./server/shared:這三個文件夾下的LIB文件夾放jar文件。

          1、 配置server.xml文件

          沒有什么好說的,看TOMCAT的文檔比較有用,這里提供一些主要的東西吧。

          元素名
          屬性
          解釋

          server
          port
          指定一個端口,這個端口負(fù)責(zé)監(jiān)聽關(guān)閉tomcat的請求

          shutdown
          指定向端口發(fā)送的命令字符串

          service
          name
          指定service的名字

          Connector(表示客戶端和service之間的連接)
          port
          指定服務(wù)器端要創(chuàng)建的端口號,并在這個斷口監(jiān)聽來自客戶端的請求

          minProcessors
          服務(wù)器啟動時創(chuàng)建的處理請求的線程數(shù)

          maxProcessors
          最大可以創(chuàng)建的處理請求的線程數(shù)

          enableLookups
          如果為true,則可以通過調(diào)用request.getRemoteHost()進(jìn)行DNS查詢來得到遠(yuǎn)程客戶端的實際主機(jī)名,若為false則不進(jìn)行DNS查詢,而是返回其ip地址

          redirectPort
          指定服務(wù)器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號

          acceptCount
          指定當(dāng)所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理

          connectionTimeout
          指定超時的時間數(shù)(以毫秒為單位)

          Engine(表示指定service中的請求處理機(jī),接收和處理來自Connector的請求)
          defaultHost
          指定缺省的處理請求的主機(jī)名,它至少與其中的一個host元素的name屬性值是一樣的

          Context(表示一個web應(yīng)用程序,通常為WAR文件,關(guān)于WAR的具體信息見servlet規(guī)范)
          docBase
          應(yīng)用程序的路徑或者是WAR文件存放的路徑

          path
          表示此web應(yīng)用程序的url的前綴,這樣請求的url為http://localhost:8080/path/****

          reloadable
          這個屬性非常重要,如果為true,則tomcat會自動檢測應(yīng)用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應(yīng)用程序,我們可以在不重起tomcat的情況下改變應(yīng)用程序

          host(表示一個虛擬主機(jī))
          name
          指定主機(jī)名

          appBase
          應(yīng)用程序基本目錄,即存放應(yīng)用程序的目錄

          unpackWARs
          如果為true,則tomcat會自動將WAR文件解壓,否則不解壓,直接從WAR文件中運(yùn)行應(yīng)用程序

          Logger(表示日志,調(diào)試和錯誤信息)
          className
          指定logger使用的類名,此類必須實現(xiàn)org.apache.catalina.Logger 接口

          prefix
          指定log文件的前綴

          suffix
          指定log文件的后綴

          timestamp
          如果為true,則log文件名中要加入時間,如下例:localhost_log.2001-10-04.txt

          Realm(表示存放用戶名,密碼及role的數(shù)據(jù)庫)
          className
          指定Realm使用的類名,此類必須實現(xiàn)org.apache.catalina.Realm接口

          Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣)
          className
          指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應(yīng)用程序的訪問信息

          directory
          指定log文件存放的位置

          pattern
          有兩個值,common方式記錄遠(yuǎn)程主機(jī)名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應(yīng)代碼,發(fā)送的字節(jié)數(shù)。combined方式比common方式記錄的值更多

          ?


          2、 管理

          TOMCAT管理能力很強(qiáng)大,進(jìn)入http://localhost:8080/,自己慢慢管吧。實踐出真知,我喜歡這樣搞:

          ^_^,一切盡在掌握http://localhost:8080/manager/html

          ?

          一、讓數(shù)據(jù)庫連接池轉(zhuǎn)起來

          作為一個J2EE程序員大家手上可能會有現(xiàn)成的JDBC 數(shù)據(jù)庫連接池,其實這沒有太大的必要,因為象weblogic......企業(yè)級WEBAPP都有自己的連接池,大家不要費(fèi)力直接使用吧,效率也很不錯,再也不用羨慕.NET的ADO了(以前作MS從來不擔(dān)心數(shù)據(jù)連接,ADO確實用起來很爽),如果想實現(xiàn)一個 JDBC connection pool 的注意事項有:

          1. 有一個簡單的函數(shù)從連接池中得到一個 Connection。

          2. close 函數(shù)必須將 connection 放回 數(shù)據(jù)庫連接池。

          3. 當(dāng)數(shù)據(jù)庫連接池中沒有空閑的 connection, 數(shù)據(jù)庫連接池必須能夠自動增加 connection 個數(shù)。

          4. 當(dāng)數(shù)據(jù)庫連接池中的 connection 個數(shù)在某一個特別的時間變得很大,但是以后很長時間只用其中一小部分,應(yīng)該可以自動將多余的 connection 關(guān)閉掉。

          5. 如果可能,應(yīng)該提供debug 信息報告沒有關(guān)閉的 new Connection 。

          網(wǎng)上有各種各樣的連接池代碼,抄過來改改吧,嘿嘿~

          ?

          這里介紹如何配置TOMCAT的連接池,以SQLSERVER為例:

          步驟1:安裝SQLSERVER的JDBC驅(qū)動

          SQLSERVER的JDBC驅(qū)動其實就是三個JAR文件,msbase.jar/mssqlserver.jar/msutil.jar,將這三個文件拷貝到你的/tomcat_home/common/lib目錄下去就可以了。

          步驟2:修改server.xml文件

          具體代碼如下:

          <Context path="test" docBase="F:\yourroot" debug="5" reloadable="true" crossContext="true">

          <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_DBTest_log." suffix=".txt" timestamp="true"/>

          <Resource name="jdbc/SqlServerDB" auth="Container" type="javax.sql.DataSource"/>

          <ResourceParams name="jdbc/SqlServerDB">

          <parameter>

          <name>factory</name>

          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

          </parameter>

          <!-- Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle all of your db connections. Set to 0 for no limit.-->

          <parameter>

          <name>maxActive</name>

          <value>50</value>

          </parameter>

          <!-- Maximum number of idle dB connections to retain in pool. Set to 0 for no limit.-->

          <parameter>

          <name>maxIdle</name>

          <value>20</value>

          </parameter>

          <!-- Maximum time to wait for a dB connection to become available in ms, in this example 0.5 seconds. An Exception is thrown if this timeout is exceeded. Set to -1 to wait indefinitely. -->

          <parameter>

          <name>maxWait</name>

          <value>500</value>

          </parameter>

          <!-- msSQL dB username and password for dB connections -->

          <parameter>

          <name>username</name>

          <value>sa</value>

          </parameter>

          ?

          <parameter>

          <name>password</name>

          <value>sa</value>

          </parameter>

          <!-- Class name for SQLServer2000 JDBC driver -->

          <parameter>

          <name>driverClassName</name>

          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>

          </parameter>

          <!-- The JDBC connection url for connecting to your MS SQL Server dB.The autoReconnect=true argument to the url makes sure that the mm.Sql Server JDBC Driver will automatically reconnect if mysqld closed the connection. mysqld by default closes idle connections after 8 hours.-->

          <parameter>

          <name>url</name>

          <value>jdbc:microsoft:sqlserver://10.0.254.11:1433;databaseName=yourdb</value>

          <!--must use & not use & -->

          </parameter>

          </ResourceParams>

          </Context>

          步驟三:程序調(diào)用

          package dbmanage;

          ?

          import java.sql.CallableStatement;

          import java.sql.Connection;

          import java.sql.Date;

          import java.sql.PreparedStatement;

          import java.sql.ResultSet;

          import java.sql.SQLException;

          import java.sql.Statement;

          import java.util.Enumeration;

          import java.util.Hashtable;

          import java.util.Vector;

          import javax.naming.Context;

          import javax.naming.InitialContext;

          import javax.sql.DataSource;

          ?

          import util.smartDateFormat;

          ?

          ?

          public class dbManager {

          /************************************

          * @param static private boolean VERBOSE ;

          * @param Statement theStatement;

          * @param PreparedStatement thePstmt;

          * @param Connection theConnection;

          ************************************/

          final static private boolean VERBOSE = true; //打印控制臺控制

          ?

          //static Logger logger = Logger.getLogger(dbManager.class.getName());

          private Context initCtx = null;

          private Context ctx = null;

          private DataSource ds = null;

          ?

          private long timeout = 5000;

          ?

          private Statement theStatement = null;

          private PreparedStatement thePstmt = null;

          ?

          /************************************

          * 初試化initCtx

          * 取得數(shù)據(jù)源對象

          ************************************/

          public

          dbManager() {

          try {

          initCtx = new InitialContext();

          //init context,read config web.xml

          if (initCtx == null) {

          throw new Exception("Initial Failed!");

          }

          ctx = (Context) initCtx.lookup("java:comp/env");

          //find "jdbc/SqlServerDB" object this configruation in the SERVER.XML of Tomcat

          if (ctx != null) {

          ds = (DataSource) ctx.lookup("jdbc/SqlServerDB");

          }

          if (ds == null) {

          throw new Exception("Look up DataSource Failed!");

          }

          }

          catch (Exception e) {

          log(e, "Can't get the Context!");

          }

          }

          ?

          /************************************

          * get Connection

          * @return Connection

          ************************************/

          public synchronized

          Connection getConnection() {

          //get connection and set to delay time

          long startTime = new java.util.Date().getTime();

          Connection con = null;

          while (con == null) {

          con = newConnection();

          if (con != null) {

          //log("Create New Connection!");

          break;

          }

          try {

          log("連接超時,重新連接,等待" + timeout + "ms");

          wait(timeout);

          }

          catch (InterruptedException e) {

          log(e, "連接超時!");

          }

          if ( (new java.util.Date().getTime() - startTime) >= timeout) {

          log("Connection timeout!");

          break;

          }

          }

          return con;

          }

          ?

          private

          Connection newConnection() {

          Connection con = null;

          try {

          con = ds.getConnection();

          if (con == null) {

          throw new Exception("Create Connection Failed!");

          }

          }

          catch (Exception e) {

          log("Create Connection Failed!");

          System.out.println(e.getMessage());

          }

          return con;

          }

          ?

          /************************************

          * release the connection

          * @param conn Connection

          * @param stmt Statement

          * @param pstmt PreparedStatement

          ************************************/

          public synchronized

          void freeConnection(Connection conn,

          Statement stmt,

          PreparedStatement pstmt) {

          try {

          //close Statement

          if (stmt != null) {

          stmt.close();

          stmt = null;

          //log("Close Statement......");

          }

          //close PreparedStatement

          if (pstmt != null) {

          pstmt.close();

          pstmt = null;

          //log("Close PreparedStatement......");

          }

          }

          catch (Exception e) {

          System.out.println(e.getMessage());

          }

          try {

          //close Connection

          if (conn != null) {

          conn.close();

          conn = null;

          //log("Close Connection......");

          }

          }

          catch (SQLException e) {

          log(e, "釋放資源出錯!");

          }

          }

          ?

          ?

          /************************************

          * write log file.

          * @param s String

          ************************************/

          private

          void log(String s) {

          if (VERBOSE) {

          System.out.println(new java.util.Date() + ":" + s);

          //logger.info(new java.util.Date()+s);

          }

          }

          ?

          /************************************

          * write log file.

          * @param ex Object

          ************************************/

          private

          void logerr(Object ex) {

          if (VERBOSE) {

          //System.out.println(new java.util.Date()+":"+s);

          //logger.error(ex);

          }

          }

          ?

          /************************************

          * write log file.

          * @param e Throwable

          * @param msg String

          ************************************/

          private

          void log(Throwable e, String msg) {

          System.out.println(new java.util.Date() + ": " + msg);

          //logger.info(new java.util.Date() + ": " + msg, e);

          }

          ......

          }

          ?

          OK,你現(xiàn)在可以方便的使用連接池了,想要一個得一個,記得要釋放哦,連接池的數(shù)量總是有限的。

          ?

          ?

          二、中文問題照樣很簡單

          每個國家(或區(qū)域)都規(guī)定了計算機(jī)信息交換用的字符編碼集,如美國的擴(kuò)展 ASCII碼, 中國的 GB2312-80,日本的 JIS 等,作為該國家/區(qū)域內(nèi)信息處理的基礎(chǔ),有著統(tǒng)一編碼的重要作用。字符編碼集按長度分為 SBCS(單字節(jié)字符集),DBCS(雙字節(jié)字符集)兩大類。早期的軟件(尤其是操作系統(tǒng)),為了解決本地字符信息的計算機(jī)處理,出現(xiàn)了各種本地化版本(L10N),為了區(qū)分,引進(jìn)了 LANG, Codepage 等概念。但是由于各個本地字符集代碼范圍重疊,相互間信息交換困難;軟件各個本地化版本獨(dú)立維護(hù)成本較高。因此有必要將本地化工作中的共性抽取出來,作一致處理,將特別的本地化處理內(nèi)容降低到最少。這也就是所謂的國際化(I18N)。各種語言信息被進(jìn)一步規(guī)范為 Locale 信息。處理的底層字符集變成了幾乎包含了所有字形的 Unicode。

          現(xiàn)在大部分具有國際化特征的軟件核心字符處理都是以 Unicode 為基礎(chǔ)的,在軟件運(yùn)行時根據(jù)當(dāng)時的 Locale/Lang/Codepage 設(shè)置確定相應(yīng)的本地字符編碼設(shè)置,并依此處理本地字符。在處理過程中需要實現(xiàn) Unicode 和本地字符集的相互轉(zhuǎn)換,甚或以 Unicode 為中間的兩個不同本地字符集的相互轉(zhuǎn)換。這種方式在網(wǎng)絡(luò)環(huán)境下被進(jìn)一步延伸,任何網(wǎng)絡(luò)兩端的字符信息也需要根據(jù)字符集的設(shè)置轉(zhuǎn)換成可接受的內(nèi)容。

          Java 語言內(nèi)部是用 Unicode 表示字符的,遵守 Unicode V2.0。Java 程序無論是從/往文件系統(tǒng)以字符流讀/寫文件,還是往 URL 連接寫 HTML 信息,或從 URL 連接讀取參數(shù)值,都會有字符編碼的轉(zhuǎn)換。這樣做雖然增加了編程的復(fù)雜度,容易引起混淆,但卻是符合國際化的思想的。從理論上來說,這些根據(jù)字符集設(shè)置而進(jìn)行的字符轉(zhuǎn)換不應(yīng)該產(chǎn)生太多問題。而事實是由于應(yīng)用程序的實際運(yùn)行環(huán)境不同,Unicode 和各個本地字符集的補(bǔ)充、完善,以及系統(tǒng)或應(yīng)用程序?qū)崿F(xiàn)的不規(guī)范,轉(zhuǎn)碼時出現(xiàn)的問題時時困擾著程序員和用戶。

          其實解決 JAVA 程序中的漢字編碼問題的方法往往很簡單,但理解其背后的原因,定位問題,還需要了解現(xiàn)有的漢字編碼和編碼轉(zhuǎn)換。相信這樣的東西大家都見過了

          new String(request.getParameter("test").getBytes("iso-8859-1"),"GBK")

          但這樣的代碼相信不是一個解決的辦法,這樣會增加程序的復(fù)雜度,寫數(shù)據(jù)庫,提交表單,URL中傳中文參數(shù),到處都是中文問題!作為一個連走路都要算計最短距離的懶人,當(dāng)然不愿天天叨念著new String(request.getParameter("test").getBytes("iso-8859-1"),"GBK"),然漢戰(zhàn)戰(zhàn)兢兢的處理各種字符轉(zhuǎn)換的問題,我跋山涉水,翻山越嶺,終于找到了完美的解決方式,在TOMCAT中只需要簡單的配置,引入2個文件就可以輕松搞定。

          前提條件,每個頁面使用

          <%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" %>

          <meta http-equiv="Content-Type" content="text/html; charset=GBK">

          地球人都知道的東西。

          步驟1:添加過濾器

          在TOMCAT中找到這2個文件RequestDumperFilter.java,SetCharacterEncodingFilter.java,他們位于D:\Tomcat5.0.27\webapps\jsp-examples\WEB-INF\classes\filters,加到你的工程文件里去,編譯他們。

          步驟2:配置WEB.XML

          在web.xml里加入這一段

          ......

          <filter>

          <filter-name>Set Character Encoding</filter-name>

          <filter-class>filters.SetCharacterEncodingFilter</filter-class>

          <init-param>

          <param-name>encoding</param-name>

          <param-value>GBK</param-value>

          </init-param>

          </filter>

          <filter-mapping>

          <filter-name>Set Character Encoding</filter-name>

          <url-pattern>/*</url-pattern>

          </filter-mapping>

          ......

          看到?jīng)]有?這樣你就不用寫那些麻煩的轉(zhuǎn)換代碼了,當(dāng)然這樣還不足以解決問題。

          步驟3:修改server.xml

          在server.xml修改2個地方

          <Connector port="8080"

          maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

          enableLookups="false" redirectPort="8443" acceptCount="100"

          debug="0" connectionTimeout="20000"

          disableUploadTimeout="true" URIEncoding='GBK'/>

          <Connector className="org.apache.coyote.tomcat5.CoyoteConnector"

          port="8009" minProcessors="5" maxProcessors="75"

          enableLookups="true" redirectPort="8443"

          acceptCount="10" debug="0" connectionTimeout="0"

          useURIValidationHack="false" protocol="AJP/1.3"

          protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"

          URIEncoding='GBK'/>

          OK,搞定!

          ?

          三、APACHE和TOMCAT他們倆關(guān)系非同一般

          Apache和tomcat都是很優(yōu)秀的軟件,更可貴的是它們是免費(fèi)的。其實他們2個都是jakarta項目的重要組成部分。按輩分來講,TOMCAT是APACHE的兒子,APACHE的專長是解析靜態(tài)文件,CGI,PHP......圖片......,兒子當(dāng)然不能搶了老爹的飯碗,所以TOMCAT只有在J2EE這個上面發(fā)憤圖強(qiáng),其實TOMCAT并非不能干他老爹的活,只是穩(wěn)定性差點(diǎn)而已(偶沒有明顯的感覺,可能是商業(yè)炒作吧),現(xiàn)在大家明白為什么把他們2個扯一起了吧,上陣還靠父子兵呢~

          把2個家伙整一起有大致有2種方法,一種是利用mod_jk2.so,一種是利用mod_jk_1.2.5_2.0.47.dll。這2個東東叫聯(lián)接器(TOMCAT就是通過這家伙與apache勾搭上的)

          1、 利用mod_jk_1.2.5_2.0.47.dll在WINDOWS下整合

          步驟1:準(zhǔn)備材料

          apache2.0.52

          http://apache.te8.com/dist/httpd/binaries/win32/apache_2.0.52-win32-x86-no_ssl.msi

          tomcat5.0.27

          http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.0.19/bin/jakarta-tomcat-5.0.27.exe

          JDK(這個不用說了吧^_^)

          mod_jk_1.2.5_2.0.47.dll(關(guān)鍵是這個東東啊,找了我N久),據(jù)說在下面連接可以下到,最后在我同事那找到的。

          http://apache.linuxforum.net/dist/jakarta/tomcat-connectors/jk/binaries/win32/mod_jk_1.2.5_2.0.47.dll

          安裝apache\ tomcat\JDK。

          ?

          步驟2:安裝后設(shè)置環(huán)境變量

          設(shè)置我的電腦\屬性\高級\環(huán)境變量\新建系統(tǒng)變量 變量名:JAVA_HOME 變量值:C:\JBuilderX\jdk1.4 (指向JDK的實際安裝路徑);TOMCAT_HMOM 變量值:Tomcat5.0.27;lasspath 編輯變量值中加上 ......;%JAVA_HOME%\bin;%JAVA_HOME%\lib;%TOMCAT_HOME%\bin;.;

          測試一下,訪問http://localhosthttp://localhost:8080,默認(rèn)安裝是不會有什么錯誤的^_^

          把連接器mod_jk_1.2.5_2.0.47.dll COPY到D:\Apache2\modules\下。

          ?

          步驟3:apache配置

          在d:\Apache2\conf下找到httpd.conf,找到DirectoryIndex,在index.html后添加index.jsp;查找"listen"用于本機(jī)測試時:Listen 127.0.0.1:80,我的是這樣設(shè)置的Listen *:80

          查找AddDefaultCharset設(shè)置為AddDefaultCharset off,這樣APACHE將以你頁面定義的字符集解析頁面。

          在最后添加如下代碼:

          <VirtualHost *:80> #localhost為本機(jī),你可用本機(jī)ip

          ServerAdmin darkxie@hotmail.com #你的mail地址

          DocumentRoot F:/uutang/uutang #你的項目組根目錄

          ServerName dark #你的服務(wù)名,若你的機(jī)器有域名,設(shè)為域名

          ErrorLog logs/ErrorLog.txt #錯誤日志

          CustomLog logs/CustomLog.txt common #訪問日志

          JkMount /servlet/* ajp13 #讓Apache支持對servlet傳送,用以Tomcat解析

          JkMount /*.jsp ajp13 #讓Apache支持對jsp傳送,用以Tomcat解析

          JkMount /*.do ajp13 #讓Apache支持對struts的action傳送,用以Tomcat解析

          </VirtualHost>

          LoadModule jk_module modules/mod_jk_1.2.5_2.0.47.dll

          JkWorkersFile "D:/Tomcat5.0.27/conf/workers.properties"

          JkLogFile "D:/Tomcat5.0.27/logs/mod_jk2.log"

          JkLogLevel info

          ?

          步驟4:tomcat配置

          在d:\Tomcat5\conf下新建一個workers.properties文件 .內(nèi)容如下:

          workers.tomcat_home=d:\Tomcat5 #讓mod_jk模塊知道Tomcat

          workers.java_home=d:\jdk1.3 #讓mod_jk模塊知道j2sdk

          ps=\

          worker.list=ajp13 #模塊版本,現(xiàn)有ajp13了,不要修改

          worker.ajp13.port=8009 #工作端口,若沒占用則不用修改

          worker.ajp13.host=localhost #主機(jī),若上面的Apache主機(jī)不為localhost,作相應(yīng)修改

          worker.ajp13.type=ajp13 #類型

          worker.ajp13.lbfactor=1 #代理數(shù),不用修改

          修改TOMCAT的server.xml文件:

          <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->

          <Connector className="org.apache.coyote.tomcat5.CoyoteConnector"

          port="8009" minProcessors="5" maxProcessors="75"

          enableLookups="true" redirectPort="8443"

          acceptCount="10" debug="0" connectionTimeout="0"

          useURIValidationHack="false" protocol="AJP/1.3"

          protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"

          URIEncoding='GBK'/>

          讓TOMCAT知道ajp13協(xié)議,apache和tomcat倆父子間靠這個協(xié)議溝通。

          測試一下,訪問http://localhosthttp://localhost:8080,看到相同的頁面沒有?細(xì)心點(diǎn),其實很簡單,看看E文的幫助,搞定不成問題。

          ?

          2、 利用mod_jk2.so(也叫JK2)整合

          jk2是一個jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip文件,主要用的是其中的mod_jk2.so。其實利用mod_jk2.so整合和利用mod_jk_1.2.5_2.0.47.dll整合大同小異,只是換了個聯(lián)接器而已,現(xiàn)在一步一步整起來~

          步驟1:沒有多說的,安裝好TOMCAT和APACHE

          下載jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip,解壓,將mod_jk2放到apache的安裝文件夾下的modules文件夾中。

          步驟2:apache配置

          在/conf中加入一個work.properties文件,其內(nèi)容如下:

          <!--這個文件的作用不是很清楚,總之路徑設(shè)置正確就行了。我的apache裝在D:/Apache2,根據(jù)情況自己修改。-->

          [shm]

          file=D:/ /Apache2/logs/shm.file

          size=1048576

          <!--這個socket channel是必須的,port和host對應(yīng)于tomcat端的設(shè)置。-->

          #The socket channel

          [channel.socket:localhost:8009]

          port=8009

          host=localhost

          <!--worker,必須的。-->

          #define the worker

          [ajp13:localhost:8009]

          channel=channel.socket:localhost:8009

          <!--url mapping,我的主要是.jsp和struts的.do,servlet的話設(shè)置成[uri:/xxx/*]之類的。-->

          #uri mapping

          [uri:/*] #和第一種方式一樣吧^_^

          [uri:/*.jsp]

          [uri:/*.do]

          worker=ajp13:localhost:8009

          在httpd.conf中,在LoadModule那里加入這句:

          LoadModule jk2_module modules/mod_jk2.so

          在最后加入這句:

          JkSet config.file "conf/work.properties"

          這是告訴apache去哪里找jk的配置的,根據(jù)具體情況修改。

          還要修改一下DirectoryIndex,DirectoryIndex index.html index.html.var index.jsp查找"listen"用于本機(jī)測試時:Listen 127.0.0.1:80,我的是這樣設(shè)置的Listen *:80。

          當(dāng)然還有我們的虛擬目錄:

          <VirtualHost *:80>

          ServerAdmin darkxie@hotmail.com

          DocumentRoot F:/uutang/uutang

          ServerName dark

          ErrorLog logs/ErrorLog.txt

          CustomLog logs/CustomLog.txt common

          #JkMount /servlet/* ajp13

          #JkMount /*.jsp ajp13

          #JkMount /*.do ajp13

          </VirtualHost>

          ?

          步驟3:tomcat配置

          Tomcat的端口設(shè)置為8080。

          在/conf文件夾加入jk2.properties文件,其內(nèi)容如下:

          # Set the desired handler list

          handler.list=apr,request,channelSocket

          #

          # Override the default port for the socketChannel

          channelSocket.port=8009

          TOMCAT自己已經(jīng)生成了這個文件,找到相關(guān)的地方把注視去掉改一下就成。

          ?

          注意:用這種方式整合最好是自己編譯mod_jk2.so文件,特別是在unix/linux下,我沒有環(huán)境,制作mod_webapp.so沒有自己作過。具體方法,自己去找吧。

          posted on 2006-11-20 14:50 天涯孤客 閱讀(188) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 青海省| 安平县| 沧州市| 八宿县| 安溪县| 安义县| 彭水| 霸州市| 上饶县| 内江市| 丹寨县| 正宁县| 林芝县| 瓮安县| 贵阳市| 越西县| 北碚区| 长岛县| 顺平县| 静宁县| 保山市| 镇平县| 甘孜县| 阿图什市| 民勤县| 湘潭市| 沧州市| 新龙县| 康平县| 江油市| 丰县| 澄城县| 内乡县| 乌什县| 绥化市| 长泰县| 新丰县| 富蕴县| 乐亭县| 鞍山市| 襄垣县|