Apusic如何配置虛擬主機(jī)
其實(shí)配置虛擬主機(jī)的文章很多,Apusic應(yīng)用服務(wù)器管理文檔中已有專門(mén)的描述,我這里寫(xiě)的最重要是虛擬主機(jī)有啥用,是否還有其他解決方案。
這篇文章是從最近的工作中得來(lái)的,最初需求是要配置虛擬主機(jī),結(jié)果采用的是寫(xiě)了一段代碼進(jìn)行代替。兩種方法不分高低,可能對(duì)于喜歡規(guī)范的朋友會(huì)鄙視我的變通方式,覺(jué)得俺的東西不遵守規(guī)范,給未來(lái)又留下多少隱患之類(lèi),但是我認(rèn)為寫(xiě)代碼對(duì)國(guó)內(nèi)項(xiàng)目來(lái)說(shuō),由于都是程序員現(xiàn)場(chǎng)實(shí)施,因此未來(lái)的變化更加好控制。最后,我還會(huì)提供一種更為復(fù)雜,但是更為先進(jìn)的虛擬機(jī)方式就是Apache+Apusic整合的方式,這樣結(jié)果會(huì)更靈活,當(dāng)然維護(hù)成本也就更高。
先介紹為什么要配虛擬主機(jī),給客戶到底帶來(lái)什么價(jià)值呢?
一般是主機(jī)提供商喜歡用虛擬主機(jī),他們將一個(gè)服務(wù)器資源分配給許多客戶使用,每個(gè)客戶有自己的域名,有權(quán)訪問(wèn)自己虛擬主機(jī)部署的應(yīng)用。而現(xiàn)在政府客戶為了突出部門(mén)的獨(dú)立性也喜歡申請(qǐng)單獨(dú)的域名,通過(guò)不同的域名訪問(wèn)部門(mén)自己的門(mén)戶系統(tǒng),但是這些應(yīng)用部署在統(tǒng)一對(duì)外的服務(wù)器上,甚至由一個(gè)J2EE應(yīng)用提供不同的門(mén)戶。
那么虛擬主機(jī)又是如何運(yùn)作的呢?
虛擬主機(jī)首先是域名的不同,域名由DNS服務(wù)器解析成IP地址。如果那些應(yīng)用都部署在統(tǒng)一對(duì)外的服務(wù)器上,那么不同的域名將會(huì)解析成相同的IP地址返回給瀏覽器。瀏覽器依據(jù)這個(gè)IP地址訪問(wèn)應(yīng)用服務(wù)器,并且會(huì)把訪問(wèn)用的URL帶在HTTP頭中。如果訪問(wèn)的應(yīng)用都使用相同的路徑(<context-root>/</context-root>),這些應(yīng)用就會(huì)在部署時(shí)發(fā)生沖突。為了解決這樣的沖突,應(yīng)用服務(wù)器中間件就提供了虛擬主機(jī)的方式,等于在一個(gè)應(yīng)用服務(wù)器中間件上可以虛擬出好幾個(gè)計(jì)算機(jī),當(dāng)然部署相同上下文名稱的應(yīng)用也就不會(huì)再有問(wèn)題。應(yīng)用服務(wù)器通過(guò)判斷HTTP頭中的URL來(lái)決定采用哪個(gè)虛擬主機(jī)中的應(yīng)用提供服務(wù)。
Apusic如何配置虛擬主要呢?
修改config/server.xml文件增加virtual-host參數(shù)就可以實(shí)現(xiàn)。這個(gè)實(shí)驗(yàn)在本機(jī)也可以測(cè)試,測(cè)試過(guò)程如下:
1. 修改Windows/system32/drivers/etc/hosts. 文件,模仿localhost增加
?127.0.0.1?localhost1
?127.0.0.1?localhost2
2. 與applications目錄平級(jí)建立一個(gè)webapp目錄(名稱隨意,主要是避免放在applications目錄下,應(yīng)用被自動(dòng)發(fā)布),復(fù)制applications目錄下的default目錄到webapp目錄中,并將目錄改成default1和default2
3. 修改server.xml文件,模仿default增加
? <application name="default1" base="webapp/default1" virtual-host="localhost1" start="auto"/>
? <application name="default2" base="webapp/default2" virtual-host="localhost2" start="auto"/>
4. 啟動(dòng)apusic應(yīng)用服務(wù)器,你會(huì)發(fā)現(xiàn)有相同上下文Context Root的應(yīng)用被啟動(dòng)。
5. 修改每個(gè)應(yīng)用的index.jsp文件,增加區(qū)分標(biāo)識(shí),然后通過(guò)不同的URL(http://localhost:6888或http://localhost1:6888)訪問(wèn),會(huì)得到不同應(yīng)用的顯示頁(yè)面。
現(xiàn)在大家已經(jīng)成功完成虛擬主機(jī)的配置,但是使用虛擬主機(jī)存在什么問(wèn)題呢?
1. 如果這些應(yīng)用是相互獨(dú)立的,那么他們之間的會(huì)話(Session)數(shù)據(jù)是無(wú)法共享的,應(yīng)用相關(guān)的頁(yè)面和風(fēng)格無(wú)法共享,用戶需要維護(hù)多個(gè)應(yīng)用增加了維護(hù)成本;
2. 如果這些頁(yè)面統(tǒng)一跳轉(zhuǎn)到一個(gè)應(yīng)用的不同目錄下,那么瀏覽器的URL就會(huì)變成部署應(yīng)用的虛擬主機(jī)域名,但是這個(gè)可能不是用戶所希望的。
新的用戶需求,因?yàn)橛脩羝鋵?shí)只采購(gòu)了一個(gè)應(yīng)用,但是希望不同的域名有不同的門(mén)戶主頁(yè),于是我的解決方案是應(yīng)用只有一個(gè),在應(yīng)用里面建立default1和default2目錄,那么用戶訪問(wèn)服務(wù)器時(shí),系統(tǒng)會(huì)根據(jù)URL的不同進(jìn)行跳轉(zhuǎn),判斷URL的代碼如下:
<html>
<head>
</head>
<body>
<script type="text/javascript">
var aHost=window.location.hostname; //取得訪問(wèn)應(yīng)用服務(wù)器使用的域名
if (aHost=="localhost1")
?window.location.href="http://localhost:6888/default1";
else if (aHost=="localhost2")
?window.location.href="http://localhost:6888/default2";
else alert("nothing happen!");
</script>
</body>
</html>
這種訪問(wèn),無(wú)論如何跳轉(zhuǎn)域名都不會(huì)發(fā)生改變,而且跳轉(zhuǎn)到其他門(mén)戶時(shí)會(huì)話數(shù)據(jù)可以共享,簡(jiǎn)化了SSO(單點(diǎn)登錄)的開(kāi)發(fā)難度。但是,這種方式也有缺陷就是訪問(wèn)時(shí)上下文必須不同,而且無(wú)法讓所有的域名使用相同的上下文,特別是都使用根目錄。因此,采用哪種方式看用戶的需要。
但是,維護(hù)者可能還是覺(jué)得復(fù)雜,因?yàn)橐獎(jiǎng)拥讓哟a,是否還有完全配置的解決方案嗎?
有!那就是用Apache+Apusic配置虛擬主機(jī),整個(gè)操作過(guò)程如下:
1. 先在Apusic的默認(rèn)default應(yīng)用中增加兩個(gè)目錄default1和default2,修改index.jsp文件方便顯示后區(qū)分;
2. 修改Apache的配置文件httpd.conf,增加虛擬主機(jī)的配置,通過(guò)Apache的虛擬主機(jī)+代理跳轉(zhuǎn)的方式,提供對(duì)虛擬主機(jī)的支持,增加部分如下:
#以下增加的模塊部分無(wú)用,只是我沒(méi)時(shí)間查證,所以都打開(kāi)了。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
NameVirtualHost *:8080
<VirtualHost *:8080>
?ProxyPreserveHost On
?ServerAdmin zhuyuanxiang@apusic.com
?ServerName localhost
?ProxyPass / http://localhost:6888/
?ProxyPassreverse? / http://localhost:6888/
</VirtualHost>
<VirtualHost *:8080>
?ProxyPreserveHost On
?ServerAdmin zhuyuanxiang@apusic.com
?ServerName localhost1
?ProxyPass / http://localhost:6888/default1/
?ProxyPassreverse? / http://localhost:6888/default1/
</VirtualHost>
<VirtualHost *:8080>
?ProxyPreserveHost On
?ServerAdmin zhuyuanxiang@apusic.com
?ServerName localhost2
?ProxyPass / http://localhost:6888/default2/
?ProxyPassreverse? / http://localhost:6888/default2/
</VirtualHost>
3. 啟動(dòng)apusic應(yīng)用服務(wù)器,通過(guò)http://localhost:8080和http://localhost1:8080和http://localhost2:8080就可以得到不同的展示頁(yè)面。
(后兩個(gè)頁(yè)面顯示不正確,因?yàn)樗鼈兊膱D片路徑不正確,在后臺(tái)他們其實(shí)使用的不是前臺(tái)顯示的路徑,因此服務(wù)器無(wú)法找到圖片)
這個(gè)就使不同虛擬主機(jī)都以根路徑的方式顯示不同的門(mén)戶,同時(shí)在后臺(tái)應(yīng)用服務(wù)器上可以共享應(yīng)用,但是同時(shí)也帶來(lái)了潛在的維護(hù)成本和系統(tǒng)風(fēng)險(xiǎn)。
那么到底采用什么樣的方式配置虛擬主機(jī)呢?
其實(shí)這個(gè)需要實(shí)際場(chǎng)景來(lái)決定,以下幾個(gè)條件可以參考:
1. 是否需要共享應(yīng)用?
2. 是否需要都使用根路徑?
3. 是否需要通過(guò)Apache來(lái)提供負(fù)載均衡?
根本目標(biāo)是開(kāi)發(fā)和維護(hù)簡(jiǎn)單化,夠用就是最好的,做技術(shù)的朋友最怕追求技術(shù)先進(jìn)性。
參考文獻(xiàn):
1. mod_proxy - Apache 2.2 中文版參考手冊(cè),
http://doc.chinahtml.com/Manual/ApacheManual/mod/mod_proxy.html
2. 基于反相代理的Web緩存加速
http://www.chedong.com/tech/cache.html
posted on 2008-02-28 23:08 zYx.Tom 閱讀(1641) 評(píng)論(4) 編輯 收藏