文档章节

apache + tomcat动静分离配置

Feng_Yu
 Feng_Yu
发布于 2014/10/27 09:50
字数 1268
阅读 5196
收藏 24

环境说明

线上环境使用apache+tomcat的形式部署应用程序,前端使用apache监听80端口,后端使用tomcat部署应用。tomcat的静态资源响应能力和并发处理能力均不如apache,经测试,apache响应静态资源的速度比tomcat快10%左右。

因此,有必要减轻一下tomcat的负载,获得更高的性能。基本思路就是将静态资源交给apache响应,动态资源交给tomcat,下面贴出配置以及解说。

配置总览

<LocationMatch "/app/(static/)?(css|flash|images|img|js)">
    ProxyPassMatch !
    <IFModule mod_headers.c>
        Header set Cache-Control "max-age=604800"
    </IFModule>
</LocationMatch>

FileEtag None

Alias /app/static /var/lib/tomcat7/webapps/app
Alias /app /var/lib/tomcat7/webapps/app
<Directory "/var/lib/tomcat7/webapps">
    AllowOverride None
    Require all granted
    #apache2.4的配置,注意2.2可能不识别这个,需要改为
    #Order Allow,Deny
    #Allow From All
</Directory>

#开启反向代理
ProxyRequests off 
ProxyPass /app ajp://127.0.0.1:8009/app 
#访问ajp协议时无需ProxyPassReverse

Apache和Tomcat的配置及说明

需要说明的是,这个反向代理使用了apache的模块proxy_ajp,并没有使用http反向代理。开启这个模块需要在apache的配置文件中加上

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

ubuntu下安装的apache直接使用命令a2enmod proxy_ajp即可

使用ajp做反向代理的原因主要有两个,一个是proxy_ajp是apache的内置模块,使用配置方便,而且性能稳定,无需安装第三方模块。第二个是apache和tomcat都是自家产品,整合起来方便,稳定性高,而且tomcat的文档中也是推荐使用ajp协议反向代理的。

在tomcat中需要开启ajp端口,找到tomcat的server.xml中的AJP关键字,修改配置如下:

<Connector address="127.0.0.1" port="8009" URIEncoding="UTF-8" protocol="AJP/1.3" />

打开AJP端口,如果无需对外可以只监听127.0.0.1. 这样apache就可以通过ProxyPass访问到ajp://127.0.0.1:8009。

tomcat存放静态资源的目录一般固定,所以反向代理配置还是很容易的,使用LocationMatch用正则同时匹配多个静态资源的目录即可,使用Alias定义路径别名,别忘了使用Directory配置段让apache具有对目录的访问权限。

apache对静态资源处理很强大,可以稍微改一下静态资源的响应,让访问性能提升。修改响应headers需要加载headers模块。

LoadModule headers_module modules/mod_headers.so

ubuntu下安装的apache使用命令a2enmod headers即可。

让浏览器缓存静态资源,对静态资源加上Cache-Control "max-age=604800",告诉浏览器将静态资源在本地缓存一周。

FileEtag None告诉apache关闭Etag,apache会默认对静态资源加上Etag头,但是这个头通常是不推荐使用的,我记得以前在哪本资料上看到过,说是雅虎的前端工程师们一致认为不使用ETag比较好,虽然ETag计算文件的变化更准确一些,但是会有一些问题,因为ETag是文件修改时间以及inode号之类的参数计算得到,会带来额外的负载。而且在CDN加速时,由于CDN上的inode和服务器不一致,导致CDN上ETag和服务器不同而缓存失效。所以通常情况下是不推荐使用ETag的,精确到秒级别的Last-Modified一般足够使用了,一秒内多次修改静态资源的几率并不高。

最终结果测试

最后,重启apache生效,看一下最终结果:

直接访问,可以看到静态资源都是(from cache) 在此输入图片描述

F5刷新,可以看到静态资源都是304 在此输入图片描述

CTRL+F5强制刷新,看一下静态资源的响应头 在此输入图片描述

修改响应头信息有效,带上了Cache-Control,同时apache也自动为静态资源加上了Last-Modified,同时删掉了ETag,静态资源缓存成功。

再看一下tomcat的accesslog

192.168.1.45 - - [27/Oct/2014:09:56:55 +0800] "GET /app/customer/list HTTP/1.1" 200 29733
192.168.1.45 - - [27/Oct/2014:10:05:26 +0800] "GET /app/user/preChangePwd HTTP/1.1" 200 17140
192.168.1.45 - - [27/Oct/2014:10:05:29 +0800] "GET /app/user/showOrgInfo HTTP/1.1" 200 14318
192.168.1.45 - - [27/Oct/2014:10:05:32 +0800] "GET /app/customer/list HTTP/1.1" 200 29733
192.168.1.56 - - [27/Oct/2014:10:09:50 +0800] "GET /app/configuration/showConfigHistory HTTP/1.1" 200 17279
192.168.1.17 - - [27/Oct/2014:10:10:14 +0800] "GET /app/desktop HTTP/1.1" 302 -
192.168.1.17 - - [27/Oct/2014:10:10:14 +0800] "GET /app/auth/login HTTP/1.1" 200 11187
192.168.1.34 - - [27/Oct/2014:10:10:54 +0800] "GET /app/auth/login HTTP/1.1" 200 11187
192.168.1.34 - - [27/Oct/2014:10:10:59 +0800] "GET /app/auth/login HTTP/1.1" 200 11187
192.168.1.34 - - [27/Oct/2014:10:20:44 +0800] "GET /app/auth/login HTTP/1.1" 200 11187
192.168.1.34 - - [27/Oct/2014:10:20:46 +0800] "GET /app/auth/login HTTP/1.1" 200 11187
192.168.1.34 - - [27/Oct/2014:10:20:51 +0800] "GET /app/auth/login HTTP/1.1" 200 11187
192.168.1.34 - - [27/Oct/2014:10:21:04 +0800] "GET /app/auth/login HTTP/1.1" 200 11187
192.168.1.34 - - [27/Oct/2014:10:22:57 +0800] "GET /app/auth/login HTTP/1.1" 200 11187
192.168.1.34 - - [27/Oct/2014:10:23:50 +0800] "GET /app/auth/login HTTP/1.1" 200 11187

可以看到已经没有静态资源的请求信息了,动静分离成功!

© 著作权归作者所有

共有 人打赏支持
Feng_Yu
粉丝 159
博文 38
码字总数 45571
作品 0
西安
运维
私信 提问
加载中

评论(12)

边听歌边代码
边听歌边代码

引用来自“边听歌边代码”的评论

你好,我现在遇到了一个问题,请求的页面没有带后缀名该怎么写规则来实现呢?可以反过来写,静态页面直接apache处理,其他都交给tomcat吗

引用来自“Feng_Yu”的评论

只要你有办法判断哪些是静态资源,哪些是动态资源就行了。所以通常的建议都是将静态资源和动态资源分别放在不同的prefix,这样就好区分了,规则也好写的多。

引用来自“边听歌边代码”的评论

目前的处理是写规则罗列出静态页面直接由apache处理,其他再转发给tomcat,我有看到你写的这一段,就是不知道怎么配置。

tomcat存放静态资源的目录一般固定,所以反向代理配置还是很容易的,使用LocationMatch用正则同时匹配多个静态资源的目录即可,使用Alias定义路径别名,别忘了使用Directory配置段让apache具有对目录的访问权限。

引用来自“Feng_Yu”的评论

这里的配置我贴出来了啊。我的app.war是部署在/var/lib/tomcat7/webapps/app.war的,于是tomcat部署的时候会把war包解压,释放出目录/var/lib/tomcat7/webapps/app/,这里面就包含有静态资源的目录,于是根据页面上的静态资源的路径改下apache的配置,alias过去就行了,将这几个静态资源路径交给apache直接响应,其他交给tomcat响应。
ok,那我试试,谢谢啦
Feng_Yu
Feng_Yu

引用来自“边听歌边代码”的评论

你好,我现在遇到了一个问题,请求的页面没有带后缀名该怎么写规则来实现呢?可以反过来写,静态页面直接apache处理,其他都交给tomcat吗

引用来自“Feng_Yu”的评论

只要你有办法判断哪些是静态资源,哪些是动态资源就行了。所以通常的建议都是将静态资源和动态资源分别放在不同的prefix,这样就好区分了,规则也好写的多。

引用来自“边听歌边代码”的评论

目前的处理是写规则罗列出静态页面直接由apache处理,其他再转发给tomcat,我有看到你写的这一段,就是不知道怎么配置。

tomcat存放静态资源的目录一般固定,所以反向代理配置还是很容易的,使用LocationMatch用正则同时匹配多个静态资源的目录即可,使用Alias定义路径别名,别忘了使用Directory配置段让apache具有对目录的访问权限。
这里的配置我贴出来了啊。我的app.war是部署在/var/lib/tomcat7/webapps/app.war的,于是tomcat部署的时候会把war包解压,释放出目录/var/lib/tomcat7/webapps/app/,这里面就包含有静态资源的目录,于是根据页面上的静态资源的路径改下apache的配置,alias过去就行了,将这几个静态资源路径交给apache直接响应,其他交给tomcat响应。
边听歌边代码
边听歌边代码

引用来自“边听歌边代码”的评论

你好,我现在遇到了一个问题,请求的页面没有带后缀名该怎么写规则来实现呢?可以反过来写,静态页面直接apache处理,其他都交给tomcat吗

引用来自“Feng_Yu”的评论

只要你有办法判断哪些是静态资源,哪些是动态资源就行了。所以通常的建议都是将静态资源和动态资源分别放在不同的prefix,这样就好区分了,规则也好写的多。
目前的处理是写规则罗列出静态页面直接由apache处理,其他再转发给tomcat,我有看到你写的这一段,就是不知道怎么配置。

tomcat存放静态资源的目录一般固定,所以反向代理配置还是很容易的,使用LocationMatch用正则同时匹配多个静态资源的目录即可,使用Alias定义路径别名,别忘了使用Directory配置段让apache具有对目录的访问权限。
Feng_Yu
Feng_Yu

引用来自“边听歌边代码”的评论

你好,我现在遇到了一个问题,请求的页面没有带后缀名该怎么写规则来实现呢?可以反过来写,静态页面直接apache处理,其他都交给tomcat吗
只要你有办法判断哪些是静态资源,哪些是动态资源就行了。所以通常的建议都是将静态资源和动态资源分别放在不同的prefix,这样就好区分了,规则也好写的多。
边听歌边代码
边听歌边代码
你好,我现在遇到了一个问题,请求的页面没有带后缀名该怎么写规则来实现呢?可以反过来写,静态页面直接apache处理,其他都交给tomcat吗
Feng_Yu
Feng_Yu

引用来自“songruyi”的评论

tomcat修改为<Connector address="127.0.0.1" port="8009" URIEncoding="UTF-8" protocol="AJP/1.3" />之后报错:严重: Catalina.stop:
org.xml.sax.SAXParseException: Attribute "protocol" was already specified for el
ement "Connector".
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Ab
stractSAXParser.java:1231)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.p
arse(SAXParserImpl.java:522)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1642)
at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:396)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:338)
at
这错误信息不是已经写了么? Attribute "protocol" was already specified for element "Connector". 你已经定义了同样protocol的connector
s
songruyi
大神麻烦帮我分析下这是为什么?
s
songruyi
tomcat修改为<Connector address="127.0.0.1" port="8009" URIEncoding="UTF-8" protocol="AJP/1.3" />之后报错:严重: Catalina.stop:
org.xml.sax.SAXParseException: Attribute "protocol" was already specified for el
ement "Connector".
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Ab
stractSAXParser.java:1231)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.p
arse(SAXParserImpl.java:522)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1642)
at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:396)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:338)
at
Feng_Yu
Feng_Yu

引用来自“庆沉”的评论

大神,有nginx+tomcat动静分离的配置吗?
原理是一样的。只要让静态资源的location不走反向代理,直接用nginx响应即可
庆沉
庆沉
大神,有nginx+tomcat动静分离的配置吗?
Nginx加多个tomcat实现负载均衡,动静分离

一:Nginx+Tomcat的动静分离 所谓动静分离就是通过nginx(或apache等)来处理用户端请求的图片、html等静态的文件,tomcat(或weblogic)处理jsp、do等动态文件,从而达到动静页面访问时通过...

fighting-cluber
2014/03/16
0
0
Nginx+Tomcat动静分离经典案例配置

随着Nginx高性能Web服务器大量被使用,目前Nginx最新稳定版为1.2.6,张宴兄在实际应用中大量使用Nginx,并分享Nginx高性能Web服务器知识,使得Nginx在国内也是飞速的发展。那今天咱们再来温习...

StevenJHM
2017/01/11
0
0
关于tomcat的ajp协议

关于这个协议,一直看不明白,网上的博客讲的也都是千篇一律。 都说ajp协议是tomcat为了动静资源处理分离时,通过该协议可以将css、js等静态资源请求转发到Apache的http服务器处理,提高并发...

热心市民王先生
2018/06/10
1K
1
Nginx + Tomcat + Ngx_cache_purge 实现高效反向代理

Nginx处理用户请求的静态页面,tomcat处理用户请求jsp页面,来实现动态分离,前端nginx反向代理后端nginx+tomcat集群,实现负载均衡,这样一来就能更好的提高并发,处理性能,并隐藏后端,提...

静夜听风
2015/04/02
0
6
nginx+tomcat实现动静分离

nginx+tomcat实现动静分离 本文设计的动静分离结构 在本文中,我们将静态资源放在 A 主机的一个目录上,将动态程序放在 B 主机上,同时在 A 上安装 Nginx 并且在 B 上安装 Tomcat。配置 Ngin...

linjin200
2018/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-13(Mybatis基本概念和简单的例子)

在mybatis初次学习Mybatis的时候,遇到了很多问题,虽然阿里云的视频有教学,但是视频教学所使用的软件和我自己使用的软件不用,我自己用的数据库是oracle数据库,开发环境是idea。而且视频中...

白话
今天
4
0
Java基础:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: /** The value is used for character storage. */private final cha...

watermelon11
今天
2
0
mogodb服务

部署MongoDB 官网: https://www.mongodb.com/download-center/community 创建mongo数据目录 mkdir /data/mongodb 二进制部署 wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x8......

以谁为师
昨天
5
0
大神教你Debian GNU/Linux 9.7 “Stretch” Live和安装镜像开放下载

Debian项目团队于昨天发布了Debian GNU/Linux 9 "Stretch" 的第7个维护版本更新,重点修复了APT软件管理器中存在的安全漏洞。在敦促每位用户尽快升级系统的同时,Debian团队还发布了Debian ...

linux-tao
昨天
4
0
PHP 相关配置

1. php-fpm的pool 编辑php-fpm配置文件php-fpm.con vim /usr/local/php/etc/php-fpm.conf //在[global]部分增加以下内容 include = etc/php-fpm.d/*.conf # 相当与Nginx的虚拟主机文件 “vho......

Yue_Chen
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部