2004年7月6日

開啟 Tomcat 遠端部署功能

Tomcat 提供了遠端部署 Web Application ( 網頁應用系統,這和 Web Services 網頁應用服務 是兩件事 ) 的功能,但如何設定呢?

通常,我不會使用 Tomcat 預設的路徑 (指的是 $CATALINA_HOME/webapps/) 放置所開發的應用系統,反而會另外安排一塊目錄(特別是不和 / 放一起的獨立 partition )。這麼做的好處是若系統重建時,原來的 Web Application 相關程式都不會被洗掉,另外在測試各 Application Server 時能有單一的程式目錄。

設定虛擬主機

為了設定應用系統的獨立目錄,我的作法是建立一個新的虛擬主機 (Virtual Host),方法不複雜,只要把 Tomcat 設定檔 server.xml 中的<Host name="localhost">...</Host>段落複製一份再改名即可:例如將

<Host name="localhost" debug="0" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">

<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/> </Host>

複製成:
<!-- app.foo.com 是說明用的,您應該使用正式的網路主機名稱 -->
<Host name="app.foo.com" debug="0" appBase="/home/app"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false" >
    <!-- 這是設定有關本站台的一般記錄保存方式 -->
    <!-- directory 若未指定絕對位址時,則採相對於 $CATALINA_HOME 路徑方式認定 -->
    <Logger className="org.apache.catalina.logger.FileLogger"
            directory="logs"  prefix="app_log." suffix=".txt"
            timestamp="true"/>
    <!-- 這是設定有關本站台的資源存取記錄保存方式 -->
    <Valve className="org.apache.catalina.valves.AccessLogValve"
           directory="logs"  prefix="app_access_log." suffix=".txt"
           pattern="common" resolveHosts="false"/>
    <!-- 這一段是設定這個虛擬主機下有幾個 Web Application -->
    <Context path="/application" docBase="application" debug="5" 
             reloadable="true" crossContext="true" >
    </Context>
</Host>
記得 <Host>...</Host> 所在的區段必須在 <Engine>...</Engine> 中。當完成以上設定後只要重啟 Tomcat 就可以完成虛擬主機的建置,此時 http://localhost/http://app.foo.com 表示的是兩個不同的虛擬主機,也就是兩個不同的服務。

那如果有多個網域名稱對上同一個 IP ,而那些網域名稱並未在 server.xml 中設定時,Tomcat 會怎麼處理呢?其實 Tomcat 還是會提供一個預設虛擬主機來服務這些網域名稱,而這個預設的虛擬主機也同樣在 server.xml 中指定,如下所示:

<Engine name="Catalina" defaultHost="app.foo.com" debug="0">

設定維護界面

Tomcat 的遠端部署功能必須使用 /manager 維護界面達成。

當完成虛擬主機設置時,Tomcat 會在 $CATALINA_HOME/conf/Catalina/ 目錄下建立一個與新設定的虛擬主機名稱同名的目錄 app.foo.com,而這個目錄通常沒有包含任何檔案。

同樣在 $CATALINA_HOME/conf/Catalina/ 還有另一個目錄叫 localhost ,這個是 Tomcat 預設的虛擬主機名稱,目錄中包含有 3 個 xml 檔,其中一個檔名叫做 manager.xml。

manager.xml 這個檔其實正是 Tomcat 用來判斷指定虛擬主機網址是否需要啟動 /manager 遠端維護界面的設定檔,因此必須複製一份到 $CATALINA_HOME/conf/Catalina/app.foo.com/ 目錄下,如範例:

[root@app Catalina]# pwd
/opt/jakarta-tomcat-5.0.19/conf/Catalina
[root@app Catalina]# cp localhost/manager.xml app.foo.com/

完成複製動作後,最好去修改一下 manager.xml 的設定檔,將 docBase 指向正確的 Servlet 所在目錄:

<Context path="/manager" debug="0" privileged="true"
    docBase="/opt/jakarta-tomcat-5.0.19/server/webapps/manager" >

<!-- Link to the user database we will get roles from --> <ResourceLink name="users" global="UserDatabase" type="org.apache.catalina.UserDatabase"/> </Context>

設定維護者帳號及密碼

最後 manager 這個 Servlet 有限制使用者的角色必須是 manager,因此必須設定一個維護者的帳號並配屬到 manager 這個角色。設定的方式是編輯 $CATALINA_HOME/conf/tomcat-users.xml 這個檔,內容如下:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager"/>
  <user username="admin" password="password" roles="manager"/> 
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
</tomcat-users>

檢驗設定狀況

完成以上設定後,重新啟動 Tomcat 並開啟瀏覽器進行測試。

在瀏覽器網址列上填入 http://app.foo.com/manager/list ( 請填入所設定的真實網址 ),輸入前面設定的維護者帳號、密碼後,只要看到瀏覽器輸出 OK - Listed applications for virtual host app.foo.com 字樣及其目前所管理的所有網頁應用系統記錄即算設定完成。如範例:

OK - Listed applications for virtual host app.foo.com
/blog:running:1:/home/webapps/blog
/manager:running:0:/opt/jakarta-tomcat-5.0.19/server/webapps/manager

如何使用遠端部署端維護功能

若確認 Tomcat 遠端部署維護功能已設定完成後,可在瀏覽器網址列上填入 http://app.foo.com/manager/html-manager-howto.html 即可查看如何使用遠端線上管理功能。