- 將resin-version/contrib/init.resin.in複製到/etc/rc.d/init.d/resin
- 修改resin中的一些設定:JAVA_HOME RESIN_HOME USER 等
- 用/sbin/chkconfig resin on將RESIN服務在啟動層級345設定成自啟動
- 在慢速CPU的機器上啟動時,需要加入一個15秒的延時協助JAVA啟動
我最習慣的設定服務自動啟動的方式是在rc.local裡加類似一下的指令碼:
#sshd
/usr/local/sbin/sshd
#proftpd
/usr/local/sbin/proftpd
#apache
/home/apache/bin/apachectl start
#mysql
/home/mysql/bin/safe_mysqld --port=3306 &
#start oracle8i listener first
su - oracle -c 'lsnrctl start'
#start oracle8i
su - oracle -c 'dbstart'
但配置RESIN的自動啟動的時候確遇到了不少麻煩,主要是JAVA_HOME等環境變數在系統初始化過程中是讀不到的。通過一些資料
http://www.caucho.com/support/resin-interest/0112/0151.html
瞭解到將RESIN配置成一個可配置的服務需要以下幾個步驟:
- 設定好JAVA_HOME環境變數後將RESIN解包到/home/resin下,執行編譯指令碼
%tar zxf resin-version.tar.gz
#mv resin-version /home/resin
%cd /home/resin/
%./configure
%make
#make install
- 將make install產生的$RESIN_HOME/contrib/init.resin複製到/etc/rc.d/init.d/resin並且chmod +x resin
cp contrib/init.resin /etc/rc.d/init.d/resin
chmod +x /etc/rc.d/init.d/resin
- 修改resin中的一些設定:JAVA_HOME RESIN_HOME USER等,
- 將resin服務在不同的啟動級中設定成自啟動:
#/sbin/chkconfig resin reset
從中還學到了不少關於用chkconfig管理服務啟動的知識。其實/etc/init.d/resin這個指令碼之所以可以用chkconfig來配置主要是有以下的注釋:
# chkconfig: 345 85 15
# description: Resin is a Java Web server.
這個注釋表示resin服務在運行層級345下自動啟動(/etc/rc.d/下 rc3.d rc4.d rc5.d都用相應連結到init.d/resin),啟動的優先順序是85,停止的優先順序是15。這樣就能自動在相應的rc#.d/產生 S##resin和K##resin了。原先感覺GNU/Linux下的rc.d/下的檔案很亂,不如FREEBSD的簡潔。有了CHKCONFIG還是讓我對下面的檔案管理簡化了很多。用/sbin/chkconfig resin on將RESIN服務設定成自啟動服務後,在GNU/Linux的setup介面的system services設定中也可以對RESIN服務進行設定了。
如果讓RESIN作為80連接埠的服務需要用ROOT許可權,而且隨伺服器自啟動就不能使用httpd.sh了,而需要一個可執行檔來實現,這個可執行在./configure ; make; make install後,這個可執行檔會產生在$RESIN_HOME/bin/下,resin檔案實際是一個執行wrapper.pl的轉向。
在慢速機器上的Resin啟動:
RESIN是一個JAVA應用,啟動過程中需要消耗大量的CPU資源。因此在一些比較慢的機器上或者按照以上的配置有時候會很奇怪的啟動不起來,在stderr.log中顯示:"can't connect to parent",這個問題可以通過在服務啟動後加上一個15秒的延時解決:
在/etc/init.d/resin: 43行左右:
if test -n "$USER"; then
su - $USER -c "$EXE -pid $PID start $ARGS"
else
$EXE -pid $PID start $ARGS
fi
#服務啟動後,加上一個15秒的延時解決
sleep 15
問題解決過程和思路:
先檢查resin的日誌:stderr.log,裡面有can't connect to parent,然後在google上查"resin2 can't connect to parent"和"resin can't connect to parent",大約有幾篇郵件清單歸檔吧,在一篇郵件清單歸檔中有支援人員說正在調整服務等待時間解決類似問題(需要改SOURCE),另外一個人說他的P4伺服器啟動時需要啟動很多消耗CPU的服務,也會導致RESIN啟動不了,然後我在自己的機器上嘗試了一下,在RESIN啟動前就登入到機器上,發現啟動時RESIN和PERL指令碼其實都運行了,但過了一會兒相應進程就退出了,在啟動後系統比較平穩了,再啟動RESIN,RESIN服務就是好的,說明說明指令碼本身沒有問題,按我以前的經驗,JAVA應用是一個比較吃CPU資源的類型,為了讓RESIN有足夠的CPU資源的啟動,在啟動後我增加了15秒的延遲,以防止後續服務影響RESIN的啟動。問題就解決了,而且在其他機器上試也成功了。
當然,最好還是CAUCHO解決了這個問題大家就都不用學這些小技巧了。因此我將類似中所有的BUG報告中提交了自己的解決方案,要求在init.resin指令碼中增加一個全域變數,允許使用者佈建啟動時的等待時間。並把這個解決思路追加到文檔中,讓大家能夠用自己的行動積極支援開源軟體。
利用Resin內建的日誌輪循,HTTP壓縮,緩衝和簡單HTTP認證
作為應用伺服器,很多功能都不用自己再開發了:建議把這些和應用伺服器相關的配置放在resin.conf裡,而和應用伺服器無關的Web應用的標準配置放在WEB-INF/web.xml中。
<host id='example.chedong.com'>
<access-log id='logs/example_access.log'>
<!--rotate log daily-->
<rollover-period>1D</rollover-period>
</access-log>
<error-log id='logs/example_error.log'>
<rollover-period>1M</rollover-period>
</error-log>
<web-app id='/' app-dir='/www/myapp/'>
<classpath id='WEB-INF/classes' source='WEB-INF/src' compile='true'/>
<!--http compress-->
<filter-mapping url-pattern='/result'
filter-name='com.caucho.http.filter.GzipFilter'/>
<!--admin need authorization-->
<login-config auth-method='basic'>
<authenticator>
<class-name>com.caucho.http.security.XmlAuthenticator</class-name>
<init-param user='myname:password:user'/>
</authenticator>
</login-config>
<security-constraint url-pattern='/admin' role-name='user'/>
</web-app>
</host>