1. 程式人生 > >Apache整合Tomcat實現靜態資源與動態資源分離

Apache整合Tomcat實現靜態資源與動態資源分離

關於這個話題,在網上搜了很多資料,要麼看不懂,要麼寫得不詳細,要麼跟著做也不能實現。好不容易嘗試了一種方法,先記下。

背景:

以前做專案,喜歡把所有檔案(html, js, css, class)打包成一個war,然後直接放在tomcat上跑,方便快捷,也沒出現過什麼問題。最近接觸了Apache伺服器,發現如果把靜態資源放在apache上,訪問的速度會比放在tomcat上快,而且也能減少war包的大小,加快部署tomcat的速度。(特別是不用把dojo那堆檔案放在war上...)

好了言歸正傳。下面說一下實現的方法。

第一步:

修改本地host檔案(C:\Windows\System32\drivers\etc\host),增加一個FQDN,用來訪問靜態資源。如:

127.0.0.1 static.topsuapp.com

第二步:

把專案的靜態資源複製到Apache的某個目錄下(如:${SRVROOT}/htdocs/topsuapp。${SRVROOT}是apache的安裝目錄)

第三步:

自己寫一個conf檔案,名字就叫"topsu-app.conf",內容如下。然後在httpd.conf裡引用這個檔案。 (Include conf/test/topsu-app.conf)

LoadModule headers_module modules/mod_headers.so

<VirtualHost *:80>
    Header set Access-Control-Allow-Origin http://topsuapp.com:9001
    ServerName static.topsuapp.com
    DocumentRoot "${SRVROOT}/htdocs/xwanapp"
</VirtualHost>
說明:

1)LoadModule, 要先載入apache的headers_module

2)Header 這行很重要,宣告哪個url可以跨域訪問這些靜態資源。(也可以把後面的url改成 “*” ,即 “Header set Access-Control-Allow-Origin *”,表示所有人都能訪問這些靜態資源,但這樣好像很不安全。)

3)ServerName 指出用哪個url來訪問這些靜態資源。這樣用了第一步建立的url "static.topsuapp.com"

4)DocumentRoot 指出放靜態資源的位置

第四步:

在專案檔案中,比如index.jsp,用下面的方法引用靜態資源

<head>
<meta charset="UTF-8">
<link href="http://static.topsuapp.com/dojo_lib/gridx/resources/claro/Gridx.css" rel="stylesheet" type="text/css"/>
<link href="http://static.topsuapp.com/dojo_lib/dijit/themes/claro/claro.css" rel="stylesheet" type="text/css"/>
<link href="http://static.topsuapp.com/css/app.css" rel="stylesheet" type="text/css"/>

最後,把專案部署到tomcat。啟動tomcat和apache,訪問專案url http://topsuapp.com:9001,發現所有靜態資源都可以訪問。

補充:

關於Access-Control-Allow-Origin,後面要麼匹配一條url (如:http://topsuapp.com:9001),要麼匹配所有(如:*)。暫時沒發現怎樣才能匹配額定幾條url。