2004年7月23日

另一個丟臉到國外的例子

這邊又有一個丟臉丟到國外的例子… HiNET 的垃圾信件氾濫...

看看這裡,這一票全是 HiNET 所管理的 IP ,其中甚至還有一整個 CLASS B ( 220.130.0.0/18 ) 被擋下來的情形,這一塊區域恰好包含了我新配發的 IP ,連帶造成我無法和香港一家公司確認貨款交付的情形,這樣的損失我要找誰索賠?

爛 HiNET...

※ 以下是 TFN 及 SEED.NET 受列管的清單,和 HiNET 一比,真是不知道 HiNET 究竟在幹啥…

  1. TFN.net.tw
  2. Seed.net.tw
  3. ANET.net.tw:沒有半筆喔!不過我早就把 anet 列為垃圾信來源就是了… :p

期待中的手機規格

最近發現生活中有很多有趣,不滿的,有的沒的的畫面,開始在想是不是應該照個相作為呈堂供證… :p

不過我並不考慮買一台數位相機,畢竟我主要的目的是即時的照相而不是照的漂亮,因此具有相機功能的手機變成了我主要考量的重點,當然,另一個原因是我的 Siemens 6688 已經用了 3 年多了,如果有適合的手機的話也該讓他退休安養天年了… ^^!

不過哩,目前手機上所附的主流解析度為 30 萬像素,這樣的規格實在無法讓人提出興趣,所以新手機的需求也就一直懸在那邊...

當然超過百萬畫素的手機不是沒有,Sharp, Nokia, Motorola, 甚至 OKWAP 都已有實機上市開賣,不過買手機當然不會其中一個功能而成為購買的理由,所以目前算是在等待今年第四季所推出的產品是否有適合的型號,而考慮的基本規格大概有以下幾點:

  1. 百萬像素鏡頭
  2. 良好畫質的大面機顯示螢幕,不過顏色數倒是只要 64K 聲即可
  3. 支援藍芽
  4. 可以聽立體聲 MP3 ( 6688 目前不想換下來的原因之一 )
  5. 內附立體聲耳機
  6. 可以加裝擴充記憶卡 ( 6688 目前不想換下來的原因之二 )
  7. 多合弦鈴聲 ( 6688 最弱的一點… :~( )
  8. 直立式手機,我的確不太喜歡貝殼機… :p
期望規格:
  1. 最好是德國製造的
  2. 價格不可以超過 NT$18K
  3. 最好手機有自動開、關機設定 ( 目前 6688 已改成這種功能 )
絕對禁止:(寧可不買)
  1. MIK
  2. MIC

2004年7月21日

詢問有關我的 IP 被 Blocked 的回信

早上針對 http://www.spamhaus.org/ 封鎖住我寄信的原因向該管單位提出詢問,回覆的信件中有這麼一句:

『We were hopeful that Chunghwa were going to disconnect this spammer today as they had promised us, but now it appears they will break their promise.』

似乎 HiNET 不是不知道這件事,只是 HiNET 卻從來不曾去在乎過而以。

爛 HiNET… 爛死了… 爛死了… 爛死了… 爛死了…

我看泛藍最近的情形

這個 Blog 好像快變成政治批評區了… :p

泛藍最近的情形整理如下:

  1. 國民黨製作 BulletGate 去告洋狀:幹!在國內批評總統就算了,一個號稱政治學博士的傢伙還能跑到美國去年評自己國家的總統;在國內弄了不少槍擊案的笑話還不夠,竟然會好意思再去國外製造笑話!我的天啊,國民黨是中了啥降頭,能夠不要臉到如此地步!
  2. 藍鷹戰將-邱德宏可能投靠台聯,郭素春大罵『打著藍旗反藍旗』:我好奇的是即然國民黨不懂的珍惜肯言能諫的黨員,怎麼還能去責備別人、限制別人的參政自由呢?國民黨真的是個最不民主的政黨,偏偏又自以為是民主政黨,說到底,還真是不要臉啊!
  3. 國親年底立委選舉總量管制爭議浮現:再吵吧,看能吵掉多少席立委吧!
  4. 北市府隱匿獅子頭抽水站故障的事實,逕自將污水排入淡水河:說到底,北市府的緊急應變能力並不比行政院高到那邊去,甚至可能還遠遠不及於行政院對多數問題的處理能力。可悲的是,媒體總是輕鬆面對馬英九市長的連帶責任;馬英九也只會嘴吧說說要嚴辦到底,結果呢?娜莉颱風中有誰被嚴辦了?污水排入淡水河所造成的生態破壞又有誰將為此負責呢?
我們可以拭目以待國親今年年底的選舉結果…

2004年7月20日

有關 SpamAssassin 的相關設定

如果有使用 SpamAssassin 來過濾廣告信件的話,在官方網站有整理了一些 Customize Rulesets 的清單,網址在 http://wiki.apache.org/spamassassin/CustomRulesets

我在 http://www.exit0.us/rules/ 中看到一些特殊的設定方式,看來是為了辦識新式廣告信件的內容,有機會一定要試一試… ^_^

對了,SpamAssassin 目前已成為 Apache 基金會下的一個專案,預定近期將推出 3.0 版。

泛藍過半,會是安定力量嗎?

『泛藍過半,安定力量』是連戰對年底立委選舉所提出來的口號。

放屁!

就泛藍過去四年、近來半年的所做所為來看,恐怕泛綠過半才能有安定社會的效果。你看看過去四年來,泛藍何時曾經無條件的支持過提出的行政計劃呢?

我想不起來,我的腦中只留著泛藍立委早上罵、中午罵、晚上還要繼續罵的嘴臉,這樣能夠帶給社會安定才有鬼哩...

連戰,還在構築自己的白日皇帝夢嗎?該醒醒了啊…

2004年7月18日

解決 Tomcat 重新部署 .war 後 DataSource 失效問題

若是依照 開啟 Tomcat 遠端部署功能 內所說的目錄設定方式架設網頁應用程式時,可能會發現 Tomcat 的資料庫連線池會在重新部署一個網頁應用程式後產生一個執行時期例外,它的 Log 就像是這樣的:

[ERROR] 2004-07-07 14:53:46,747 org.apache.jsp.Exception_jsp - Cannot create JDBC driver of class '' for connect URL 'null'
[ERROR] 2004-07-07 14:53:46,759 org.apache.jsp.Exception_jsp - org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:750)
org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:518)
tw.net.fitel.utility.InitialSQL.getDataSourceConnection(Unknown Source)
org.apache.jsp.passport_jsp._jspService(passport_jsp.java:108)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
...

查遍 Google 上可以發現一堆人有相同的問題,經多方測試後發現一個簡單的解決方式:『在 Server.xml 中加上 <DefaultContext>...</DefaultContext> 設定區段』。

在我的作法中,所有的 JNDI DataSource 都會放在 <GlobalNamingResources>...</GlobalNamingResources> 之中(因為我習慣將連接相同資料庫的應用系統放在同一台主機上),因此 <DefaultContext>...</DefaultContext> 中的設定只要將記錄在 <GlobalNamingResources>...</GlobalNamingResources> 的 Resources 連接過來即可,如範例:

<GlobalNamingResources>
     <Resource name="jdbc/mydbGlobal" auth="Container"
               type="javax.sql.DataSource"/>
     <ResourceParams name="jdbc/mydbGlobal">
         <parameter>
            <name>factory</name>
            <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
         </parameter>
         <parameter>
            <name>driverClassName</name>
            <value>oracle.jdbc.driver.OracleDriver</value>
         </parameter>
         <parameter>
            <name>url</name>
            <value>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xx.xx.xx.xx)(PORT=1521)))(CONNECT_DATA=(SID = myDatabase)))</value>
         </parameter>
         <parameter>
            <name>username</name>
            <value>myweb</value>
         </parameter>
         <parameter>
            <name>password</name>
            <value>myweb</value>
         </parameter>
         <parameter>
            <name>maxActive</name>
            <value>100</value>
         </parameter>
         <parameter>
            <name>maxIdle</name>
            <value>10</value>
         </parameter>
         <parameter>
            <name>maxWait</name>
            <value>10</value>
         </parameter>
      </ResourceParams>
  </GlobalNamingResources>

<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"/>

<!-- 這一段是用來設定所有 Context 共同遵守的設定 --> <DefaultContext crossContext="true" reloadable="true"> <ResourceLink name="jdbc/mydb" global="jdbc/mydbGlobal" type="javax.sql.DataSource" /> </DefaultContext>

<!-- 這一段是設定這個虛擬主機下有幾個 Web Application --> <Context path="/application" docBase="application" debug="5" reloadable="true" crossContext="true" > </Context> </Host>

完成設定後記得重啟 Tomcat ,再來若單獨 deploy 某一個 Context 時,就不會造成 JNDI 中記錄的 Database Source 失去消息了。

Enjoy it !

政治亂象之我思

近來政治亂象愈演愈烈,搞的我的思想也愈來愈偏激…
  1. 呂秀蓮認為七二洪災是因為濫墾濫伐所致,政府和民間將資源投注在一次又一次的救災只是一種假慈悲(我承認這是記憶中的印象):我非常贊同這些話,不過呂透蓮的腦袋一向搞不清礎啥時能講,啥時該講。沒事選救災還在進行的時候講這些話不就擺明了要災民好看嗎?
  2. 高金素梅抗議呂秀蓮污蔑原住民濫墾濫伐,開了好幾次記者會要呂秀蓮道歉:權力使人瘋狂果然是千古不變的真言,一個在選立委前被批評否認自己是原住民的人為什麼忽然以原住民的守護神自居哩?我只能無奈的猜想應該是利委兩字的由來使然。
  3. 呂秀蓮面對原住民(也許是指高金素梅吧)的反彈,還是不改其搞不清楚狀況的個性,為了說明卻愈說愈不明,也難怪火會愈燒愈旺。
  4. 邱毅帶著親民黨高雄市議員候選人想去民進黨造勢會場『鬧場』,結果被民進黨支持群眾海扁一頓:從 319 以來泛綠支持群眾早已壓抑很久了,邱毅自己不長眼想去鬧場,被支持群眾扁一頓其實是很正常的。這不是啥暴力政黨、暴力總統的問題,只是因為邱毅自己不長眼,自找苦吃,別老是把責任推給別人。想要跑到別人家地盤上就要有犧牲的準備。
  5. 到目前為止我認為高金素梅的行為只是為了年底立委選擇而以。
  6. 陳水扁沒有制止呂秀蓮繼續口無遮攔,造成原住民抗議事件持續沿燒,是整個鬧劇的幫兇。
  7. 關於咬舌能否自盡一事,除了讓人痛到眼淚噴出來外,實在死不了人。所以高金素梅揚言要咬舌自盡一事只是用來鼓動群眾而以。
  8. 除非高金素梅打算成為台灣第一個喑啞立委,否則我不相信她會咬的下自己的舌頭,當然更別奢談自盡了。有趣是,當我在中午去用餐時的客人也差不多都是這種反應。
  9. 台灣對立委的職務、職掌定義不明,所以什麼事立委都想插一腳,所以真相調查委員會是一例,原住民抗議事件也是一例。
  10. 針對前述問題,我堅決贊成重新翻修不合時宜的老憲法,取消各級民意代表的言論免責權,明定各級民意代表的職權以免這些民意代表不務正業。
  11. 原住民若真覺得呂秀蓮已嚴重侮辱了他們的尊嚴,應該是自行推舉一個有民望的領導出來,而不是讓這些不務正業的民代毛遂自薦。
  12. 民意代表若受選民所託而帶領抗議群眾,就不要念念不忘自己的民代身份,更不要因為自己獨斷的行為所導致的後果不符預期就哭著向立法院長喊救命。而且我覺得這麼一喊反而更明白的表示整個鬧劇的的確確是為了立委這個職銜,而不是所謂原住民的尊嚴。
  13. 周守訓大博士想選立委耶!我覺得他還是去教教建構式數學和建構式氣象學比較好。
  14. 如果民進黨下一任黨主席被那個沒腦袋的呂秀蓮撿去,那國親重黨政權的機率恐怕會過半...
  15. 從選前以來,我們發現那些所謂的民意代表、政客等等,總是做出一些正常人做不出來的反應,說出一些不合邏輯的結論,不禁讓我再次想到,我們是否該發起『罷免全國政治人物』這樣的公投呢?
  16. 聽說張俊雄年底要去選立院院長,不過這傢伙自從當了行政院長後,我就一直覺得他只會嘴吧講講要做啥,卻一直看不到他做了啥。
  17. 國親到底合不合啊?看的很煩耶,要佔據新聞版面也好歹每天換一些橋段,不要總是合、不合、合、不合的方式輪流佔版面好嗎?
  18. 以過去四年國親的逢扁必反的問政方式,我熱切的希望今年年底的立委選舉中泛綠能過半。個人認為最佳的席次比應該是民進黨 + 台聯佔 53% 或以上,不過民進黨本身不能過半,且民進黨與國民黨的比例應相近。會這麼想的原因是台聯的訴求不一定和民進黨相同,此時台聯的態度可以左右法案的立場。
  19. 連戰啥時要下台啊?每次聽他講話都覺得好冷喔...
國外的影集中常有黑暗的執法者這種法律外的制裁,好希望台灣也能有類似的東東喔。沒有少年保護法,沒有言論免責權,只有社會的公理和正義。如果沒有辦法罷免全國的政治人物的話,那,肅清全國的政治人物也行!

2004年7月17日

爛死了的 IE6...

這兩天想在 Web 頁面上加上一個點選日期的小功能...
更!那是啥麼爛 IE 啊,為什麼長出來的樣子硬是和別人家不一樣… >"<
事情的主因是這樣的:我幻想使用以下的 JavaScript 碼去建立一個跨越 7 欄 ( cols ) 的 Table Cell...

<script language="JavaScript">
   objRow = document.createElement( "TR" );
   objCell = document.createElement( "TD" );
   objCell.setAttribute( "colspan", "7" );
   objRow.appendChild( objCell );
</script>
在 Firefox 0.9.1 上很正確的顯示了想要的效果,可是混蛋 IE6 卻硬是給我忽視 colspan 這個 Attribute 的設定,真是… 他馬的… -.-
※補一下兩個 Browser 的不同處理結果好了:
IE6
Firefox091
※ 總算知道差異了
  1. Mozilla 上的 Traversing an HTML Table with JavaScript and DOM Interfaces 的用法可能是比較舊的方式。
  2. 在設定 attribute 時,最好使用 obj.attributeName = 'xxx'; 方式指定,這在 IE6/Firefox 0.9.1 中都可運作。

2004年7月14日

再論 Mozilla Firefox

最近還是針對 Mozilla Firefox 和 IE 6 對 CSS 的解釋進行了解,不過,並沒有結果… :p

之前就發現 Firefox 對一些使用 CSS 設定顏色的頁面都完全不予理會,搞了好久,終於發現最保險的方式是透過 Firefox 及一個延伸套件: Web Developer 來編輯 CSS 設定檔,和 DreamWeaver 最大的不同是:你所看到的晝面就是 Firefox 最後顯示的樣子,而不是編輯器自以為是的模擬結果。

還好在昨天一整天的作業中,IE 6 和 Firefox 對顏色設定的解釋並沒有太多的差異 ( 不過顯示的結果還是有差別啦),所以我開發出來的頁面可以給那些只知道 IE 的井中蛙使用外,Firefox 也沒有顯示上的問題!

不過,Firefox 似乎對一些 JavaScript 的 DOM 操作與 IE6 不同,所以這部份大概又要再研究一下了!

2004年7月8日

Web應用程式自動部署作業-使用 Tomcat 及 Ant

目前在 Tomcat 上執行遠端部署 WAR 檔的方式經整理至少有以下三種:
  1. 使用 FTP 上傳:這是透過 Tomcat 的自動部署設定機制,將 war 檔解開後重新載入相關設定的方式,應該所有的 Application Server 都可支援這種式新方式,例如 Tomcat 4/5, JRUN 4, resin 都可以。
  2. 使用 Tomcat 4 提供的 manager Servlet 界面:只要啟動 Tomcat 的遠端管理功能即可指定 Tomcat 做你想做的維護作業,包含 deploy 及 undeploy 等動作。Tomcat 5 也可以使用這種方式進行部署作業。
  3. 使用 Tomcat 5 提供的 ANT 任務:配合 Tomcat 5 提供的 catalina-ant.jar 及啟動遠端管理功能後,即可使用此方式進行部署。
  • 設定 Tomcat 啟動遠端管理功能的方式請參考:開啟 Tomcat 遠端部署功能
  • 不負責任猜測:Tomcat 5 提供的 ANT 任務服務界面應該也可以用來部署 .war 檔到 Tomcat 4 的 Server 上,但是我沒有使用 Tomcat 4… :p
以下分別介紹如何使用 ANT 達成這三種部署作業的方式:

FTP 上傳

在先前發佈的 Web應用程式ant建置檔 中就是採用這個作法,ant 的核心設定為:

<echo>Sending file(s) to ${uat.ftp.server}...</echo>
  <ftp binary="yes" depends="yes" server="${uat.ftp.server}" 
       password="${uat.deploy.passwd}"userid="${uat.deploy.name}">
  <fileset dir="${output.path}"/>
</ftp>

通常上傳後經過 10 秒後,各家的 Application Server 即可完成重新載入的動作。

使用 Tomcat 4 的遠端管理界面

Tomcat 4/5 都提供了遠端管理界面以進行安裝、啟動、關閉、移除等遠端管理界面,請參考相關說明完成設定動作:開啟 Tomcat 遠端部署功能

ANT 提供 <get.... /> 任務可以取得指定 URI ( http 支援最完整,而 https 在我的 J2SDK 1.4.2_03 上無法正確運作,據說應該要可以動才對 ) 的輸出結果,不過我不還搞不清楚怎麼將 .war 檔透過管理界面丟上 JSP Container 去… :p

<!-- 先關閉指定路徑的 Web Application,並把網頁輸出的結果寫到${uat.ftp.server}.stop.txt中  -->
<get src="http://${uat.ftp.server}/manager/stop?path=/${ant.project.name}"
     dest="${uat.ftp.server}.stop.txt"
    username="${uat.tomcat.username}" password="${uat.tomcat.password}" />
<!-- 將 get 的輸出結果載入到 uat.stop.result 屬性中 -->
<loadfile property="uat.stop.result"
           srcFile="${uat.ftp.server}.stop.txt" />
<!-- 輸出 get 的輸出結果 -->
<echo>${uat.stop.result}</echo>

<!-- 還是採用 ftp 傳檔.... --> <echo>Sending file(s) to ${uat.ftp.server}...</echo> <ftp binary="yes" depends="yes" server="${uat.ftp.server}" userid="${uat.deploy.name}" password="${uat.deploy.passwd}"> <fileset dir="${output.path}"/> </ftp>

<!-- 上傳後要留點時間給 APP Server 解開 war 檔 --> <echo>wait for 10 seconds...</echo> <sleep seconds="10" />

<!-- 重新啟動指定路徑下的 Web Application --> <get src="http://${uat.ftp.server}/manager/start?path=/${ant.project.name}" dest="${source.path}/${uat.ftp.server}.start.txt" username="${uat.tomcat.username}" password="${uat.tomcat.password}" /> <!-- 載入 Web Application 啟動情形 --> <loadfile property="uat.start.result" srcFile="${source.path}/${uat.ftp.server}.start.txt" /> <!-- 檢查 ${source.path}/${uat.ftp.server}.start.txt 是否有 'OK' 字眼 --> <!-- 有就將 deploy.uat.success 屬性設為 true --> <condition property="deploy.uat.success" value="true"> <and> <contains string="${uat.start.result}" substring="OK" /> </and> </condition> <!-- 若 deploy.uat.success 未設定時表示部署作業失敗,終止 build 程序 --> <fail message="Deploy ${uat.ftp.server} fail..." unless="deploy.uat.success"/> <!-- 不然就輸出部署成功的訊息 --> <echo>${uat.start.result}</echo>

使用 Tomcat 5 提供的 Ant 任務管理功能

設定 ant

請記得將 catalina-ant.jar 複製到 $ANT_HOME/lib 下,不然 ant 無法取得 Tomcat 5 所提供的外掛任務。

在 build.xml 中定義 ant 提供的任務項目

<!-- Configure the custom Ant tasks for the Tomcat 5.0 Manager application -->
<taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask"/>
<taskdef name="list"      classname="org.apache.catalina.ant.ListTask"/>
<taskdef name="reload"    classname="org.apache.catalina.ant.ReloadTask"/>
<taskdef name="resources" classname="org.apache.catalina.ant.ResourcesTask"/>
<taskdef name="roles"     classname="org.apache.catalina.ant.RolesTask"/>
<taskdef name="start"     classname="org.apache.catalina.ant.StartTask"/>
<taskdef name="stop"      classname="org.apache.catalina.ant.StopTask"/>
<taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask"/>

使用定義好的 ant 任務

完成任務定義後,即可在 ant 目標中使用相關的任務。

<!-- 移除原指定路徑上之應用系統 -->
<undeploy url="http://${uat.ftp.server}/manager" 
     username="${uat.tomcat.username}" password="${uat.tomcat.password}"
         path="/${ant.project.name}"/>
<!-- 傳送檔案 ( log4j.properties 設定檔 ) -->
 <echo>Sending file(s) to ${uat.ftp.server}...</echo>
 <ftp binary="yes" depends="yes" server="${uat.ftp.server}" 
     userid="${uat.deploy.name}" password="${uat.deploy.passwd}">
   <!-- 避開 .war 檔 -->
   <fileset dir="${output.path}" excludes="**/*.war"/>
 </ftp>
<sleep seconds="10" />
<!-- 重新部署 -->
 <deploy url="http://${uat.ftp.server}/manager" 
    username="${uat.tomcat.username}" password="${uat.tomcat.password}"
        path="/${ant.project.name}" war="${war.name}"/>

不過使用這個方式會有個問題: 若 undeploy 失敗後,建置程序就會中止

通常部署管理員在意的不是 undeploy 是否失敗,反而是 deploy 後該應用程序是否正確上線,因此或許混合各種不同的方式才可能取得最適合自己系統的部署方式。

另外,其他 Application Server 也多半都開始提供 ant 部署任務,這部份就等到遇上後再來整理相關的資料吧。

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 即可查看如何使用遠端線上管理功能。