apache tomcat 连接/apache tomcat 整合

apache 与 tomcat 服务器的三种连接配置方式

https://github.com/jongsuny/httpd-conf-sample
本文介绍中的所有配置都上传到github里,可以clone一下查看。
首先,apache和tomcat都是实现了http协议,两者都可以单独作为一个http的服务器,那么为什么需要apache和tomcat需要整合呢?
原因如下:
apache特性:特性:简单、速度快、性能稳定、可配置(代理)
tomcat特性:servlet容器
  1. apache在静态资源服务上比tomcat性能要好一些,这可能是源于java在IO方面的欠缺,不过个人认为随着jdk的发展,这个差距在减少。
  2. 并发连接时apache能保持较高的性能,tomcat则并发500以上,RT会开始飙升,只做参考。
  3. 简单快速的逻辑上由apache module来快速处理,如GEOIP,cache module,rewrite等。
  4. 在动态资源的处理上,虽然apache也可以通过cgi提供动态内容,但是开发成本比较高,所以cgi都是在高性能的处理上使用,如图片缩略图。
  5. tomcat作为web容器,更容易提供动态内容
Apache+tomcat之后,由apache来处理静态内容,tomcat来处理动态内容,两者发挥所长。
apache整合tomcat一般有如下图三种
 92JRF6UPHCR0H2L4$_XTYGN
1.mod_jk
mod_jk是通过ajp协议根后端的tomcat通信,tomcat的默认端口是8009。app协议很成熟,最新版本是1.2.41.
AJP是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过TCP连接 和SERVLET容器 连接。为了减少进程生成socket的花费,WEB服务器和SERVLET容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会再分配。换句话说,在连接上,请求不是多元的。这个使连接两端的编码变得容易,虽然这导致在一时刻会有很多连接。
更详细的介绍请看:
配置比较简单:
  1. 在httpd.conf里load mod_jk,添加jk相关配置
  2. LoadModule jk_module modules/mod_jk.so
    
    <IfModule mod_jk.c>
     JkMount /jkstatus jkstatus
     JkMountCopy All
     <Location /jkstatus>
      JkMount jkstatus
      Require all denied
      Require ip 127.0.0.1 10.0.0.0/8 192.168.0.0/16 ::1
     </Location>
     JkMount /docs/* tomcat
     JkWorkersFile "conf/tomcat/workers.properties"
     JkLogFile "| /Users/jongsuny/apps/apache/bin/rotatelogs -l logs/mod_jk.log.%y%m%d 86400 "
     JkLogLevel error
     JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
     JkShmFile  "logs/mod_jk.shm"
     #JkRequestLogFormat     "%w %V %T"
    </IfModule>
  3. 配置workers.properties
  4. worker.list=tomcat,jkstatus,router
    worker.jkstatus.type=status
    worker.tomcat.port=8009
    worker.tomcat.host=localhost
    worker.tomcat.type=ajp13
  5. 如果有必要,配置uriworkermap.properties
这部分这里省略。
2. 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 来做负载均衡,再看看下面这个配置
LoadModule remoteip_module modules/mod_remoteip.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
<IfModule proxy_module>
 ProxyRequests Off
 ProxyPass /manager/ balancer://manager/
 ProxyPassReverse /manager/ balancer://manager
 <Proxy balancer://manager/>
  BalancerMember http://localhost:8080/manager
  BalancerMember http://localhost:8080/manager
 </Proxy>
</IfModule>
3.ajp proxy

ajp_proxy 连接方式其实跟 http_proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。上面例子的配置可以改为:

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember ajp://server1:8080/
BalancerMember ajp://server2:8080/
BalancerMember ajp://server3:8080/

</Proxy>
2.4 的最终配置如下

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_express_module modules/mod_proxy_express.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass /examples/ balancer://example/
&lt;Proxy balancer://example/&gt;
 BalancerMember ajp://localhost:8009/examples/
 BalancerMember ajp://localhost:8009/examples/
&lt;/Proxy&gt;
https://github.com/jongsuny/httpd-conf-sample
本文介绍中的所有配置都上传到github里,可以clone一下查看。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>