Ubuntu系统 Tomcat7 + Apache2.4 整合

首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接。事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80。

既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢?

原因有下面几个:

1.提升对静态文件的处理性能
2.利用 Web 服务器来做负载均衡以及容错
3.无缝的升级应用程序

这三点对一个 web 网站来说是非常之重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因为某个 Tomcat宕机或者是升级程序导致用户访问不了,而能完成这几个功能的、最好的 HTTP 服务器也就只有apache 的 http server 了,它跟 tomcat 的结合是最紧密和可靠的。


在网上查了一些资料,自己也亲自实践,在这里总结下,也希望给大家一些参考!

环境:ubuntu 14.04(64位) + Tomcat 7 + Apache 2


tomcat和apache的安装过程,这里就不再介绍啦:

相关参考网址:Ubuntu 搭建LAMP开发环境


Apache 与 Tomcat 有三种连接方式,分别是mod_jk,http_proxy,ajp_proxy。

1.mod_jk

mod_jk是通过AJP协议与Tomcat服务器进行通讯的,Tomcat默认的AJP Connector的端口是8009。JK本身提供了

一个监控以及管理的页面jkstatus,通过jkstatus可以监控JK 目前的工作状态以及对到tomcat的连接进行设置; 

2.http_proxy

这是利用Apache自带的mod_proxy模块使用代理技术来连接Tomcat。在配置之前请确保是否使用的是2.2.x版本的

Apache服务器。因为2.2.x版本对这个模块进行了重写,大大的增强了其功能和稳定性。 

3. ajp_proxy

ajp_proxy连接方式其实跟http_proxy方式一样,也是由mod_proxy所提供的功能,但是通过AJP协议与Tomcat服务

器进行通讯的,这一点又与mod_jk相同。


了解更多,参考网址:Apache HTTP Server 与 Tomcat 的三种连接方式介绍

Apache与Tomcat整合实现动静分离与负载均衡的配置实践


这里我使用的是mod_jk方式,mod_jk是通过AJP协议与Tomcat服务器进行通讯的,Tomcat默认的AJP Connector的端口是8009

1.安装AJP13并配置

AJP13是连接Apache2与Tomcat的连接器。通过mod_jk来实现,命令如下:

sudo apt-get install libapache2-mod-jk

安装完成后,到/etc/libapache2-mod-jk目录下,会有workers.properties配置文件,编辑该配置文件

vi /etc/libapache2-mod-jk/workers.properties

需要修改以下几个地方:

1)修改workers.tomcat_homeworkers.java_home的值为正确的路径

Tip:如何查看?



2)在worker.list后面添加jk-status,jk-manager的值,配置后如下

worker.list=ajp13_worker,jk-status,jk-manager

(若不加上这两个值,则在apache2启动后会看到一些警告信息)

jk-status与jk-manager用于监控mod_jk的运行与管理(默认只能在本机才能访问)

其它的使用默认配置,在这里可以看到默认已经创建了一个名叫ajp13_worker的worker,后面后面会用到这个名字.

配置完成后保存退出





3)配置拦截规则

此处最重要,用于指定哪些URL由Apache处理, 哪些URL需要转给Tomcat处理.(建议规则为: 所有静态的资源由Apache处理,如jpg,js,css, 动态的转给Tomcat处理,如加载数据,业务处理部分)

进入/etc/apache2/sites-available目录.编辑站点的配合文件

示例如下:



补充说明:

1.Apche mode_jk的JkMount与JkUnMount差别?

JkUnMount指定哪些匹配的URL由Apache处理,JkMount指定哪些匹配的URL转给Tomcat处理,如此处配置所

有以html,jsp结束的URL转给Tomcat处理。这里的ajp13_worker就是之前workers.properties中的创建的。

JkMount把匹配的转发到指定服务器。

JkUnMount把匹配的不转发到指定服务器。

JkUnMount选项的级别高于JkMount。

单独有JkMount规则有效,但单独有JkUnMount无效,JkUnMount与JkMount要成对出现。

例子:

JkMount    /*    ajp13_worker#通过JkMount把所有请求页面都交给ajp13_worker服务器(Tomcat)处理,由于JkUnMount级别高于JkMount,下面的过滤规则会过滤掉一些静态文件,这样配置也就支持了restful风格的URL
JkMount    /*.html    ajp13_worker #通过JkMount/*.html,表示所有*.html交给ajp13_worker服务器(Tomcat)处理
JkUnMount    /*.htm    ajp13_worker #通过JkUnMount/*.htm,表示所有*.htm不交给ajp13_worker服务器处理,由Apache直接处理
JkUnMount    /*.php    ajp13_worker
JkUnMount    /*.gif    ajp13_worker
JkUnMount    /*.jpg    ajp13_worker
JkUnMount    /*.png    ajp13_worker
JkUnMount    /*.css    ajp13_worker
JkUnMount    /*.js    ajp13_worker


2.URL对中文的支持.

若测试用中文的URL参数会出现乱码,这是字符编码的问题,通过设置UTF-8编码来解决。

1.设置Apache默认的字符编码为UTF-8. 在安装完成后进入/etc/apache2/目录, 编辑apache2.conf文件, 在里面添加AddDefaultCharset UTF-8并保存重启。
2.编辑Tomcat 的conf/server.xml文件, 将里面的AJP13的配置添加URIEncoding="UTF-8" 内容. 添加后如下
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />


3.静态资源带jsessionid导致无法加载问题
本文整合是为了让静态资源交给Apache处理,但你也可能和我一样遇到下面的问题
在jsp页面中引用静态文件使用了<c:url>标签:
如:<link rel="stylesheet" type="text/css" href="<c:url value='/css/index.min.css'/>"/>
第一次浏览器访问,tomcat并不知道浏览器是否支持cookie,所以就在所有url上都加了jsessionid,后续访问如果确认浏览器是支持cookie的,就没有有jsessionid了。

导致在第一次访问的时候就会默认加上jsessionid从而静态资源第一次访问时无法加载,如果再次刷新时就OK啦,会出现这种现象!


解决办法:开启重定向模块,写个重定向规则,过滤掉jsessionid。

在/etc/apache2/apache2.conf中加入:

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so


在虚拟主机配置文件(我的:/etc/apache2/sites-available/in-story.conf)中添加过滤规则:


重启apache,问题解决!


RewriteRule即为URL重写规则,语法为正则表达式,$1 、$2、$3 分别代表第一、二、三个小括号中的内容;[ ]中的内容为URL重写规则的标志,具体标志后面介绍。那么上面规则的意图已经很明显了,就是为了过滤掉URL中类似 ;jsessionid=4C646819A6C4C65CD2952B12F7CBF8BB 这样的字符串,当携带jsessionid的静态资源的URL交给Apache处理时,该URL中的jsessionid会被过滤掉后再去请求静态资源,这样就有效的避免了上述问题。


Apache mod_rewrite规则重写的标志一览:

1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联 如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量

参考资料:

http://blog.csdn.net/wqmain/article/details/8942391

http://slj.me/2009/04/apache-rewrite-regular/


更多相关参考资料:

http://www.cnblogs.com/junsong/archive/2012/07/03/2574447.html

http://www.cnblogs.com/misoag/archive/2013/01/04/2844255.html

http://blog.csdn.net/renhuailin/article/details/7790485

http://www.cnblogs.com/zxjyuan/p/3581480.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值