分享

Apache整合Tomcat实现静态资源与动态资源分离(二)

 WindySky 2016-04-08

这几天又研究了一下,有新的发现,赶紧记录下来。


其实可以通过Apache的代理功能来实现静态资源和动态资源的分离。


假设我的web项目中有3个文件夹,分别用来存放不同的静态资源,如:
1) dojo_lib: 存放所有dojo文件(这个比较大)
2) css: 存放项目应用的css样式
3) pages: 存放项目的页面文件


现在我想把dojo_lib放在Apache服务器里,不跟web项目一起部署到tomcat。而css和pages则跟项目一起部署到tomcat。当要请求dojo_lib里的文件时,Apache服务器直接处理请求;而当请求css或pages里的文件时,Apache服务器把请求转给tomcat处理。


好了,怎样实现呢?方法如下:


第一步:

准备两个FQDN。一个用来访问静态资源,一个用来访问web项目。(还没想到怎样才可以只用一个FQDN来实现。。)

FQDN1:static. // 用来访问静态资源

FQDN2: // 用来访问web项目

(注:这两个FQDN都指向同一个IP,即本地服务器IP)


第二步:

写一个 "static-resource-proxy.conf" 文件,内容如下,然后include到httpd.conf里。

  1. # 要载入这两个modules  
  2. LoadModule proxy_module modules/mod_proxy.so  
  3. LoadModule proxy_http_module modules/mod_proxy_http.so  
  4.   
  5. <VirtualHost *:80>  
  6.     # DocumentRoot, 存放静态资源的地方  
  7.     DocumentRoot C:/Project-Tools/httpd-2.4.18-x64/Apache24/htdocs/webapp/  
  8.     ServerName static. # 访问静态资源的FQDN  
  9.     ServerAlias static.  
  10. </VirtualHost>  
  11.   
  12. <VirtualHost *:80>  
  13.     ServerName  # 访问项目的FQDN  
  14.     ServerAlias   
  15.     ErrorLog logs/webapp-error.log  
  16.     CustomLog logs/webapp-access.log common  
  17.   
  18.     # 下面是重点  
  19.     ProxyRequests off  
  20.     ProxyPass /dojo_lib/ http://static./dojo_lib/  
  21.     ProxyPass /css/ http://:8001/project_name/css/  
  22.     ProxyPass /pages/ http://:8001/project_name/pages/  
  23.     ProxyPass / http://:8001/project_name/  
  24.     ProxyPassReverse / http://:8001/project_name/  
  25.   
  26.     # 非常重要,用于保持每个request都在同一个session里  
  27.     ProxyPassReverseCookiePath /project_name/ /  
  28. </VirtualHost>  


第一个ProxyPass,意思是,若请求的开头是/dojo_lib/的话,则这个请求不会交给应用服务器(即tomcat)处理,而是由Apache自己处理。Apache会把这个请求转换为一个代理请求。例如,如果原请求是http:///dojo_lib/dojo/dojo.js,Apache会把它转换为代理请求http://static./dojo_lib/dojo/dojo.js。


第二个ProxyPass,同理,若请求的开头是/css/(如http:///css/app.css),Apache会把它转换为一个代理请求(http://:8001/project_name/css/app.css)。注意看这个代理的URL,它是把请求交给tomcat处理,直接访问web项目内部的资源。(我的tomcat端口是8001)


第三个ProxyPass,同上。


第四个ProxyPass,这个是什么意思呢?它的意思是,把http:/// 下的所有请求都交给tomcat处理,转换为http://:8001/project_name/ 下的对应请求。例如,如果原请求是http:///index.do,Apache会把它转换为http://:8001/project_name/index.do。


关于这四个ProxyPass的顺序,前三个顺序无所谓,但第四个一定要放在最后。我的猜测是,Apache在匹配请求的时候,是从上到下逐个匹配的。一旦找到对应请求,就马上触发代理规则,并停止向下匹配。而第四个可匹配的范围最大,所以要放最后。


第四个ProxyPass会导致一个非常好的结果,那就是可以隐藏tomcat的端口和项目名。想想,当只有tomcat时,我们访问项目时要指定端口和项目名,如http://:8001/project_name/index.do。现在有了Apache代理,我们只需要访问http:///index.do就可以了。


补充:

其实之前也尝试过利用Apache的代理来转发,但一直不成功。原因是当时我的代理配置是这样的:

  1. # 要载入这两个modules    
  2. LoadModule proxy_module modules/mod_proxy.so    
  3. LoadModule proxy_http_module modules/mod_proxy_http.so    
  4.     
  5. <VirtualHost *:80>    
  6.     # DocumentRoot, 存放静态资源的地方    
  7.     DocumentRoot C:/Project-Tools/httpd-2.4.18-x64/Apache24/htdocs/webapp/    
  8.     ServerName static. # 访问静态资源的FQDN    
  9.     ServerAlias static.    
  10. </VirtualHost>    
  11.     
  12. <VirtualHost *:80>    
  13.     ServerName  # 访问项目的FQDN    
  14.     ServerAlias     
  15.     ErrorLog logs/webapp-error.log    
  16.     CustomLog logs/webapp-access.log common    
  17.     
  18.     # 下面是重点    
  19.     ProxyPass /dojo_lib/ http://static./dojo_lib/    
  20.     ProxyPass /css/ http://static./css/    
  21.     ProxyPass /pages/ http://static./pages/  
  22.  </VirtualHost>    



我把css和pages的请求都代理出去了,不交给tomcat。其实这没有问题。最大的问题是我没有配置第四个代理。所以我访问项目时发送的请求是http://:8001/project_name/index.do。(静态资源的访问地址是http://:8001/project_name/dojo_lib/dojo/dojo.js),代理不成功。为什么?因为我访问的端口(注意是在浏览器输入的端口,不是代理转发后的端口)是8001,不是80。而Apache只监听80端口,所以根本没有触发到Apache的代理规则...

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多