Resin的幾個常用配置
Resin的幾個常用配置
轉載:http://blog.csdn.net/johnson1492/article/details/7913827
本文著重介紹resin的幾個常用配置
注:
1. 本文並非resin.conf的使用說明,只是從實用角度出發,按需分析常用的配置。更多的內容到官網學習吧;
2. 基於resin3.x的探討。
(友情提示:剛下載的resin中,resin.conf裡的配置都是包含有註釋的——廢話!)
<dependency-check-interval>
Dependency checking
在說這個引數之前,不得不先了解一下resin的“Dependency checking”機制。resin會定時檢測<web-app>和<host>下配置的資源是否改動,如果改動,會根據相應的策略重新啟動web-apps和虛擬主機。那麼,具體會檢測那些資源呢?下面是一個清單:
- WEB-INF/classes下的class檔案
- WEB-INF/lib下的jar檔案
- <class-loader>中指定的class或jar
- WEB-INF/resin-web.xml
- WEB-INF/web.xml
- resin.conf
- <resin:import>引入的配置檔案
- 通過<archive-path>或<web-app-deploy>或<host-deploy>配置的.war檔案;
- 通過<dependency>加入的檔案
是否很眼熟?沒錯!想當年在本地除錯web的時候,改一個java檔案,總會罵罵咧咧的停掉resin然後重啟,甚是麻煩,會抱怨為啥class這麼矯情,不能像改個jsp那樣立竿見影的看到效果。resin說哥你想法是好的,但就算我有那個熱載入的意願,它jvm也不幹那,你去找sun(oracle就不提了)理論去吧。
那隻好忍了吧,但是要等多久才會自動載入一次呢?<dependency-check-interval>終於出場了。該標籤定義了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重啟。
需要說明一點的是,在<jsp>中亦可配置該標籤(屬性),預設情況下,該屬性會繼承全域性的dependency-check-interval值,但如果設定該值為-1,會發生什麼事呢?我想你不會那麼做的……
想要class的變更像jsp那樣迅捷該怎麼辦到呢?myeclipse可以辦到。eclipse for javaEE的話,還需要一些外掛的支援,本文暫不做討論,參考本文最下邊關於熱部署的推薦文章。
<server>
一個server對應於一個jvm例項,為配置在其中的各個虛擬主機提供服務,接收請求並處理。在<server>中可以配置HTTP,叢集埠,存活時間,超時時間,執行緒池以及負載均衡。一個叢集(cluster)可以包含多個server,但是id必須不同。server的屬性包含有address(ip)和port,如果resin中只有配置這一個單獨的server,則可以省略address和port,不過這麼搞的話該server就無法作為叢集的一部分工作,並且無法用命令列來管理。
常用屬性有address和port。即在定義server的時候同時配置address和port。address的預設值是127.0.0.1。
<server-default>
假如由於同一個叢集中的多個server配置大同小異,就可以先搞一個通用的server,其他的server會繼承通用的server配置,各自的配置又會覆蓋繼承的配置。<server-default>就是充當了這個通用的配置,正如其名,就將其中的配置看作是所有server的預設配置即可。像HTTP埠,超時,存活時間,JVM以及執行緒這些配置可以通過配置<server-default>實現共享。
下面的一個配置中,<server-default>定義了JVM的一些引數以及HTTP的通用配置:
<resin xmlns="http://caucho.com/ns/resin">
<cluster id="">
<server-default>
<jvm-arg>-Xmx2048m</jvm-arg>
<accept-thread-min>32</accept-thread-max>
<accept-thread-min>64</accept-thread-max>
<http port="80"/>
</server-default>
<server id="a" address="192.168.1.10" port="6800"/>
<server id="b" address="192.168.1.11" port="6800"/>
...
也許你會異想天開的問,既然<server-default>是預設的<server>配置,那不顯示配置<server>可以嗎?不可以!自己試一下就行了,去掉裡面所有顯示定義<server>,重啟resin你就會看到它的抗議:server-id ” has no matching <server> definition. 並且此時resin會陷入腦殘式的無限次重啟之中,它也許認為這是個偶然性事件,重啟resin以嘗試恢復。
<resin:import>
從外部的檔案讀取配置,這個外部檔案必須符合一定的規範,否則resin解析不了的。標準就直接參考${RESIN_HOME}/conf/app-default.xml即可。配置全域性的預設訪問頁面,可以修改app-default.xml中的<welcome-file-list>。
<http>
http的典型用法是配置在server-default中。因為經常會有這樣一個場景:同一個cluster中的所有server監聽同一個埠。比如在lsit1-2中,兩個server都預設監聽80埠。<http>亦可配置在每個單獨的server中。
<host>
一個server可以服務於多個虛擬主機,每個虛擬主機都可以有自己的servlets以及文件。虛擬主機必須被明確的定義出來,就是說你不能只用<host-default>(類比<server-default>)。對於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:用正則表示式匹配域名。
<server> <host id="gryffindor.caucho.com" root-directory="/home/www/gryffindor"> <web-app id="/" root-directory="webapps/ROOT" /> </host> <host id="slytherin.caucho.com" root-directory="/home/www/slytherin"> <web-app id="/" root-directory="webapps/ROOT"> </host> </server>
<web-app>
主要的屬性是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的方法,假設現在有份配置如下:
<host id="" root-directory="."> <web-app id="/" root-directory="webapps/ROOT"/> <web-app id="/resin-admin" root-directory="${resin.home}/php/admin"> <prologue> <resin:set var="resin_admin_external" value="false"/> <resin:set var="resin_admin_insecure" value="true"/> </prologue> </web-app> </host>