珠聯璧合之WAS社群版與HTTP Server
作者: ITPUB 唐瑩
原連結: http://tech.it168.com/a2009/0827/670/000000670013_all.shtml
【IT168 專稿】 IBM WebSphere應用伺服器社群版(WebSphere Application Server Community Edition)是基於Apache基金會開源專案Geronimo構建的輕量級Java EE應用伺服器,可以方便地用於管理和開發Java應用。它採用Tomcat作為Web容器,集成了多種Java EE新技術。
IBM HTTP Server是基於Apache HTTP Server的Web伺服器。它負責處理來自客戶端的HTTP請求,並向它們傳送相應的HTTP應答。通常,IBM HTTP Server被用來處理靜態內容,包括HTML頁面和Applet等,因此經常為應用伺服器提供輔助功能。在此,將IBM HTTP Server(以下簡稱IHS)和WebSphere Application Server Community Edition(以下簡稱WAS CE)配合使用有下幾個益處:
· IHS為WASCE進行URL代理。
· IHS為WASCE承擔SSL加密解密任務。
· IHS處理靜態頁面,從而使WASCE可以專注於處理動態頁面,例如JSP和Servlet。
· 兩者協作實現叢集和負載均衡。
與WebSphere應用伺服器(WebSphere Application Server)內建了IBM HTTP Server,並且包含IHS的管理控制檯不同,為了使WAS CE能與IHS協調工作,必須要做一些配置工作。本文將以WAS CE 2.1.1.2和IHS 7.0為例,討論在Windows XP平臺上如何對它們進行配置,以幫助WAS CE提高多方面的效能。
1. IBM HTTP Server的基本配置
IHS的主要配置儲存在<IHS_HOME>/conf (<IHS_HOME>為IHS的安裝目錄)資料夾下的httpd.conf檔案中。配置檔案的每一行包含一個指令,註釋以#開頭。通常IHS有如下一些預設的配置:
1 #伺服器的根目錄,此處僅為舉例2 ServerRoot " C:/Program Files/IBM/IHS7
3
4 #在80埠偵聽
5 Listen0 .0.0.0 : 80
6
7 #使用者能訪問的檔案根目錄,預設為伺服器安裝目錄下的htdocs資料夾
8 DocumentRoot " C:/Program Files/IBM/IHS7/htdocs "
9
10 # DocumentRoot資料夾的訪問控制
11 <Directory " C:/Program Files/IBM/IHS7/htdocs " >
12 #允許在此目錄中使用符號連線。如果一個對映到目錄的URL被請求,而此目錄中又沒有 index.html等索引頁面,那麼伺服器會返回一個格式化後的目錄列表。
13 Options Indexes FollowSymLinks
14 #禁止使用.htaccess檔案
15 AllowOverride None
16 #規定allow和deny的優先順序次序
17 Order allow , deny
18 #允許所有使用者訪問DocumentRoot
19 Allow from all
20 </Directory>
IHS是一個模組化的伺服器,我們可以通過配置檔案中對伺服器包含的模組進行功能增減。除了核心模組之外的多數模組都可以通過httpd.conf檔案中<LoadModule>指令進行動態載入。如果需要用某個特定的模組存在與否來決定是否作出某些配置的時候。指令一般都放在<IfModule>指令段中。例如:
1 #載入status_module模組,它位於ServerRoot下modules資料夾2 LoadModule status_module modules/mod_status.so
3
4 #如果status模組被載入,則請求狀態的擴充套件資訊
5 <IfModule mod_status.c>
6 ExtendedStatus On
7 </IfModule>
IHS除了包含大部分Apache HTTP Server的模組之外,增加了LDAP認證模組和用於生成動態內容的FastCGI模組。IHS還提供了IKEYMAN工具用於管理金鑰和證書,可以幫助我們提高WASCE的安全性。
通常我們還需要用<ServerName>等指令來指定伺服器的主機名和埠號,讓IHS能夠辨識自己,並提高可靠性。在本文中,我們僅針對本機進行部署和測試,因此對於主機名的配置,在此不作贅述。預設情況下,本機的IHS啟動之後,在瀏覽器中訪問http://localhost,會看到如下的結果:
2. 把WAS CE隱藏在IHS之後
在本機安裝WASCE之後,其管理控制檯(Administrative Console)的地址為http://localhost:8080.可以想象一個遠端的客戶端並不想以一個類似http://<WASCE_IP>:8080的地址來訪問WASCE,為什麼不是http://<WASCE_IP>或者http://<WASCE_NAME>?為了解決這個問題,我們可以藉助IHS的正向和反向代理功能。
IHS的正向代理功能可以將WASCE的地址對映到IHS的URL空間,幫助客戶端訪問遠端的WASCE(無論WASCE和IHS是否在一臺物理主機上),也能用於緩衝資料,以降低IHS和WASCE之間的負載。反向代理能調整由IHS傳送給客戶端的HTTP迴應頭中的URL,讓WASCE上的頁面看起來像是存在於IHS上一樣,從而隱藏了WASCE的IP地址,主機名和埠號。在停止IHS之後,對httpd.conf作如下的配置:
1 #載入代理模組和HTTP代理模組2 LoadModuleproxy_module modules/mod_proxy.so
3 LoadModuleproxy_http_module modules/mod_proxy_http.so
4
5 <IfModulemod_proxy.c>
6 #將WASCE的伺服器下/console對映到IHS空間中,若WASCE不在本機,localhos
7 #應為WASCE的IP地址或可識別的主機名,8080為WASCE的HTTP埠。
8 ProxyPass/consolehttp://localhost: 8080 /console
9
10 #對所有WASCE 8080埠的訪問作出的HTTP回覆將只體現IHS的URL
11 ProxyPassReverse/ http:// localhost: 8080
12 </IfModule>
儲存檔案,啟動WASCE並且重新啟動IHS,在瀏覽器的位址列輸入http://localhost/console將會看到WAS CE的管理控制檯介面:
3. 用IHS幫助WAS CE提高安全性
SSL (Secure Socket Layer)是Netscape公司開發的一種安全傳輸協議,用於保證客戶端和伺服器之間的通訊安全。客戶端通常可以要對伺服器進行身份驗證,而伺服器有時也對客戶端進行鑑權。在身份得到確認之後,SSL負責加密和解密所有HTTPS請求和應答,包括鑑權資訊(如使用者名稱和密碼)和客戶端與伺服器交換的所有資料。
使用者可以通過訪問https://形式的URL來得到經SSL加密的內容。這樣,使用者既可以通過http://訪問非安全的內容,也可以通過https訪問到需要身份驗證才能獲取的特定內容。
WASCE本身具有金鑰庫(keystore)和金鑰(key)的配置功能,並且有Certificate Authority用於生成併發布證書,以支援較強的使用者身份驗證方法。我們可以自定義HTTPS聯結器,還可以釋出自簽名的證書用於測試。使用者可以訪問8443埠(https://<WASCE_IP>:8443)但是SSL加密勢必影響伺服器處理其他事務的速度,為此我們可以將這部分的工作交給IHS。
IHS附帶有Key Management Utility工具用於管理金鑰和證書。我們就藉助這個工具建立自簽名證書。
1)首先我們建立一個新的金鑰庫檔案testkey.kdb:
2)輸入密碼並且將儲存至檔案。預設情況下它被儲存到了<IHS_HOME>下的testkey.sth檔案。
3)建立自簽名證書。注意,只有在某些測試環境下,才使用自簽名證書,否則應該向證書頒發機構(Certificate Authority)申請有效證書。
· 金鑰標籤:用於標識這個證書
· 版本:X509 V3
· 金鑰大小:1024
· 簽名演算法:SHA1withRSA
· 共用名:必須和訪問的URL中的主機名相匹配
· 其他選項為可選。
事實上Key Management Utility還提供了建立證書請求,接收證書請求,抽取證書等功能。在完成證書的配置之後,還需要修改httpd.conf檔案,讓IHS使用我們剛才建立的自簽名證書。
1 #載入SSL模組2 LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
3 <IfModule mod_ibm_ssl.c>
4 #在443埠偵聽
5 Listen 443
6 #僅作用於443埠上的虛擬主機
7 <VirtualHost *: 443 >
8 #開啟SSL功能
9 SSLEnable
10 KeyFile " c:/Program Files/IBM/IHS7/testkey.kdb "
11 #這一段是配置IHS為WASCE的正向代理和反向代理
12 <IfModule mod_proxy.c>
13 ProxyPass /console http://localhost: 8080 /console
14 ProxyPassReverse / http://localhost: 8080 /
15 </IfModule>
16 </VirtualHost>
17 </IfModule>
18 SSLDisable
儲存檔案並且重新啟動IHS,在瀏覽器的位址列輸入https://<HOST_NAME>/console,瀏覽器將彈出安全警報,因為我們使用了不被信任的自簽名證書。若要繼續訪問,在Mozilla FireFox中,我們可以選擇新增例外;在Internet Explorer中可以選擇繼續訪問該網站。
4. 叢集和負載均衡
IHS還能幫助WAS CE構成叢集環境。叢集(cluster)功能可以大幅度提高系統和應用的可用性和可靠性。WAS CE的Web容器Tomcat具備叢集功能,它通過在叢集中的多點廣播(multicast)實現HTTP會話的複製,並且確保一個使用者發向某一個節點的後續請求仍然會由同一個節點處理,這被稱為session affinity。
IHS7.0為WAS CE提供了專用的AJP代理模組和均衡模組,位於<IHS_HOME>/modules/ WebSphereCE路徑下,以幫助多個WAS CE節點實現負載均衡和失敗恢復。Apache Jserv Protocol (AJP)協議用於WAS CE和IHS之間的通訊。
我們將借用WAS CE示例[4]中用於展示Tomcat叢集功能的例子,說明WAS CE和IHS分別需要怎樣的配置步驟。
先對本機的WASCE進行配置:
1)在WASCE的安裝目錄(<WASCE_HOME>)下新建資料夾instance2,然後將<WASCE_HOME>/var目錄複製到instance2資料夾下。
2)分別修改兩個例項的配置檔案<WASCE_HOME>/var/config/config-substitutions.properties,例如分別作如下配置:
1 clusterNodeName=node12 clusterName = mycluster
3 PortOffset = 0
1 clusterNodeName=node2
2 clusterName = mycluster
3 PortOffset = 10
這樣,兩個WAS CE例項分別充當叢集mycluster中的節點node1和node2,第二個WAS CE例項的PoetOffset不為0,以避免埠衝突。
3)分別啟動兩個WAS CE例項。在啟動第二個例項前,首先用set命令設定環境變數(注意命令寫在一行):
set GERONIMO_OPTS = -Dorg.apache.geronimo.server.name=instance2
其中,instance2是第二個WASCE例項相對於WASCE安裝目錄的路徑。然後用命令geronimo.bat run來啟動。
4)將tomcat-cluster資料夾下的兩個Web應用servlet-examples-cluster-server1.war和servlet-examples-cluster-server2.war分別部署在本機的node1和node2例項上。
接下來就要對IHS進行配置。停止IHS並修改httpd.conf:
1 #載入需要的模組2 LoadModule proxy_module modules/mod_proxy.so
3 LoadModule proxy_ajp_module modules/WebSphereCE/mod_proxy_ajp.so
4 LoadModule proxy_balancer_module modules/WebSphereCE/mod_proxy_balancer.so
5
6 <IfModulemod_proxy.c>
7 #配置名為mycluster的均衡器 , 兩個節點的負載本別是50%。8009和8019分別是兩個節點的AJP埠。
8 <Proxybalancer://mycluster>
9 BalancerMemberajp://localhost: 8009 /servlet-examples-cluster loadfactor = 50 route = NODE1
10 BalancerMemberajp://localhost: 8019 /servlet-examples-cluster loadfactor = 50 route = NODE2
11 </Proxy>
12 #用mycluster來處理servlet-examples-cluster這樣的URL
13 ProxyPass/servlet-examples-cluster balancer://mycluster/ stickysession = JSESSIONID
14 </IfModule>
15
16 #可以用IHS的balancer-manager來管理這個叢集的成員和負載
17 <Location/balancer-manager>
18 SetHandlerbalancer-manager
19 </Location>
配置完成之後,訪問http://localhost/ servlet-examples-cluster,可以看到目前活動的是node1。從servlet-examples-cluster/balancer-manager可以檢視這兩個節點的情況。若此時結點node1失效,使用者對Server1的訪問將被重定向至node2。
5. 總結
總的來說,IHS可以幫助WAS CE提高安全性,並且能幫助WAS CE分擔SSL加密和解密的任務,使WAS CE可以專注於事物邏輯和其他事務的處理。另外,IHS能和WAS CE一起完成應用的叢集功能,在部署在不同WAS CE節點上的Web應用之間進行負載均衡和失敗恢復。
參考資料:
[1] IBM WebSphere Application Server文件:
http://publib.boulder.ibm.com/wasce/V2.1.1/en/index.html
[2] Apache HTTP Server 2.2文件:http://httpd.apache.org/docs/2.2/
[3] 在WAS CE中使用數字證書對客戶機進行身份驗證:
[4] 為WAS CE配置叢集環境:
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0606_zhangsong/
[5] WAS CE示例下載:http://download.boulder.ibm.com/ibmdl/pub/software/websphere/wasce/