2009-07-24

mod_jk---apache+tomcat再進化

最近都在忙處理OpenSUSE by mod_jk

原先的打算,是跟之前在centos與fedora時使用的一樣想法,apache[documentroot]就放一般靜態網頁與php,tomcat[docbase]就放jsp…

在centos與fedora使用mod_jk來改寫tomcat-conf中的server.xml時,基本上,在host指定appbase為webapps時,重啟tomcat後會在conf下的auto來自動生成一個mod_jk.conf(auto資料匣要自己建立),mod_jk中的jkmount就會自動把webapps/底下所有資料匣做一個mount(ROOT本生不會mount,而是auto mount ROOT底下的資料匣),而jkmount會把/*/*丟到workername為ajp13來做tunnel處理,在此做一做假設範例:
mod_jk.conf---->JkMount /abc/* ajp13
browser send request ==> http://localhost/abc/a.jsp


當apache收取這個request之後,因為mod_jk.conf有設定web-define-root/abc的所有東西都會交個ajp13這個tunnel-worker來做,所以,這一個request進到server之後,就會被apache交給tomcat來處理了
就以我們想做的方式來看,這樣做好像是正解沒錯…但,事實上會與os有關

在fedora/centos中,apache會先以mod_jk.conf為優先,所以,假設apache[documentroot]底下有一個abc的資料匣裡面有一個a.jsp,會印出apache;然後tomcat[host-appbase]底下也有個abc資料匣,裡面也有a.jsp,會印出tomcat,請問,這個request會回應什麼?
答案:tomcat---apache底下的abc根本就不會被refer…因為前篇有講,mod_jk.conf中的jkmount是以tomcat[host-appbase]會出發點…所以,url是有match到jkmount的,server都會先從tomcat[host-appbase]來找,如果url的link是http://localhost/abc/b.jsp,b.jsp在tomcat[host-appbase]/abc底下找不到,抱歉,server不會找到apache[documentroot]去,所以,你在link=http://localhost/abc/b.jsp就會出現tomcat的error-page

但是,同樣的狀況在OpenSUSE就不一樣…
它不允許有相同的名稱同時出現在apache[documentroot]與tomcat[host-appbase],所以,如果二邊出現相同路徑與相同位置下的檔案request時,OpenSUSE似乎會以apache為優先,所以,假設與上述一樣的狀況,印出的就不會是tomcat,而是印出apache[documentroot]/abc/a.jsp的原始碼

所以,想要排除os的問題,最直接的方式就是把apache[documentroot]與tomcat[host-appbase]指向同一個資料路徑…然後,mod_jk.conf請改自己設而,tomcat/conf/server.xml不用再設定(或者設定一次後把auto/mod_jk.conf取出讓apache自行讀取),然後把/*/* ajp13改成/*/*.jsp ajp13,只要jsp讓tomcat執行就好,其他的讓apache來load…這樣就一個站台可以使用html/htm/php/jsp了…

複雜吧,沒錯,我也搞了很久才大至了解

2 則留言:

愛*薇兒 提到...

回花蓮的時候看方不方便
帶顆大容量的2.5碟借我暫存一下資料
我的小建民要重灌...
如果我覺得你人很好的話
可能會順便請幫我灌
你會說,啊不就燒一片你專屬的光碟了..

沒錯,但沒灌過
至少...讓我動手,你在旁邊動嘴

我有預感,我留完這篇後
你會馬上決定說,我18號再回花蓮好了=.=

死狐狸 提到...

都要當兵了,還重灌啥…
而且我17號坐車的話,18號也才有時間呀,難道你要17號就叫我上工呀…

話說,我車票都還沒訂的耶