1. 程式人生 > >IBM HTTP Server整合Liberty

IBM HTTP Server整合Liberty

前2篇分別寫了建立Liberty server和安裝IBM HTTP Server,下面談談如何把IHS和Liberty整合起來。

我們希望搭建一個如下的系統架構
這裡寫圖片描述
客戶發起的請求首先會到達web server即IHS(或apache http server), IHS用來負責處理靜態資源的請求,比如html,js,css,jpg等,對於動態請求比如jsp,action,do等需要轉發至application server進行處理。現在流行的application server有IBM Websphere, Oracle Weblogic, JBOSS, Tomcat, Jetty等。我們這裡使用的是IBM輕量級的application server ——Liberty.

1. 針對每臺liberty application server生成plugin檔案。
可以使用jconsole或者eclipse的方法,這裡使用的是eclipse方法
i. 確保 Liberty 伺服器已啟動。
ii. 在 Eclipse 的“伺服器”面板中,右鍵單擊 Liberty 伺服器,然後單擊實用程式 > 生成外掛配置
這裡寫圖片描述
那麼plugin-cfg.xml就生成在該usr\servers\ [SERVER NAME]\目錄下
這裡寫圖片描述
這是檔案的一部分,檢查一下埠是否為80,443,如果生成不是的話,後面有會有問題

   <VirtualHostGroup
Name="default_host">
<VirtualHost Name="*:80"/> <VirtualHost Name="*:443"/> </VirtualHostGroup>

如果只有1臺liberty app server,我們就可以修改D:\IBM\HTTPServer\conf\httpd.conf
在conf檔案的最後加入以下2行程式碼

LoadModule was_ap22_module "path\to\mod_was_ap22_http.dll"
WebSpherePluginConfig "path\to
\plugin-cfg.xml"

第一行是IHS連線Webshpere/liberty的驅動程式(websphere和liberty的驅動相同),類似於apache的mod_jk.so。這個驅動在安裝plug in時生成在
D:\IBM\WebSphere\Plugins_1\bin\32bits 目錄中
第二行就是剛才在liberty Utility生成的plugin檔案。
把驅動和檔案都copy到了HTTPServer的path\to目錄裡
重啟IHS和liberty server,輸入應用的URL,通過80埠訪問成功!
這裡寫圖片描述

2. 我們這裡有2臺app server的例項為testserver1和2,那麼分別針對這2臺生成了plugin-cfg.xml。
將plugin檔案合併,可以手工把2個檔案合併,也可以用liberty自帶的工具merge。
在liberty的bin目錄輸入命令

pluginUtility merge --sourcePath=..\usr\servers\testserver1\plugincfg.xml,..\usr\servers\testserver2\plugin-cfg.xml

這裡寫圖片描述
2個plugin檔案合併完畢,手工把CloseID修改一下為testserver1和2,在預設情況下,IHS的負載均衡的演算法是LoadBalance=”Round Robin”在沒有其他限定的情況下,為了實現會話保持,IHS會根據使用者cookie中傳來的CloseID值來判斷將使用者的請求轉發給已經建立了聯絡的application server。
這裡寫圖片描述
3.修改httpd.conf使其指向合併後的plugin檔案

LoadModule was_ap22_module "D:\IBM\WebSphere\Plugins_1\bin\32bits\mod_was_ap22_http.dll"
WebSpherePluginConfig "path/to/merged-plugin-cfg.xml"

重啟IHS後,在瀏覽器輸入應用的URL,可以看到
這裡寫圖片描述
在一個jsp頁面打印出來了處理請求應用伺服器的埠號request.getLocalPort(),可以從testserver1的http.xml檔案裡看到這個app server的埠是10080,所以知道這個請求被testserver1處理。

<server>

    <featureManager>
        <feature>servlet-3.1</feature>
    </featureManager>

    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint host="*" httpPort="10080" httpsPort="10443" id="defaultHttpEndpoint"/>

    <!-- Define the host name for use by the collective.
        If the host name needs to be changed, the server should be
        removed from the collective and re-joined. -->
    <variable name="defaultHostName" value="localhost"/>

    <!--  Used for plugin generation -->
    <pluginConfiguration webserverPort="80" webserverSecurePort="443" />


</server>

不停的重新整理頁面,可以看到埠在不停的切換
這裡寫圖片描述
IHS把請求輪流轉給不同的application server。 但是我們不希望請求是每次輪詢轉發的,通常我們的開發的web應用都是有狀態的,需要實現會話保持,上面提到用CloneID通過cookie來實現,再去看一下app server裡的server.xml的配置,這裡有

    <!-- <httpSession cloneId="${hostname}_${wlp.server.name}"/>  -->
<httpSession cloneId="${wlp.server.name}"/>

我們把它改為和plugin-cfg.xml裡CloneID保持一致(這裡我們改為app server的名字,通常是一個9位數以內的字串)。修改後liberty server會自動載入重啟。
我們再看看訪問一個jsp頁面,即使你不停的重新整理,總是11080埠的app server在處理你的請求了,進入Chrome的開發者模式,可以看到Cookie後面有一個:冒號後面的值就是處理你這個請求app server的CloneID。 在首次建立會話時,app server會生成一個帶CloneID的cookie傳回客戶端,再次請求時,客戶端會帶著此Cookie給IHS,IHS根據此Cookie裡CloneID來判斷把這個請求轉給之前你們已經建立過聯絡的app server,這樣就實現了會話保持。
這裡寫圖片描述