2010年9月11日 星期六

[Linux 小學堂] Apache與Tomcat整合 : 了解Tomcat Worker


前言
再配置模塊與AJP連接器之前, 使用者必須了解worker的概念. Worker代表Tomcat運行的實例, 它服務對所有動態的Web組件請求. 請求可能來自Apache Web服務器或直接來自客戶端. 很多情況下僅有單一Tomcat的進程或實例. 不過有時多個worker必須運行在Tomcat 6集群上以實現負載平衡或站點畫分. 這部分會再延伸閱讀討論.
每個 worker通過唯一的主機名稱或唯一IP地址和端口號組合. 主機指Tomcat運行的機器名稱. 端口指 (AJP協議) Tomcat實例為任何輸入請求的端口.

多個Tomcat Worker
許多情況下須要使用多個worker:
* 使用不同的Web應用程序context服務不同的Tomcat worker.
* 使用不同的Tomcat 進程服務不同的虛擬主機, 以明顯分離屬於不同實體的站點.
* 服務比單一物理機允許的容量更多的請求.


使用workers.properties文件配置Apache服務器與多個Tomcat Worker協同工作.
為了使Apache Web服務器給Tomcat 6實例傳遞輸入請求, 必須了解它們在網絡上的位置. 要描述Tomcat 服務器在網絡上的位置, 以提供怎麼樣使用每個Tomcat實例的專門設置, 需要配置稱為workers.properties 的訊息文件. 此文件在Apache Web服務器的conf 目錄下. mod_jk模塊在啟動時將為 workers.properties文件掃描conf目錄, 然後處理配置文件和初始化連接到worker. 以下介紹此workers.properties文件 :
1. workers.properties 文件格式:
workers.properties 文件總挌式是:
(1) 描述worker列表.
(2) 描述上個步驟中列表的worker實例.

為了描述Apache 服務器上運行的worker列表, 使用者可以使用一個或多個的以下聲明

例如以下範例描述了兩個名為testworker1 與 testworker2的worker
worker.list = testworker1, testworker2
如果有多個worker, 不必在同一行指定. 為了描述 worker.list列表中的每個worker實例, 可以使用以下聲名挌式: 

是重要的, 它通常與Tomcat 端配置的jvmRoute名稱相同. 例如 workers.properties 中以下的行為 testworker1 worker實例的主機屬性指派IP地址 192.168.0.XXX
worker.testworker1.host = 192.168.0.xxx
每個worker實例可以設定許多不同屬性, 如下介紹.

2. worker 類型:
對於worker實例, 其中一個重要的屬性是worker 類型, 這可以再worker.properties文件中設置. 必須給每一個Tomcat worker指派一個類型. Tomcat 6集成 mod_jk 連接器支持以下worker類型:
* ajp13 : 本類型的worker代表了運行的Tomcat 實例, 本worker可能有許多屬性. 主要的屬性包括 tomcatId (它代表Tomcat 實例的身分), channel 與 max_connections.
* lb : 本類型worker用於負載平衡.
* status : 這是特殊的worker 類型, 用來顯示關於負載在各種Tomcat worker間是怎樣分部訊息.
* jni : 本進程中的worker使用JNI處理轉寄請求到進程中的Tomcat worker. 在進程中, Tomcat Web容器與Web 服務器共享同樣的內存空間.
* ajp12 : 本Worker支持AJP 1.2協議. 這是一個由 mod_jk支持的遺留協議, 僅僅為了向前相容. 不建議配置於Tomcat 6中.

以如下範例為testworker1設置類型為ajp13, 請求mod_jk使用AJP13協議轉寄請求到testworker1 Tomcat 6實例 :
worker.testworker1.type = ajp13

3. 其他worker屬性:
可以在worker.properties中根據worker的類型設置屬性, 如下將針對類型為ajp13的屬性進行介紹:
* host : Tomcat 6實例worker所在的主機. 這裡可以給解析的hostname或ip位置.
* port : Tomcat 6 worker實例的AJP1.3連接器為輸入請求監聽的端口, 預設是8009.
* connection_pool_size : 連接池中為worker保持的連接數. 因為重新創建socket是件耗資源的操作, 如果連接池已存在連接, Apache Web服務器的請求可以立即轉寄到設定的worker實例, 而不必創建一個新的連接. 在Apache 1.3和 2.x prefork上, 因為它們不是多線程, 所以應當被設為1.
* connection_pool_minsize : 連接池中保持連接數的最小值.
* connection_pool_timeout : 在本worker生命週期結束前, 它在連接池中保持的秒數.
* mount : 本worker的context 路徑. 路徑當用空挌分開. 本屬性可以用於替代或加上httpd.conf文件中的JKMount指令.
* retries : 再轉寄請求期間, 當一個worker返回錯誤時, 它控制mod_jk將再次重發本worker的時間. 默認值是3.
* socket_timeout : 默認值是0, 這表示無限長的等待時間. 本時間間隔控制 mod_jk在提示錯誤, 將等待socket 上 worker響應的時間.
* socket_keepalive : 指示是否保持到worker的連接具續於活動狀態 : 1為true, 0為不保持keep-alive. 默認值為0
* lbfactor : 指示負載平衡因素的整數.
For more worker屬性, 請參考線上文件


以如下當作範例, worker.properties文件中在 192.169.0.xxx配置了一個稱為testworker1的 Tomcat 實例. 它在9009端口監聽 AJP 1.3請求. 本worker 的bfactor被設置為 20. 本worker實例未完成的連接限制為5, 每個實例在連接池中的將維持5 分鐘的生命週期:
worker.list = testworker1
worker.testworker1.type = ajp13
worker.testworker1.host = 192.168.0.xxx
worker.testworker1.port = 9009
worker.testworker1.connection_pool_size = 5
worker.testworker1.connection_pool_timeout = 300
This message was edited 10 times. Last update was at 12/09/2010 03:19:55

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...