1. 程式人生 > >Resin的幾個常用配置

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>