跳轉到內容

WebObjects/Web 應用程式/部署/Tomcat 部署詳情

來自 Wikibooks,開放世界中的開放書籍

用於部署 WebObjects 應用程式到 Tomcat 的詳細資訊。

  • Tomcat 安裝位置:/usr/local/tomcat
  • Apache 配置位置:/etc/httpd
  • 應用程式位置:/usr/local/myapps
  • Java 安裝位置:/usr/java/jdk1.5.0_06

常用庫

[編輯 | 編輯原始碼]

將所有常用庫安裝到/usr/local/tomcat/shared/lib,例如:

 activation.jar
 commons-logging-1.1.jar
 httpunit-1.6.2.jar
 java-diff-1.0.5.jar
 mail.jar
 mysql-connector-java-5.0.6-bin.jar
 servlet-api.jar
 wsdl4j.jar

War 檔案

[編輯 | 編輯原始碼]

安裝

/usr/local/myapps/deploy/myapp.war

對於每組應用程式(以 10 為一組),建立這些檔案和目錄結構。有關ROOT.xml檔案的內容,請參見下一節。

請注意,每個應用程式都有自己的主機目錄,例如myapp01.mydomain.commyapp02.mydomain.commyapp03.mydomain.com等。


將這些放置在

 /usr/local/myapps

Group01

 group01/catalina/conf/web.xml
 group01/catalina/conf/tomcat-users.xml
 group01/catalina/conf/context.xml
 group01/catalina/conf/Catalina/myapp01.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp02.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp03.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp04.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp05.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp06.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp07.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp08.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp09.mydomain.com/ROOT.xml
 group01/catalina/conf/Catalina/myapp10.mydomain.com/ROOT.xml
 group01/catalina/conf/server.xml
 group01/catalina/logs/

Group02

 group02/catalina/conf/web.xml
 group02/catalina/conf/tomcat-users.xml
 group02/catalina/conf/context.xml
 group02/catalina/conf/Catalina/myapp11.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp12.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp13.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp14.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp15.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp16.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp17.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp18.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp19.mydomain.com/ROOT.xml
 group02/catalina/conf/Catalina/myapp20.mydomain.com/ROOT.xml
 group02/catalina/conf/server.xml
 group02/catalina/logs/

對於每個主機/應用程式,使用此模板,將出現的“myapp01”字串更改為與主機名稱匹配,例如myapp01、myapp02

 <?xml version="1.0" encoding="UTF-8"?>
 <Context path="/" docBase="/usr/local/myapps/deploy/myapp.war" reloadable="true" antiJARLocking="true">
     <Environment name="wo/NSLog4jLoggerName" value="myapp04" type="java.lang.String" override="false"/>
     <Environment name="wo/myParameter" value="myValue" type="java.lang.String" override="false"/>
 </Context>

wo/NSLog4jLoggerName引數用於 log4j 日誌記錄,請參見下文。使其與應用程式名稱匹配。

在此處設定您自己的變數以進行特定於應用程式的配置。

server.xml

[編輯 | 編輯原始碼]

對於上面的每個組,安裝如下所示的主機定義,使其與前面的命名方案匹配,安裝到該組的server.xml中。以下是group02的條目

 <Server port="8502" shutdown="SHUTDOWN">
   <Service name="group02">
     <Connector port="8902" enableLookups="false" debug="0" protocol="AJP/1.3" /> 
     <Engine name="Catalina" defaultHost="myapp11.mydomain.com">
         <Host name="myapp11.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp12.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp13.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp14.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp15.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp16.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp17.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp18.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp19.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
         <Host name="myapp20.mydomain.com" debug="0" unpackWARs="false" autoDeploy="true" />
     </Engine>
   </Service>
 </Server>
  • Connector埠對於單個物理機上使用的每個Service必須是唯一的,並且必須與下面介紹的 Apacheworker.properties配置檔案中使用的相應modjk工作程式埠匹配。

注意:每個應用程式部署檔案和類都可以在應用程式的work目錄中找到,但管理員無需在任何時候修改它們。

日誌記錄

[編輯 | 編輯原始碼]

Log4j 除錯模式

[編輯 | 編輯原始碼]

將此新增到 Tomcat 的開頭以獲取來自 log4j 的明確除錯資訊。Log4j 可能非常令人沮喪,因此這對於除錯它正在執行的步驟至關重要

 log4j.debug=true

有關詳細資訊,請參見下面的 Tomcat 啟動命令。

log4j屬性檔案安裝到 Tomcat 的 common/clases 目錄中

 /usr/local/tomcat/common/classes/log4j.properties

如果此位置似乎無效,請嘗試

 /usr/local/myapps/group01/catalina/common/classes/log4j.properties

將路徑更改為應用程式的相應組,例如從 group01 更改為 group02。

可以取消註釋註釋行,並重新啟動應用程式對應的 Tomcat 伺服器,以輸出特定應用程式的日誌記錄。此處的示例用於名為“myapp01”的應用程式;此名稱在上面的 ROOT.xml 檔案中由wo/NSLog4jLoggerName引數定義

 #log4j.logger.myapp01=DEBUG, A2 
 #log4j.appender.A2=org.apache.log4j.RollingFileAppender 
 #log4j.appender.A2.File=${catalina.base}/logs/myapp01.log 
 #log4j.appender.A2.MaxFileSize=100MB 
 #log4j.appender.A2.MaxBackupIndex=2 
 #log4j.appender.A2.layout=org.apache.log4j.PatternLayout 
 #log4j.appender.A2.layout.ConversionPattern=%-5p %c [%t] %r - %m%n
 #log4j.appender.A2.Threshold=DEBUG
 
 log4j.rootLogger=INFO, Tomcat
 log4j.appender.Tomcat=org.apache.log4j.FileAppender
 log4j.appender.Tomcat.File=${catalina.base}/logs/tomcat.log
 log4j.appender.Tomcat.layout=org.apache.log4j.PatternLayout 
 log4j.appender.Tomcat.layout.ConversionPattern=%p %t %c - %m%n
 log4j.logger.myapp01=FATAL
 log4j.logger.myapp02=FATAL
 log4j.logger.myapp03=FATAL
 log4j.logger.myapp04=FATAL
 log4j.logger.myapp05=FATAL
 log4j.logger.myapp06=FATAL
 log4j.logger.myapp07=FATAL
 log4j.logger.myapp08=FATAL
 log4j.logger.myapp09=FATAL
 log4j.logger.myapp10=FATAL
 log4j.logger.myapp11=FATAL
 log4j.logger.myapp12=FATAL
 log4j.logger.myapp13=FATAL
 log4j.logger.myapp14=FATAL
 log4j.logger.myapp15=FATAL
 log4j.logger.myapp16=FATAL
 log4j.logger.myapp17=FATAL
 log4j.logger.myapp18=FATAL
 log4j.logger.myapp19=FATAL
 log4j.logger.myapp20=FATAL

另一種檢視應用程式日誌記錄資訊的方法是,例如,註釋相應的行並重新啟動伺服器

#   log4j.logger.myapp16=FATAL

這會將myapp16應用程式的日誌記錄資訊輸出到/usr/local/tomcat/logs/tomcat.log

伺服器啟動

[編輯 | 編輯原始碼]

分別啟動每個伺服器。環境變數可以在之前匯出,或者像這樣在命令列上傳遞,然後呼叫可執行檔案

 JAVA_OPTS="-Xms256m -Xmx256m" JAVA_HOME=/usr/java/jdk1.5.0_06 CATALINA_BASE=/usr/local/myapps/group01/catalina /usr/local/tomcat/bin/startup.sh
 JAVA_OPTS="-Xms256m -Xmx256m" JAVA_HOME=/usr/java/jdk1.5.0_06 CATALINA_BASE=/usr/local/myapps/group02/catalina /usr/local/tomcat/bin/startup.sh
 JAVA_OPTS="-Xms256m -Xmx256m" JAVA_HOME=/usr/java/jdk1.5.0_06 CATALINA_BASE=/usr/local/myapps/group03/catalina /usr/local/tomcat/bin/startup.sh
 JAVA_OPTS="-Xms256m -Xmx256m" JAVA_HOME=/usr/java/jdk1.5.0_06 CATALINA_BASE=/usr/local/myapps/group04/catalina /usr/local/tomcat/bin/startup.sh
 JAVA_OPTS="-Xms256m -Xmx256m" JAVA_HOME=/usr/java/jdk1.5.0_06 CATALINA_BASE=/usr/local/myapps/group05/catalina /usr/local/tomcat/bin/startup.sh


或者啟動一個帶有 log4j 除錯的 Tomcat 例項以確定 log4j 在確定日誌設定和輸出時使用的步驟

 JAVA_OPTS="-Dlog4j.debug=true -Xms256m -Xmx256m" JAVA_HOME=/usr/java/jdk1.5.0_06 CATALINA_BASE=/usr/local/myapps/group01/catalina /usr/local/tomcat/bin/startup.sh

伺服器關閉

[編輯 | 編輯原始碼]

在 Linux 上,此命令將關閉伺服器上的所有 Java 程序,請小心

 pkill java

或者可以指定特定程序,例如 12203

 pkill -P 10203

有時 Tomcat 會掛起,請小心,這會殺死系統上的每一個 Java 程序,絕不留情

 pkill -9 java

這也有效,在本例中用於group01伺服器

 CATALINA_BASE=/usr/local/myapps/group01/catalina /usr/local/tomcat/bin/shutdown.sh

核心 modjk 設定

[編輯 | 編輯原始碼]

新增到 httpd.conf

 JkLogFile "/usr/local/tomcat/logs/mod_jk.log"
 JkLogLevel info
 JkOptions +ForwardURICompat
 JkWorkersFile /etc/httpd/workers.properties

並新增/etc/httpd/worker.properties,其中包含

 worker.list=worker01,worker02,worker03,worker04,worker05
 
 worker.worker01.type=ajp13
 worker.worker01.host=localhost
 worker.worker01.port=8901
 worker.worker02.type=ajp13
 worker.worker02.host=localhost
 worker.worker02.port=8902
 worker.worker03.type=ajp13
 worker.worker03.host=localhost
 worker.worker03.port=8903
 worker.worker04.type=ajp13
 worker.worker04.host=localhost
 worker.worker04.port=8904
 worker.worker05.type=ajp13
 worker.worker05.host=localhost
 worker.worker05.port=8905

虛擬主機

[編輯 | 編輯原始碼]

每個虛擬主機都包含這樣的條目,其中具體內容已適當地修改,例如將myapp02更改為與您的應用程式名稱匹配

 <VirtualHost *:80>
         ServerName myapp02.mydomain.com
         DocumentRoot "/Library/WebServer/WebSites/myapp02"
 
         JkMount  /WebObjects/* worker01
 
         <Location "/MyApp/WEB-INF/*">
             AllowOverride None
             deny from all
         </Location>
 
         <Location "/MyApp/META-INF/*">
             AllowOverride None
             deny from all
         </Location>
 
         <IfModule mod_rewrite.c>
                 Include "/etc/httpd/mods/mod_rewrite_tomcat.conf"
                 RewriteRule     (.*)/cgi-bin/(.*)/___AppNamePlaceHolder___(\.woa(/.*)?)?        $1/$2/MyApp$3       [L,PT]
         </IfModule>
 </VirtualHost>

重寫規則

[編輯 | 編輯原始碼]

確保 apache 已構建和/或安裝以使用 mod_rewrite。

然後安裝 /etc/httpd/mod_rewrite.conf

 RewriteEngine On
 RewriteRule     ^/WebObjects/.*$                        - [L,PT]
 

這只是一個示例,您需要自己詳細瞭解。或者弄清楚並使用通用規則更新此維基。

Tomcat 伺服器啟動並 Apache 執行後,訪問一個網站。

 http://myapp04.mydomain.com

自動部署

[編輯 | 編輯原始碼]

修改 WAR 檔案將重新部署所有應用程式。用應用程式的更新版本替換 WAR 檔案,將系統地自動部署新版本,一次一個 Tomcat 伺服器。這可以透過跟蹤 /usr/local/tomcat/logs/tomcat.log 來實現。

修改或更新 ROOT.xml 應用程式檔案將重新載入/重新部署應用程式,如果進行了任何更改,則新部署將獲取這些更改。

故障排除

[編輯 | 編輯原始碼]

重寫除錯

[編輯 | 編輯原始碼]

要獲取重寫規則日誌,請將以下內容新增到重寫檔案的頂部

 RewriteLog              /tmp/mod_rewrite.log
 RewriteLogLevel         9

重啟 Apache 並跟蹤 /tmp/mod_rewrite.log,同時訪問網站。

常見錯誤

[編輯 | 編輯原始碼]

javax.servlet.UnavailableException: Error initializing servlet adaptor: access denied

[編輯 | 編輯原始碼]

等待更多資訊。

javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

[編輯 | 編輯原始碼]

參見上面的註釋。目前,不會阻止應用程式正常執行。看起來像是 web.xml 檔案中未使用的條目。

javax.servlet.UnavailableException: Error initializing servlet adaptor: null

[編輯 | 編輯原始碼]

未知,但可能是應用程式先前完全無法啟動的結果。

java.lang.reflect.InvocationTargetException

[編輯 | 編輯原始碼]

刪除類路徑中 jar 檔案的重複副本,最有可能在 /usr/local/tomcat/common/lib 中。

Caused by: java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalStateException
There is already a unique instance for Bundle named 'JavaXML'.

例如

 mv /usr/local/tomcat/common/lib/JavaXML.jar /var/tmp

javax.servlet.UnavailableException

[編輯 | 編輯原始碼]

未知,配置錯誤。

 - Servlet  threw load() exception
 javax.servlet.UnavailableException: Can't find application bundle. 
 You can either define WOROOT, LOCALROOT and WOAINSTALLROOT as Java system properties 
 (e.g. in your application server's launch script as command line arguments) or in the application Deployment Descriptor file (web.xml).
       at com.webobjects.jspservlet.WOServletAdaptor._applicationInit(WOServletAdaptor.java:335)

java.lang.IllegalStateException: Cannot fire array fault with a null handler

[編輯 | 編輯原始碼]
       at com.webobjects.eoaccess.EODatabaseContext._fireArrayFault(EODatabaseContext.java:4399)
       at com.webobjects.eoaccess.EOAccessArrayFaultHandler.completeInitializationOfObject(EOAccessArrayFaultHandler.java:70)
       at com.webobjects.eocontrol._EOCheapCopyMutableArray.willRead(_EOCheapCopyMutableArray.java:38)
       at com.webobjects.eocontrol._EOCheapCopyMutableArray.count(_EOCheapCopyMutableArray.java:92)
       at com.webobjects.eocontrol.EOSortOrdering._sortUsingKeyOrderArray(EOSortOrdering.java:173)
       at com.webobjects.eocontrol.EOSortOrdering.sortArrayUsingKeyOrderArray(EOSortOrdering.java:254)
華夏公益教科書