這幾天又研究了一下,有新的發(fā)現(xiàn),趕緊記錄下來。
其實(shí)可以通過Apache的代理功能來實(shí)現(xiàn)靜態(tài)資源和動(dòng)態(tài)資源的分離。
假設(shè)我的web項(xiàng)目中有3個(gè)文件夾,分別用來存放不同的靜態(tài)資源,如:
1) dojo_lib: 存放所有dojo文件(這個(gè)比較大)
2) css: 存放項(xiàng)目應(yīng)用的css樣式
3) pages: 存放項(xiàng)目的頁面文件
現(xiàn)在我想把dojo_lib放在Apache服務(wù)器里,不跟web項(xiàng)目一起部署到tomcat。而css和pages則跟項(xiàng)目一起部署到tomcat。當(dāng)要請(qǐng)求dojo_lib里的文件時(shí),Apache服務(wù)器直接處理請(qǐng)求;而當(dāng)請(qǐng)求css或pages里的文件時(shí),Apache服務(wù)器把請(qǐng)求轉(zhuǎn)給tomcat處理。
好了,怎樣實(shí)現(xiàn)呢?方法如下:
第一步:
準(zhǔn)備兩個(gè)FQDN。一個(gè)用來訪問靜態(tài)資源,一個(gè)用來訪問web項(xiàng)目。(還沒想到怎樣才可以只用一個(gè)FQDN來實(shí)現(xiàn)。。)
FQDN1:static.webapp.com // 用來訪問靜態(tài)資源
FQDN2:webapp.com // 用來訪問web項(xiàng)目
(注:這兩個(gè)FQDN都指向同一個(gè)IP,即本地服務(wù)器IP)
第二步:
寫一個(gè) "static-resource-proxy.conf" 文件,內(nèi)容如下,然后include到httpd.conf里。
第一個(gè)ProxyPass,意思是,若請(qǐng)求的開頭是/dojo_lib/的話,則這個(gè)請(qǐng)求不會(huì)交給應(yīng)用服務(wù)器(即tomcat)處理,而是由Apache自己處理。Apache會(huì)把這個(gè)請(qǐng)求轉(zhuǎn)換為一個(gè)代理請(qǐng)求。例如,如果原請(qǐng)求是http://webapp.com/dojo_lib/dojo/dojo.js,Apache會(huì)把它轉(zhuǎn)換為代理請(qǐng)求http://static.webapp.com/dojo_lib/dojo/dojo.js。
第二個(gè)ProxyPass,同理,若請(qǐng)求的開頭是/css/(如http://webapp.com/css/app.css),Apache會(huì)把它轉(zhuǎn)換為一個(gè)代理請(qǐng)求(http://webapp.com:8001/project_name/css/app.css)。注意看這個(gè)代理的URL,它是把請(qǐng)求交給tomcat處理,直接訪問web項(xiàng)目內(nèi)部的資源。(我的tomcat端口是8001)
第三個(gè)ProxyPass,同上。
第四個(gè)ProxyPass,這個(gè)是什么意思呢?它的意思是,把http://webapp.com/ 下的所有請(qǐng)求都交給tomcat處理,轉(zhuǎn)換為http://webapp.com:8001/project_name/ 下的對(duì)應(yīng)請(qǐng)求。例如,如果原請(qǐng)求是http://webapp.com/index.do,Apache會(huì)把它轉(zhuǎn)換為http://webapp.com:8001/project_name/index.do。
關(guān)于這四個(gè)ProxyPass的順序,前三個(gè)順序無所謂,但第四個(gè)一定要放在最后。我的猜測是,Apache在匹配請(qǐng)求的時(shí)候,是從上到下逐個(gè)匹配的。一旦找到對(duì)應(yīng)請(qǐng)求,就馬上觸發(fā)代理規(guī)則,并停止向下匹配。而第四個(gè)可匹配的范圍最大,所以要放最后。
第四個(gè)ProxyPass會(huì)導(dǎo)致一個(gè)非常好的結(jié)果,那就是可以隱藏tomcat的端口和項(xiàng)目名。想想,當(dāng)只有tomcat時(shí),我們?cè)L問項(xiàng)目時(shí)要指定端口和項(xiàng)目名,如http://webapp.com:8001/project_name/index.do?,F(xiàn)在有了Apache代理,我們只需要訪問http://webapp.com/index.do就可以了。
補(bǔ)充:
其實(shí)之前也嘗試過利用Apache的代理來轉(zhuǎn)發(fā),但一直不成功。原因是當(dāng)時(shí)我的代理配置是這樣的:
聯(lián)系客服