Apache 与 Tomcat 的三种连接方式介绍

http://hi.baidu.com/h819/blog/item/a1124b4efa59a4ced1c86a07.html

Apache 与 Tomcat 的三种连接方式介绍
2008-01-08 21:54

Apache 与 Tomcat 的三种连接方式介绍
主要参考文章:
http://zym-nanako.javaeye.com/blog/147526

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

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

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

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

在Apache2.2之前,一般有两个组件可选择。mod_jk和mod_jk2。后来mod_jk2由于没有开发人员的支持,没更新了,转而更新 mod_jk,所以现在一般都使用mod_jk做Apache和Tomcat的连接器。要指出的是mod_jk支持 Apache 1.x和2.X系列。
不过,自从Apache2.2出来后,又多了两种种选择,那就是 proxy-ajp 和 http-proxy。大家知道Apache里的proxy模块,可以实现双向代理功能,功能非常强大。其实从连接器的实现原理上来说,用proxy模块 来实现是非常自然的。proxy模块的功能无非就是把相关的请求发给特定的主机再返回结果。那连接器的功能需求就是要把所有对Servlet/JSP的请 求都转给后台的Tomcat。而且所FreeBSD邮件列表上说,使用proxy-ajp要比 mod_jk的效率要高。看来,使用Apache自带模块,要比另外编译的来得可靠。
既然有了ajp_proxy 专门的 ajp 协议代理,http-proxy 就没有必要使用这种方法了。

我主要测试成功了ajp_proxy ,http-proxy没有测试,jk 配置了一整天,没有成功,但是把主要过程附在后面,在必须要用 jd 这种方法时,作为参考。

环境: apache 2.2.4,tomcat 5.5,jdk1.5,winxpsp2

apache 2.2 及后续版本,在配置文件上面进行了调整,把一些配置繁琐的设置独立出来,在需要的时候再包含进主配置文件,以简化 httpd.conf 的文件管理。

一. ajp_proxy (重点采取的方法)

1. 开启代理模块
httpd.conf 文件中
#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

引入虚拟主机文件
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

去掉 #

2. 配置 ajp-proxy
为了针对不同的虚拟主机做不同的配置策略,把 ajp-proxy 的配置写在每个虚拟主机配置文件中,而不要写在全局配置中。

Apache2.2/conf/extra/httpd-vhosts.conf 文件中

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
# proxy 实现代理
# 实现 www.code.com 虚拟主机
<VirtualHost *:80>
    ServerAdmin webmaster@code.com
    DocumentRoot E:/program/www/www.code.com
    ServerName www.code.com
    ServerAlias code.com
  
   # 不需要代理的,apache 直接解析目录,用"!"
   # 顺序很重要,您需要把拒绝指令放置在普通ProxyPass指令之前
   ProxyPass /images/ !
   ProxyPass /css/ !
   ProxyPass /js/ !
   ProxyPass /php/ !
   # 转发所有非禁止的请求
   ProxyPass / ajp://127.0.0.1:8009/
   ProxyPassReverse / ajp://127.0.0.1:8009/
  
   #转发指定目录的请求
   #ProxyPass /jsp/ ajp://127.0.0.1:8009/jsp/
   #ProxyPassReverse /jsp/ ajp://127.0.0.1:8009/jsp/
   #ProxyPass /servlet/ ajp://127.0.0.1:8009/servlet/
   #ProxyPassReverse /servlet/ ajp://127.0.0.1:8009/servlet/


   #负载均衡,未测试
   #ProxyPass / balancer://example/
   #<Proxy balancer://example/>
   #BalancerMember ajp://server1:8080/
   #BalancerMember ajp://server2:8080/
   #BalancerMember ajp://server3:8080/
   #</Proxy>
  
    # logs
    # 一定要保证 E:/program/www/www.code.com/logs/httpd/ 目录存在,否则 apache 不能启动
    ErrorLog E:/program/www/www.code.com/logs/httpd/www.code.com_log
    CustomLog E:/program/www/www.code.com/logs/httpd/www.code.com_log common
   # 允许apache访问虚拟主机所在的目录   
    <Directory "E:/program/www/www.code.com">
        Options Indexes FollowSymlinks MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
   # 禁止apache访问虚拟主机所在的目录中的WEB-INF目录
   # 由于上述设定了转发所有的请求,tomcat 自然不会访问此目录,但也加在这里,用以明显申明。
    <Directory ~ "/WEB-INF/">
     Order deny,allow
     Deny from all
   </Directory>
   # 禁止apache访问虚拟主机所在的目录中的META-INF目录
   # 由于上述设定了转发所有的请求,tomcat 自然不会访问此目录,但也加在这里,用以明显申明。
   <Directory ~ "/META-INF/">
     Order deny,allow
     Deny from all
   </Directory>
</VirtualHost>

apache-tomcat-5.5.17/conf/server.xml 中

<Host name="www.code.com" debug="0" appBase="E:/program/www/"
   unpackWARs="true" autoDeploy="true"
   xmlValidation="false" xmlNamespaceAware="false">     
<Logger className="org.apache.catalina.logger.FileLogger"
           directory="E:/program/Apache2.2/logs/httpd" prefix="standard_log." suffix=".txt"
      timestamp="true"/>
           
      <Context
      path="" docBase="E:/program/www/code.com" debug="1" privileged="true" reloadable="true">
    </Context>
     
</Host>

说明:
1. 为了针对不同的虚拟主机做不同的配置策略,把 ajp-proxy 的配置写在每个虚拟主机配置文件中,而不要写在全局配置文件 httpd.conf 中。当启用虚拟主机配置文件 httpd-vhosts.conf 之后,主配置文件 httpd.conf 中的主机配置被替代,即只能访问 httpd-vhosts.conf 中配置的虚拟主机。

2. 虚拟主机的目录设置结构尽量清晰,如 /www 为所有虚拟主机的根目录的上级目录,各个虚拟主机的根目录都在 www 下面,如 www.code.com 虚拟主机的根目录为 /www/www.code.com。这样设置也方便 tomcat 虚拟主机设置(具体见 tomcat 设置文章)。

3. 相应的,tomcat 中也要设置对应的虚拟主机,才可以正确转发。
(故 http://www.code.com   和 http://www.code.com:8080 会访问同一个虚拟主机目录)
(修改 http://localhost:8080 的虚拟主机的内容,设置一个欢迎界面,代替默认的首页)

4. 为了简化配置工作,可把转发设置为全部转发;

5. 为了充分发挥 apache 的作用,合理规划目录结构,充分利用禁止转发功能。

二 JK

这是最常见的方式,JK 的官方开发一直在进行。可以在网上找到很多关于配置JK的网页,当然最全的还是其官方所提供的文档。JK本身有两个版本分别是1和2,目前1最新的版本是1.2.19,而版本2早已经废弃了,以后不再有新版本的推出了,所以建议你采用版本1。

JK是通过AJP协议与Tomcat服务器进行通讯的,Tomcat默认的AJP Connector的端口是8009。JK本身提供了一个监控以及管理的页面jkstatus,通过jkstatus可以监控JK目前的工作状态以及对到tomcat的连接进行设置。

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

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

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

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

其中第二、三个配置文件名都可以自定义。下面是一个典型的 httpd.conf 对JK的配置
(没有配置成功)

1.
# (httpd.conf)
# 加载mod_jk模块
LoadModule jk_module modules/mod_jk.so

# 加载相关配置文件
# tomcat by apollo
#Include conf/myconf/mod_jk.conf

2. 配置文件

# 本配置文件适用于 mod_jk-1.2.26
# 本配置文件参考如下网址,直接拷贝而来,仅做了一下必要的路径修改,要确保相应的配置文件都在正确的目录里面
# 默认的根路径为 apache_home
# http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
#
# It is suitable for JK 1.2.26,uesed with workers.properties file write by H819.
# Rewrite the parameters as your application
#
# Author H819
# 2008.01.03

# Load mod_jk module
LoadModule jk_module modules/mod_jk.so
#LoadModule asis_module modules/mod_asis.so

# Where to find workers.properties
JkWorkersFile E:/program/apache-tomcat-5.5.17/conf/workers.properties

# Where to put jk shared memory
JkShmFile     logs/httpd/mod_jk.shm

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

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

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

# send all requests ending in .jsp to worker1
JkMount /* worker1

# send all requests ending in .jsp to worker1
JkMount /*.jsp worker1

# send all ending servlet/* to worker1
#JkMount /servlet/* worker1


# send all requests ending .servlet to worker1
#JkMount /*.servlet worker1

 

#### examples
# Send servlet for context /examples to worker named worker1
#JkMount /examples/servlet/* worker1
# send all requests jsp requests to files located in /otherworker will go worker2
# JkMount /otherworker/*.jsp worker2
# send all requests ending in .do to worker1
#JkMount /*.do worker1

3. workers.properties

# The workers.properties file config document is at the url
# http://tomcat.apache.org/connectors-doc/reference/workers.html
# http://jakarta.apache.org/tomcat/connectors-doc/config/workers.html
#
# It is suitable for JK 1.2.26
# Rewrite the parameters as your application
#
# Author H819
# 2008.01.03

# the list of workers
worker.list=worker1

# Worker connection pool maintain timeout in seconds.This feature has been added in jk 1.2.13
worker.maintain=60

# Set properties for worker1
# Defines a worker named "worker1" that uses the ajpv13 protocol to forward requests to a Tomcat process.
# Ajp13 is now the only out-process protocol supported by Tomcat 4.0.x, 4.1.x and 5.
worker.worker1.type=ajp13

# worker "worker1" will talk to Tomcat listening on machine localhost (it can be www2.x.com) at port 8009
# Notes: In the ajpv13 protocol, the default port is 8009
worker.worker1.host=localhost
worker.worker1.port=8009

#
# for all detail configurable items , please refer to http://jakarta.apache.org/tomcat/connectors-doc/config/workers.html
# This directive should be used when you have a firewall between your webserver and the Tomcat engine, who tend to drop inactive connections.
worker.worker1.socket_keepalive=False

# worker "worker1" use up to 10 sockets, which will stay no more than 10mn in cache
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600

# worker "worker1" ask operating system to send KEEP-ALIVE signal on the connection
worker.worker1.socket_keepalive=1

# worker "worker1" want ajp13 connection to be dropped after 5mn (recycle)
worker.worker1.recycle_timeout=300

# load balancer .please refer to http://jakarta.apache.org/tomcat/connectors-doc/config/workers.html

 

/**
*参考资料


#
# Configure mod_jk
#

JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn

接下来我们在Apache的conf目录下新建两个文件分别是 workers.properties、uriworkermap.properties。这两个文件的内容大概如下

#
# workers.properties
#


# list the workers by name

worker.list=DLOG4J, status

# localhost server 1
# ------------------------
worker.s1.port=8109
worker.s1.host=localhost
worker.s1.type=ajp13

# localhost server 2
# ------------------------
worker.s2.port=8209
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.stopped=1

worker.DLOG4J.type=lb
worker.retries=3
worker.DLOG4J.balanced_workers=s1, s2
worker.DLOG4J.sticky_session=1

worker.status.type=status

以上的workers.properties配置就是我们前面那个屏幕抓图的页面所用的配置。首先我们配置了两个类型为ajp13的worker分 别是s1和s2,它们指向同一台服务器上运行在两个不同端口8109和8209的Tomcat上。接下来我们配置了一个类型为lb(也就是负载均衡的意 思)的worker,它的名字是DLOG4J,这是一个逻辑的worker,它用来管理前面配置的两个物理连接s1和s2。最后还配置了一个类型为 status的worker,这是用来监控JK本身的模块。有了这三个worker还不够,我们还需要告诉JK,哪些worker是可用的,所以就有 worker.list = DLOG4J, status 这行配置。

接下来便是URI的映射配置了,我们需要指定哪些链接是由Tomcat处理的,哪些是由Apache直接处理的,看看下面这个文件你就能明白其中配置的意义

/*=DLOG4J
/jkstatus=status

!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J

相信你已经明白了一大半了:所有的请求都由DLOG4J这个worker进行处理,但是有几个例外,/jkstatus请求由status这个 worker处理。另外这个配置中每一行数据前面的感叹号是什么意思呢?感叹号表示接下来的URI不要由JK进行处理,也就是Apache直接处理所有的 图片、css文件、js文件以及静态html文本文件。

通过对workers.properties和uriworkermap.properties的配置,可以有各种各样的组合来满足我们前面提出对一个web网站的要求。您不妨动手试试!

**/


三 http_proxy

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

http_proxy模式是基于HTTP协议的代理,因此它要求Tomcat必须提供HTTP服务,也就是说必须启用Tomcat的HTTP Connector。一个最简单的配置如下

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 !

ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/
</Proxy>

配置比JK简单多了,而且它也可以通过一个页面来监控集群运行的状态,并做一些简单的维护设置。

 

四. 三者比较

相对于JK的连接方式,后两种在配置上是比较简单的,灵活性方面也一点都不逊色。但就稳定性而言就不像JK这样久经考验,毕竟Apache 2.2.3推出的时间并不长,采用这种连接方式的网站还不多,因此,如果是应用于关键的互联网网站,还是建议采用JK的连接方式。


相关网址

Apache http://httpd.apache.org
Tomcat http://tomcat.apache.org
JK文档 http://tomcat.apache.org/connectors-doc/

 

类别:Apache | | 添加到搜藏 | 分享到i贴吧 | 浏览( 1399 ) | 评论  (0)
 
上一篇: firefox     下一篇: 微软产品说明
 
/*<![CDATA[*/ #in_related_doc a { text-decoration:none; } /*]]>*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值