本文著重介紹resin的幾個常用配置
注:
1. 本文并非resin.conf的使用說明,只是從實用角度出發,按需分析常用的配置。更多的內容到官網學習吧;
2. 基于resin3.x的探討。
(友情提示:剛下載的resin中,resin.conf里的配置都是包含有注釋的——廢話!)
Dependency checking
在說這個參數之前,不得不先了解一下resin的“Dependency checking”機制。resin會定時檢測和下配置的資源是否改動,如果改動,會根據相應的策略重新啟動web-apps和虛擬主機。那么,具體會檢測那些資源呢?下面是一個清單:
WEB-INF/classes下的class文件
WEB-INF/lib下的jar文件
中指定的class或jar
WEB-INF/resin-web.xml
WEB-INF/web.xml
resin.conf
引入的配置文件
通過或或配置的.war文件;
通過加入的文件
是否很眼熟?沒錯!想當年在本地調試web的時候,改一個java文件,總會罵罵咧咧的停掉resin然后重啟,甚是麻煩,會抱怨為啥class這么矯情,不能像改個jsp那樣立竿見影的看到效果。resin說哥你想法是好的,但就算我有那個熱加載的意愿,它jvm也不干那,你去找sun(oracle就不提了)理論去吧。
那只好忍了吧,但是要等多久才會自動加載一次呢?終于出場了。該標簽定義了resin多久檢測一次上面的那些資源是否變更。這個值是需要加單位的,具體的值定義可以參考Period定義。默認值為2s。
對于取值,resin.conf有這樣的一段注釋:
For production sites, change dependency-check-interval to something – like 600s, so it only checks for updates every 10 minutes.
就是說這種檢測會非常耗時,如果搞resin優化的話,那么就把它設置的長一些吧(比如在生產環境里就設置的長一些)或者干脆設置為-1禁止自動檢測變更,即禁止所謂的熱部署。
Dependency checking與RHS
這個參數明了了,實踐一下吧!于是搞一個測試項目出來,簡單配置一下,跑起來之后,象征性的改一下resin.conf,我們將2s改為1s,看終端的滾動日志,咦,為什么沒有輸出日志?正在納悶之時,日志來了,說檢測到了resin.conf的dependency-check-interval改變了,重啟了所有的host。等等,我們之前的檢測時間是2s,為什么改動文件后感覺過了很久才重啟了resin?
經過多番測試,結論是:“Dependency checking”與resin重啟的機制完全是兩回事。dependency-check-interval只是告訴resin多久檢測一次上下文環境的變化,如果發生變化,先記錄下來,負責監控resin的進程會定期檢測這個記錄,如果發現有新的變更記錄,則重啟resin。至于重啟的機制,屬于Resin Health System的范疇,本文暫不討論。但可以通過這句話簡單的驗證一下我們的推論:
Because your site’s reliability is important, Resin monitors its internal sensor net every 60 seconds, recording your server’s memory, cpu, network, database and cluster status.
重啟機制
如果是全局的配置(例如resin.conf)變更,則會重啟整個resin(包括所有的虛擬主機),如果只是某個webapp做了變更(如class、jsp、web.xml等),則只對webapp重啟。
需要說明一點的是,在中亦可配置該標簽(屬性),默認情況下,該屬性會繼承全局的dependency-check-interval值,但如果設置該值為-1,會發生什么事呢?我想你不會那么做的……
想要class的變更像jsp那樣迅捷該怎么辦到呢?myeclipse可以辦到。eclipse for javaEE的話,還需要一些插件的支持,本文暫不做討論,參考本文最下邊關于熱部署的推薦文章。
一個server對應于一個jvm實例,為配置在其中的各個虛擬主機提供服務,接收請求并處理。在中可以配置HTTP,集群端口,存活時間,超時時間,線程池以及負載均衡。一個集群(cluster)可以包含多個server,但是id必須不同。server的屬性包含有address(ip)和port,如果resin中只有配置這一個單獨的server,則可以省略address和port,不過這么搞的話該server就無法作為集群的一部分工作,并且無法用命令行來管理。
常用屬性有address和port。即在定義server的時候同時配置address和port。address的默認值是127.0.0.1。
假如由于同一個集群中的多個server配置大同小異,就可以先搞一個通用的server,其他的server會繼承通用的server配置,各自的配置又會覆蓋繼承的配置。就是充當了這個通用的配置,正如其名,就將其中的配置看作是所有server的默認配置即可。像HTTP端口,超時,存活時間,JVM以及線程這些配置可以通過配置實現共享。
下面的一個配置中,定義了JVM的一些參數以及HTTP的通用配置:
02.
03.
04.
05.-Xmx2048m
06.
07.32
08.64
09.
10.
11.
12.
13.
14.
15....
list 1-1
也許你會異想天開的問,既然是默認的配置,那不顯示配置可以嗎?不可以!自己試一下就行了,去掉里面所有顯示定義,重啟resin你就會看到它的抗議:server-id ” has no matching definition. 并且此時resin會陷入腦殘式的無限次重啟之中,它也許認為這是個偶然性事件,重啟resin以嘗試恢復。
從外部的文件讀取配置,這個外部文件必須符合一定的規范,否則resin解析不了的。標準就直接參考${RESIN_HOME}/conf/app-default.xml即可。配置全局的默認訪問頁面,可以修改app-default.xml中的。
http的典型用法是配置在server-default中。因為經常會有這樣一個場景:同一個cluster中的所有server監聽同一個端口。比如在lsit1-2中,兩個server都默認監聽80端口。亦可配置在每個單獨的server中。
一個server可以服務于多個虛擬主機,每個虛擬主機都可以有自己的servlets以及文檔。虛擬主機必須被明確的定義出來,就是說你不能只用(類比)。對于resin來說,創建一個虛擬主機就像創建一個目錄,然后再為其設置一個DNS一樣容易。一個虛擬主機可以包含一個或者多個web-app。簡單的web-app可放置在一個名為“webapps”的頂級目錄下,就像Apache服務器上的/htdocs。復雜一點的站點,可以先部署多個webapps,然后將這些web-app放置在這些webapps中。
舉例來說,假設有個server同時管理者兩個域名:www.gryffindor.com和www.slytherin.com,這兩個域名所對應的web-app部署在不同的目錄下/var/resin/gryffindor和/var/resin/slytherin,他們共享同一個IP。當用戶訪問http://www.gryffindor.com/的時候,首先瀏覽器會發送HTTP請求到共享ip,resin接到請求后,從HTTP請求頭中取出Host,根據Host值再將請求轉發給相應的虛擬主機。
host重要的屬性:
id: resin使用此id來區分不同的請求。若留空則表示該host為默認host,當其他的host無法被匹配的時候便會將請求轉發到此host。
root-directory: 指定一個虛擬主機的文件系統的路徑,默認的“.”就代表${RESIN_HOME}。參考下面list1-2的例子,可以更深入的理解root-directory的含義。
regexp:用正則表達式匹配域名。
01.
02.
03.
04....
05.
06.
07.
08.
09....
10.
11.
list 1-2
主要的屬性是id和root-directory,同host的id類似,web-app的id也是用于匹配url的。root-directory指定項目存放路徑,可以使用絕對路徑,相對路徑則是相對host的root-diirectory而言的。
注意:若使用myeclipse/eclipse創建項目,會有一個項目名(projectName),而此處的root-directory并非項目路徑,而是一個特殊的目錄,該目錄的子目錄以及文件必須符合Servlet規范,通常就是eclipse默認創建的WebContent,這個名字可以隨便改。btw,這個規范的層級結構主要有三個元素:
/WEB-INF/web.xml
/WEB-INF/classes/
/WEB-INF/lib/
必須包含有上面三個東西。配置文件(*.properties, *.xml等等)需要放在classes下。
舉例說明Eclipse中新增一個項目,然后部署resin的方法,假設現在有份配置如下:
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
list 1-3
下面就簡單講一個本地部署的例子(Eclipse for javaEE,resin3.x)
在Eclipse中新增一個項目,projectName為testResinCfg,根據Servlet規范,自行創建目錄,結構如下:
01.testResinCfg
02.testResinCfg/src/
03.testResinCfg/web/
04.testResinCfg/web/META-INF/
05.testResinCfg/web/index.jsp
06.testResinCfg/web/WEB-INF/
07.testResinCfg/web/WEB-INF/classes/
08.testResinCfg/web/WEB-INF/lib/
09.testResinCfg/web/WEB-INF/work/
10.testResinCfg/web/WEB-INF/web.xml
list 1-4
本地調試:
在list1-3所示的默認host中,增加一個:
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
list 1-5
這樣訪問:http://localhost:8080/tt,如果是id=abc,那就是http://localhost:8080/abc。
在有dns的情況下:
在默認host之下在配置一個host:
1.
2.
3.
4.root-directory="D:\Program_Files\workplace\cache_study\web"?/>
5.
list 1-6
之后便可以通過http://mytest.org/abcd來訪問項目了。
附:Resin與Eclipse for javaEE的整合方法
resin官方文檔提供了安裝Resin Plugin for Eclipse的方法,Galileo版本以上的eclipse for javaEE就可以裝這個軟件了,就像裝tomcat一樣。具體參考:resin
eclipse support
這里主要介紹手工整合Resin與Eclipse的方法。步驟如下:
1. 將web application配置到resin.conf中,具體方法參考上面;
2. 在待部署的項目上右擊——Build Path,將${RESIN_HOME}/lib添加到項目的classpath中;
3. Run – Run Configurations(在本地調試的話,選擇Debug Configurations),彈出的會話中,雙擊“Java Application”創建一個Configuration,在右邊的Name中隨意填寫一個名字,標簽頁Main中,Project選擇待運行web application,Main class填寫resin的主類,查找該類有兩種方法:
該類可以在${RESIN_HOME}/lib/resin.jar中的META-INF/MANIFEST.MF文件中找到,即Main-Class的值;
將${RESIN_HOME}/lib添加到項目的classpath后,即在Main標簽頁點擊“搜索”,在彈出的對話框中搜索“resin”,如果是3.0.x,選擇com.caucho.server.resin.Resin,如果是3.1.x,選擇com.caucho.boot.ResinBoot,具體的選擇,還是要參考META-INF/MANIFEST.MF文件的Main-Class值;
完成以上各步之后,點擊Run即可啟動resin。
如果需要在啟動resin的時候加上一些參數,可以在Arguments中的VM arguments中輸入。
比如: -Djava.util.logging.manager=com.caucho.log.LogManagerImpl。
實際上,真正的部署與eclipse是沒有直接關系的,eclipse在這里僅僅是啟動/關閉eclipse的作用。我們如果直接在開發機上搞得花,就與eclipse無關了,因此還是需要掌握手工部署的技巧。