2010年4月10日 星期六

在Windows註冊Tomcat為服務的方式

前幾天有客戶提出想要讓Tomcat在Server重開機之後,能自動啟動的需求
我找到了官方文件,裡面有詳細的說明
http://tomcat.apache.org/tomcat-6.0-doc/windows-service-howto.html

由於客戶那邊是由我們安裝程式打包的解壓縮版,而非Windows Service Installer版本,所以要透過bin目錄下的service.bat檔案,或是tomcat 6.exe來註冊服務。使用 service.bat的話就直接執行 service.bat install 服務名稱(預設是Tomcat6),但若有啟動參數要設定的話就要修改service.bat裡的內容了。相對地使用tomcat 6.exe,指令雖然要打比較長,但不必改檔案,這個方式我比較prefer,因為少修改客戶端的檔案就少一份麻煩。不過這是臨時的需求,所以安裝程式尚未加入這個功能,暫時先以簡單的service.bat擋著先。

我先在local試一下,原本以為很簡單就能搞定,但後來發現只靠這份文件是不夠的,設定上還是有許多地方要注意
設定過程中遇到有2個原因會導致失敗
  1. UAC權限: 不外乎就是Disable它,要不然就Run as administrator
  2. 已註冊Tomcat Service: 卡在這邊一段時間,後來才發現以前曾經裝過Windows Service Installer版本,難怪新的註冊不進去。只要執行service.bat remove tomcat6就能移掉了。至於要怎麼知道已經註冊過Tomcat Service,請執行services.msc,看有沒有名稱為Apache Tomcat的服務就可以
另外,啟動參數也要視需求加一下
  • 設定開機自動啟動服務: 由於「手動」啟動是預設值,所以要加入--Startup auto 參數,這樣開機才會自動啟動。修改106行
"%EXECUTABLE%" //IS//%SERVICE_NAME% --StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap --StartParams start --StopParams stop --Startup auto
  • JVM啟動參數: Tomcat透過服務的方式啟動時,不會去執行setenv.bat吃我所設定的JVM參數,所以有可能會爆出Outofmemory錯誤。但這邊不是加入--JvmMs --JvmMx參數,而是去修改124行的預設值--JvmMs 128 --JvmMx 256。千萬不要像我一樣,加在106行變成鬼打牆,因為設定值會被124行的覆蓋。另外119行再加其它的JVM參數
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions "-Xms256m;-Xmx512m;-XX:MaxPermSize=512m;-Djavax.servlet.request.encoding=UTF-8;-Dfile.encoding=UTF-8;-Dcatalina.base=%CATALINA_BASE%;-Dcatalina.home=%CATALINA_HOME%;-Djava.endorsed.dirs=%CATALINA_HOME%\endorsed" --StartMode jvm --StopMode jvm
  • 設定JAVA_HOME: 不要忘了加入--JavaHome 參數,如果客戶電腦沒有設定JAVA_HOME的話,Tomcat會找不到jdk裡的ssl certification,出現 unable to find valid certification path to requested target 錯誤。記住! 不是每個客戶都會設定JAVA_HOME滴

沒有留言: