Apache + Tomcat 配置

Linux系统 gongyj 1482℃ 已收录 0评论

Apache 和 Tomcat 都是 web 网络服务器,两者既有联系又有区别,在进行 HTML、PHP、JSP、Perl 等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置。Apache 是普通的 web 服务器,本身只支持 html 即普通网页(静态解析),但像 jsp 这样的动态网页就需要 Tomcat 来处理。Tomcat 是 java 应用服务器(动态解析,如JSP),Tomcat 只是一个 servlet(jsp 也翻译成 servlet)容器,可以认为是 Apache 的扩展,但是可以独立于 Apache 运行。事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80。

Tomcat.png

Apache 是有 C 语言实现的,支持各种特性和模块从而来扩展核心功能;Tomcat 是 Java 编写的,更好的支持 Servlet 和 JSP。既然 Tomcat 本身已经可以提供这样的服务,为什么要让 Apache 与 Tomcat 之间进行连接呢?原因有以下几点:

1、Apache 侧重于 http server,Tomcat 侧重于 servlet 引擎,如果以 standalone 方式运行,功能上 Tomcat 与 apache 等效支持 JSP,从Tomcat 权威指南中的测试数据,我们不难发现,对于静态页面的数据,Tomcat 的处理速度比 Apache 要快很多,但是 Tomcat 经不起大的并发量,容易死。

2、Apache 可以运行一年不重启,稳定性非常好,而 Tomcat 则不见得,虽然 Apache 的速度要慢一些,但能承受的起大的并发量。

3、首选 web 服务器是 Apache,但 Apache 解析不了的 jsp、servlet 才用 Tomcat。

整合的好处:

1、如果客户端请求的是静态页面,则只需要 Apache 服务器响应请求,提升对静态文件的处理性能;

2、如果客户端请求动态页面,则是 Tomcat 服务器响应请求;

3、因为 jsp 是服务器端解释代码的,这样整合就可以减少 Tomcat 的服务开销;

4、还可以利用 Web 服务器来做负载均衡以及容错。

这四点对一个 web 网站来说是非常之重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因为某个 Tomcat 宕机或者是升级程序导致用户访问不了,Apache 跟 tomcat 的结合是最紧密和可靠的。

接下来我们介绍三种方法将 Apache 和 tomcat 整合在一起。

一、HTTP_Proxy

这是利用 Apache 自带的 mod_proxy 模块使用代理技术来连接 Tomcat。在配置之前请确保是否使用的是 2.2.x 版本的 Apache 服务器。因为 2.2.x 版本对这个模块进行了重写,大大的增强了其功能和稳定性。

1、编译安装 Apache

[root@localhost ~]# tar xf httpd-2.2.29.tar.gz
[root@localhost ~]# yum install -y gcc gcc-c++ apr apr-util openssl-devel
[root@localhost ~]# cd httpd-2.2.29
[root@localhost httpd-2.2.29]# ./configure --prefix=/usr/local/apache2 \
--enable-so  --enable-mods-shared=all --enable-ssl --with-ssl \
--enable-proxy-balancer --enable-proxy-http --enable-proxy-connect --enable-proxy --enable-rewrite --enable-proxy-ajp

2、修改 Apache 配置文件

保证 Apache 加载一下几个代理模块,这样代理功能才能开启

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

然后配置代理和负载均衡,配置如下:

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/

在这个配置中,我们把所有 http://localhost 的请求代理到 http://localhost:8080/ ,这也就是 Tomcat 的访问地址,除了 images、css、js 几个目录除外,这几个目录直接访问,不使用代理。我们同样可以利用 mod_proxy 来做负载均衡,配置如下:

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
<Proxy balancer://mycluster>  
    BalancerMember http://192.168.10.121:8080/
    BalancerMember http://192.168.10.122:8080/
    BalancerMember http://192.168.10.123:8080/
    ProxySet lbmethod=byrequests  
</Proxy>  
ProxyRequests Off  
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID nofailover=Off  
ProxyPassReverse / balancer://mycluster/

HTTP_Proxy 方式配置起来非常简单,也是配置反向代理最简单的方法,适用于所有需要代理的 http 请求的设置。

二、AJP(Apache JServer Protocol)

Tomcat 提供了 ajp 协议,当我们不想 Tomcat 的 8080 端口开放时,可以使用此方式。其实只加载前面三行也就行了,因为采用的是 ajp 代理。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so

AJP_Proxy 连接方式其实跟 HTTP_Proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。首先需要在 Tomcat 中开启 ajp 服务,Tomcat 7默认就已经开启了,端口是 8009 ,如果需要修改端口,修改 server.xml 中的下面一行:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

上面例子的配置可以改为:

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
<Proxy balancer://mycluster>  
    BalancerMember ajp://192.168.10.121:8009/
    BalancerMember ajp://192.168.10.122:8009/
    BalancerMember ajp://192.168.10.123:8009/
    ProxySet lbmethod=byrequests  
</Proxy>  
ProxyRequests Off  
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID nofailover=Off  
ProxyPassReverse / balancer://mycluster/

mod_proxy_ajp 配置起来也很简单方便,通过 ajp 协议访问性能优于 http 协议,随着并发量的提升,效果会更加趋于明显。可以从吞吐率和总时间开销上观察。AJP 使用长连接保持 webServer 和 servlet Container 的通信,减少了建立 tcp 连接的开销,它使用一定的协议格式,减少了传递的报文数据大小,节省了带宽。

AJP 也是有缺点,其配置相对较弱,不支持对文件扩展名的模式匹配。AJP 协议没有加密,不能够用在开放外部网络环境中。AJP 协议还有一个主要的限制,就是 packet 的大小不能超过 8K。

三、JK

Mod_JK 是 Apache 的一个模块,其通过 AJP 协议实现 Apache 与 Tomcat 之间的通讯,而 Tomcat 默认监听 AJP 连接器的 8009 端口来接受 AJP的连接请求,一般这些请求来自前端的 Apache 服务器。JK 本身有两个版本分别是 1 和 2,目前 1 最新的版本是 1.2.41(2015-08-11),而版本 2 早已经废弃了,以后不再有新版本的推出了,所以建议你采用版本 1。最新的 mod_jk 和 Tomcat 使得 packet 限制可以加大到 64K。

由于 Mod_JK 已经被设计成 Apache 的一个模块,因此可以通过一些相对简单的配置就能达到 Apache 和 Tomcat 之间通讯的目的,同样包含负载均衡。

1、首先下载并编译安装 JK 模块:

[root@localhost ~]# tar xf tomcat-connectors-1.2.41-src.tar.gz
[root@localhost ~]# cd tomcat-connectors-1.2.41-src/native/
[root@localhost native]# ./configure --with-apxs=/usr/local/apache2/bin/apxs
[root@localhost native]# make && make install

JK 的配置最关键的有三个文件,分别是

httpd.conf :Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息

workers.properties:到 Tomcat 服务器的连接定义文件

uriworkermap.properties:URI 映射文件,用来指定哪些 URL 由 Tomcat 处理,你也可以直接在 httpd.conf 中配置这些 URI,但是独立这些配置的好处是 JK 模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动 Apache 服务器。

tomcat-connectors 包中,有配置文件样例,workers.properties 与 uriworkermap.properties 名字也可以修改,只需要在 httpd.conf 配置文件中,修改一下就可以了。

2、修改配置文件

首先修改 Apache 主配置文件,可以直接在 httpd.conf 中添加 mod_jk 模块配置信息,也可以 Include 引用 mod_jk.conf。

加载模块mod_jk:

vim /usr/local/apache2/conf/httpd.conf
#Load mod_jk module
LoadModule jk_module modules/mod_jk.so 

#Where to find workers.properties
JkWorkersFile conf/workers.properties 
JkMountFile   conf/uriworkermap.properties

#Where to put jk logs 
JkLogFile logs/mod_jk.log 

#Shared memory file name
JkShmFile logs/mod_jk.shm

#Set the jk log level[debug/error/info]
JkLogLevel info 

#Select the log format
JkLogStampformat "[%a %b %d %H:%M:%S %Y]"

#JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"

JkMount /* balancer


接下来我们在 Apache 的 conf 目录下,新建两个文件分别是 workers.properties、uriworkermap.properties,如下:

vim /usr/local/apache2/conf/workers.properties

#定义 Tomcat 主机与状态页面

worker.list=jk-status
worker.jk-status.type=status
worker.jk-status.read_only=true

worker.list=jk-manager
worker.jk-manager.type=status

worker.list=balancer
worker.balancer.type=lb
worker.balancer.error_escalation_time=0

worker.balancer.max_reply_timeouts=10

worker.balancer.balance_workers=node1
worker.node1.reference=worker.template
worker.node1.host=192.168.10.121
worker.node1.port=8009
worker.node1.lbfactor=2
worker.node1.activation=A

worker.balancer.balance_workers=node2
worker.node2.reference=worker.template
worker.node2.host=192.168.10.122
worker.node2.port=8009
worker.node2.activation=A

worker.balancer.balance_workers=node3
worker.node2.reference=worker.template
worker.node2.host=192.168.10.123
worker.node2.port=8009
worker.node2.activation=A

worker.template.type=ajp13

worker.template.socket_connect_timeout=5000

worker.template.socket_keepalive=true

worker.template.ping_mode=A

worker.template.ping_timeout=10000

worker.template.connection_pool_minsize=0

worker.template.connection_pool_timeout=600

worker.template.reply_timeout=300000

worker.template.recovery_options=3

在 Apache 主配置文件中,有 JkMount /* balancer,这个 balancer 正好对应上面 worker.list 一行中的 balancer。node1、node2 与 node3

都是配置的后台 Tomcat 服务器,lbfactor 表示在负载均衡算法中采用的权重,默认就是 1。

下面详细的所以下配置文件的功能,首先我们配置了两个类型为 status 的 worker ,这 2 个是用来监控和管理 JK 本身的模块。接下来我们配置了一个类型为 lb(也就是负载均衡的意思)的 worker,它的名字是 balancer ,这是一个逻辑的 worker,它用来管理下边配置中的几个 Tomcat 后端服务器的连接可用。然后又配置了类型是模板参数中设置的 ajp13,在 balancer 下管理的 3 个后端 Tomcat 服务器,都是 AJP 的默认端口 8009。有了这三个 worker 还不够,我们还需要告诉 JK,哪些 worker 是可用的,所以就有 worker.list 这几行配置。

接下来便是 URI 的映射配置了,看看下面这个文件你就能明白其中配置的意义。

vim /usr/local/apache2/conf/uriworkermap.properties


在 uriworkmap.properties 文件中定义了 Tomcat 处理的文件类型,哪些请求会转交给它,Tomcat 不处理的由 Apache 来处理。

/*=balancer
/admin/*=balancer
/manager/*=balancer

/jk-manager=jk-manager
/jk-status=jk-status

!/*.jpg=balancer
!/*.gif=balancer
!/*.png=balancer
!/*.bmp=balancer
!/*.html=balancer
!/*.htm=balancer
!/*.swf=balancer
!/*.css=balancer
!/*.js=balancer

在 Apache 主配置文件中的 JkMount /* balancer 如果没有设置,也可改写到这个文件中来。所有的请求都是由 balancer 这个 worker 进行处理的,但是也有几个例外,jk-manager 与 jk-status 是由想对应的状态监控与管理的 worker 处理的。感叹号表示接下来的 URI 不要由 JK 进行处理,也就是 Apache 直接处理所有的图片、css 文件、js 文件以及静态 html 文本文件。这文件修改后即时生效,不用重启服务.

通过对 workers.properties 和 uriworkermap.properties 的配置,可以有各种各样的组合来满足我们前面提出对一个 web 网站的要求。还有很多的配置参数并没有演示,详细配置参数文档请参考官方文档:http://tomcat.apache.org/connectors-doc/

如果是在某台机器上,有多个虚拟机,并且各自的路径不一样,只需要通过在每个虚拟机里定义相应的 uriworkermap.properties 文件就行了。

<VirtualHost *:80> 
     ServerAdmin admin@example.com  
     DocumentRoot /data/www  
     ServerName www.test.com  
     ErrorLog logs/error_log  
     CustomLog logs/access_log common  
     JkMountFile  conf/uriworkermap.properties  
</VirtualHost>

3、查看状态信息

JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jk-status 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置,为只读模式,仅可查看,想好修改就需要 jk-manager 页面来操作,如下图所示:

JK-Status.png

Mod_JK 是先进的负载均衡器,先进的节点失败侦察和修复功能,支持大型 AJP 数据包。但配置起来比较复杂,需要单独维护一个独立的模块,Mod_JK 的功能很丰富也和稳定,比 Mod_Proxy有更多的优势,也是最流行的方式,并且官方的文档也非常全,推荐使用这种模式。如果你需要 https 和一个简单的负载均衡,就使用 Mod_Proxy,配置起来简单方便。

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://blog.chopmoon.com/favorites/224.html
喜欢 (0)
发表我的评论
取消评论

表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
正在加载中……