天天看點

mod_proxy和mod_jk比較介紹協定加密以及SSL支援負載均衡Apache httpd 各個版本mod_proxy vs. mod_jk總結

Authur:Mladen Turk

Published at 2007-7-16 3:22:57

Apache2.2 本身擁有如mod_proxy這樣一系列優秀的子產品,它們擁有一部分和mod_jk一樣的功能(AJP Protocol),也能整合實作負載均衡。

AJP (Apache Jserv Protocol) 目前版本是1.3,是一個持久性的二進制協定。持久性指web server 和application server 直接的連接配接一旦建立,在系統生命周期内一直保持open的狀态。

從用戶端看,web server 和application server本質上是一個單一的系統。

既然系統中的某個節點可能因為各種原因死掉,同application server 一樣,mod_proxy和mod_jk需要能夠發現各種連接配接和通道的錯誤并作出反應。

mod_jk在過去幾年就已經擁有了這樣的技術優勢,現在有各種技術實作連接配接錯誤偵察和修複。從現在來看,mod_jk在這方面比mod_proxy有更多的優勢。

mod_jk是基于AJP協定的,這個協定也通常被認為是二進制http協定。基于二進制協定,主要考慮有兩點,首先,客戶請求資訊已經在web server被解碼,就不用再把完整的請求資料發送給application server了;其次,在web server 和 application server 之間,請求和傳回 header資訊不再是string形式,而是兩位元組序列的原子形式,這樣也就降低了網絡帶寬要求。

但是,AJP協定有一個主要的限制,就是packet的大小不能超過8K。最新的mod_jk和Tomcat使得這個限制可以加大到64K,但是還是有限制。mod_proxy也有限制,最大的packet大小是8K.如果遇到較大的用戶端請求就會出問題了,特别像有些客戶SSO子產品存儲了大量的session資訊在cookies和header中。如果在要支援大型用戶端請求,唯一的解決方案是使用AJP http協定。

AJP協定沒有加密,不能夠用在開放外部網絡環境中。在這樣的環境中,web server和application server 直接的的通信可能會被監聽,需要使用一定的SSL隧道技術保障資料安全。另外一個選擇是使用https協定結合mod_proxy.但是https會稍微複雜一點,需要在application server中添加filter處理用戶端傳遞過來的證書。AJP協定則會自動處理,它将加密資料通過序列的方式再web server 和application

server直接傳遞。可以說,AJP協定的行為像是一個緩存SSL的加速器(the AJP protocol behaves like caching SSL accelerator)。

這樣的性能更高效,因為資料隻需進行一次解密。但是使用不同的網卡進行通信、建設防火牆和路由才是保障web server和application server之間通信安全最好的解決方案。

另外有些觀點認為,将web server 和application server 放置在同一台實體機器上,他們直接通過記憶體進行通信,這樣可以加強整個系統的安全性。

最新的mod_jk比mod_proxy_balancer有更多的優勢特性。mod_jk額外擁有一些“商業特性”方法,可以根據實際application server 反應時間設定負載均衡。

新版mod_proxy隻支援Apache httpd 2.2和更高版本,也就是說,如果web server更新需要同時更新新版的mod_proxy.

Apache httpd可以結合worker-mpm使用。使用worker mpm的時候,mod_proxy和mod_jk都有設定web和application server之間連接配接池大小的選項。這個選項在部署的時候很有必要,可以使用Apache httpd 在application server之前傳送一些其他内容,例如傳送遞靜态内容等。在這種情況下,時間發送到application server的請求比實際上web server接收到的用戶端請求要少很多,它允許worker mpm的連結池大小設定比MaxThreadsPerChild更小。

Windows和Netware版本的Apache httpd是完全線程的,所有他們的mpm和連接配接池大小可以設定處理更大的範圍。

那麼什麼時候使用哪一個呢?這依賴于你的架構。如果你已經有了或者需要apache 2.2的功能,那麼你可以再mod_proxy和mod_jk直接選擇。mod_jk在apache2.2上允許得很好。關鍵看你需要什麼樣的功能:

mod_proxy

優勢:

不需要編譯和維護一個對立的子產品。mod_proxy,mod_proxy_http,mod_proxy_ajp,mod_proxy_balancer已經是apache 2.2+的标準內建部分;

可以使用http、https和AJP協定,即便是在同一個balancer中。

劣勢:

mod_proxy_ajp不支援大于8k的資料包;

隻有最基本的負載均衡器;

不支援域模型叢集(domain model clustering)

mod_jk

先進的負載均衡器;

先進的節點失敗偵察功能;

支援大型AJP 資料包

需要單獨維護一個獨立的子產品;

我個人建議是如果有能力維護mod_jk子產品的二進制版本,盡量使用mod_jk。mod_proxy一直在更新但還缺少一些mod_jk的功能。但是,如果你需要https和一個簡單的負載均衡就是用mod_proxy.

本文轉自 freehat08 51CTO部落格,原文連結:http://blog.51cto.com/freehat/1184844,如需轉載請自行聯系原作者