分享

用mod

 muyable 2015-01-08
[img][/img]这类文章在网上太多了,但我看到的都是乱糟糟的,要么没重点,要么只讲配置不讲道理。干脆我自己写一个 

1.概述
这种设计可以称作“反向代理”,即把web server当作app server的代理.
Apache的模块mod_proxy就是为此而生的
Proxy就是我们要配的第一个东西

proxy会导致一个问题。tomcat的host/port与apache的hostp/port肯定有所不同。那在tomcat中的webapp下执行servlet.getServerName()和getServerPort()时,拿到的主机名和端口是什么? 如果不作配置的话,就是tomcat自己的host/port;这显然不是我们想要的。我们要的是用户请求的host/port,即apache的host/port.  我们要配置的第二步就是来解决这个问题。

最后一个问题跟session stickiness相关. 由于我们有两个tomcat,怎么让同一个session下的所有请求都发到同一个tomcat上呢? Apache通过mod_proxy_balancer解决这个问题。这是我们要配的第三个东西。



下面就一个一个来配:

2.配置proxy

#apache的httpd-vhosts.conf
<VirtualHost *:80>
    ...
    #先只配一个tomcat
    ProxyPass /tomcat/ http://tomcat:8080/
    ProxyPassReverse /tomcat/ http://tomcat:8080/
    #上面两句话会把 http://apache/tomcat下的所有请求转发给 http://tomcat:8080
    ...    
</VirtualHost>

3.解决proxy引发的request.getServerName()问题
<!--Tomcat的server.xml-->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               proxyName="apache"
               proxyPort="80"
             
               />
<!--这样一来,拿到的getServerName()和getServerPort()就是用户真正请求的东西-->


4.1 - 把两个tomcat做成一个集群

<VirtualHost *:80>
    ...
    #两个tomcat并作一个集群
    <Proxy balancer://tomcat-cluster>
        BalancerMember http://tomcat:3535
        BalancerMember http://tomcat:3636
    </Proxy>

    #把proxy指向这个集群
    ProxyPass /toomcat/ balancer://tomcat-cluster/
    ProxyPassReverse /tomcat/ balancer://tomcat-cluster/   
    ...
</VirtualHost>

4.2 - 最后处理一下session stickiness问题
这个问题是通过cookie来解决的。系统创建session时会发一个cookie给客户端,cookie中会指明当前应答的tomcat是哪个; 用户提交第二个请求时会回送这个cookie,系统再根据这个cookie的值找到上次应答的tomcat,然后把请求转交给它。(注:不用cookie,在URL后面后跟;jsessionid也可以)

所以这边有两个子问题:
  1.这个cookie叫什么名字?
  2.怎么样区别此tomcat与彼tomcat?


4.2.1 - cookie名

Servlet下cookie的名字一般叫JSESSIONID(也可以叫其它的,虽然不太合规),我们要把这个名字配到Apache中去:

<VirtualHost *:80>
    ...
   
    <Proxy balancer://tomcat-cluster>
        BalancerMember http://tomcat:3535
        BalancerMember http://tomcat:3636
        ProxySet stickysession=JSESSIONID|jsessionid
    </Proxy>
 
    ProxyPass /toomcat/ balancer://tomcat-cluster/
    ProxyPassReverse /tomcat/ balancer://tomcat-cluster/
    ...
</VirtualHost>   

4.2.2 - 区别两个tomcat
这里有个"route"的概念。别管route具体什么意思,总之:两个tomcat各有一个route-id
<!--Tomcat1的server.xml-->
<Engine name="Catalina" defaultHost="localhost"  jvmRoute="route1">
  ...
<!--Tomcat2的server.xml-->
  <Engine name="Catalina" defaultHost="localhost"  jvmRoute="route2">
...

再把这两个route-id注册到apache中

#这是apache配置的最终版本
<VirtualHost *:80>
    ...
   
    <Proxy balancer://tomcat-cluster[>
        BalancerMember http://tomcat:3535 route=route1
        BalancerMember http://tomcat:3636 route=route2
ProxySet stickysession=JSESSIONID|jsessionid
    </Proxy>
 
    ProxyPass /toomcat/ balancer://tomcat-cluster/
    ProxyPassReverse /tomcat/ balancer://tomcat-cluster/
    ...
</VirtualHost>   

最后用户收到的cookie就是这种风格: JSESSIONID=ERFGHJKJHGRTYH4567.route1, JSESSIONID=TGDFTYDJHGRTYH4567.route2


==================================================
大功告成!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多