首页 > IT基础架构 > 网络安全 > Apache连接多台tomcat,通过JK2
本文只涉及到Apache如何配置连接到多台tomcat,同时将用户的session绑定到最初访问的tomcat上去。不讨论Apache、tomcat的安装,其他配置,以及tomcat的cluster等等。
[@more@]Apache连接多台tomcat,通过JK2
本文只涉及到Apache如何配置连接到多台tomcat,同时将用户的session绑定到最初访问的tomcat上去。不讨论Apache、tomcat的安装,其他配置,以及tomcat的cluster等等。
目录
连接绑定同一个tomcat – 如何使用stickySession
Apache
Tomcat
Connector采用JK2
操作系统: 在windowsxp 和 Linux上都试过
Apache和tomcat连接,配置文件为:workers2.properties。如果通过mod_jk, 配置文件为workers.properties,这个网上资料太多了,这里不讨论 (怎么编译、安装动态连接库自己查资料,tomcat.apache.org上面写的非常详细,照着做就可以了)
配置文件workers2.properties: --- 具体的配置文件参数什么意思,上tomcat.apache.org上去查,我也不是很清楚,现在够用即可.
|
[shm] file=${serverRoot}/logs/shm.file size=1048576 [channel.socket:172.18.3.39:8009] info=Ajp13 forwarding over socket keepalive=1 port=8009 host=172.18.3.39 #配置了一个worker [ajp13:172.18.3.39:8009] channel=channel.socket:172.18.3.39:8009 [uri:/*.jsp] Worker=ajp13:172.18.3.39:8009 |
Apache连接tomcat通过worker方式进行连接,如果要连接多台tomcat,只需要配置多个worker就可以了。
配置文件:workers2.properties
|
[shm] file=${serverRoot}/logs/shm.file size=1048576 # 一个worker [channel.socket:172.18.3.39:8009] info=Ajp13 forwarding over socket keepalive=1 port=8009 host=172.18.3.39 [ajp13:172.18.3.39:8009] channel=channel.socket:172.18.3.39:8009 #另一个worker [channel.socket:172.18.3.30:8009] info=Ajp13 forwarding over socket keepalive=1 port=8009 host=172.18.3.30 [ajp13:172.18.3.30:8009] channel=channel.socket:172.18.3.30:8009 配置好worker后,下面有多种方式将2个worker应用到系统中 方式1: 采用worker list的方式 [uri:/*.jsp] Worker.list=ajp13:172.18.3.39:8009, ajp13:172.18.3.30:8009 方式2:采用lb的方式 [lb:balanced] worker=ajp13:172.18.3.30:8009 worker=ajp13:172.18.3.39:8009 stickySession=1 [uri:/*.jsp] group=balanced |
通过上述2种方式,都可以将Apache连接到多台tomcat上。但是发现问题,应用是需要登陆的,通过上述的配置方式,发现每点击一次页面,apache会连接到不同的tomcat,这样造成了刚才的登陆实效。
意思就是用户刚上来,访问的是哪个tomcat,以后他访问的请求都往这个tomcat上发,直到用户关闭了浏览器。
就是这个问题搞到凌晨3点半!上午到公司来又弄了半天。
查jk2的文档,说是设置lb的参数stickySession=1,这样apache会根据sessionid,将用户的请求发送到原来使用的那台tomcat上去的,又说了这个参数值缺省就是1。那么这个参数根本不需要进行配置的,但是现在发现每请求一次,apache都切换一次tomcat。
这个问题只能到网上去查,找了老半天,发现问这个问题的人还真的不少。问得人多没有人回答。耐着性子一个个点下去看。发现在有一篇文档中提到修改tomcat的配置,
|
|
在tomcat的配置文件server.xml中,将jvmRoute参数设置成和tomcatid一样,再联系一下看其他的关于Apache处理worker的做法,突然醒悟到应该和worker的id有关系。在配置worker的地方将这2个参数加进去: tomcatid, route
|
[channel.socket:172.18.3.39:8009] info=Ajp13 forwarding over socket debug=0 keepalive=1 port=8009 host=172.18.3.39 tomcatid=tomcat39 route=tomcat39 注: l 此处的tomcatid, route 的值必须和 jvmRoute的值设置成一样 ---- 文档上这么写的,没有调试过写成不一样情况如何 l 连接配置成lb方式 |
然后再tomcat的配置文件server.xml中做上述修改:
|
|
另一worker、tomcat做同样处理,发现问题解决了,用户最初连接到哪个tomcat,以后的使用也就一直使用到这个tomcat,而且增加了tomcatid后,发现用户的sessionid也发生了变化: 原来的sessionid只是一串数字,但是增加了tomcatid后,发现tomcatid增加到sessionid后面去了:
|
6906B |
而没有设置tomcatid的时候,sessionid就是前面一串字。从这里看出来,apache就是判断这串内容转发到不同的tomcat上去的。
将stickySession设置成0,发现Apache发送过来的Session每次分配一个,看来stickySession设置成功了(文档上根本没有提到stickySession和 tomcatid、route相关)
Apache缺省的时候,对于新用户采用round-rabin方式进行分配tomcat,Apache自己带有检测tomcat好坏的功能,如果一台tomcat关闭后,Apache会自动将后面所有的连接都转向到其他的tomcat上去。这时如果已经配置好的tomcat开起来后,Apache会不会自动监测到? Tomcat的文档上说能够做到的,在lb中配置一下recovery就可以了(前一天已经仔细的看过了tomcat的文档,写的太简单了,就是这样也看到2,3点钟)。
文档上说,recovery的缺省设置的时间是60second,在调试期间,将这个设置时间调的短一些,设置成10秒。
前台访问页面,通过log判断使用的是tomcat39,将正在使用的tomcat39关闭。再访问页面,发现自动切换到另一个tomcat上去了—tomcat30,不断地访问,请求会绑定这个tomcat。
将关闭的tomcat39重新开起来,用户访问的还是tomcat30,不会切换到tomcat39上去。将tomcat30关闭,访问又切换到tomcat39上来了,这个证明Apache已经判断到tomcat39恢复正常了。
|
[shm] file=${serverRoot}/logs/shm.file size=1048576 # worker 39 [channel.socket:172.18.3.39:8009] info=Ajp13 forwarding over socket debug=0 keepalive=1 port=8009 host=172.18.3.39 tomcatid=tomcat39 route=tomcat39 [ajp13:172.18.3.39:8009] channel=channel.socket:172.18.3.39:8009 # worker 30 [channel.socket:172.18.3.30:8009] info=Ajp13 forwarding over socket debug=0 keepalive=1 port=8009 host=172.18.3.30 tomcatid=tomcat30 route=tomcat30 [ajp13:172.18.3.30:8009] channel=channel.socket:172.18.3.30:8009 # load balance [lb:balanced] worker=ajp13:172.18.3.30:8009 worker=ajp13:172.18.3.39:8009 stickySession=1 recovery=10 [uri:/*.jsp] group=balanced |
|
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23500957/viewspace-1307920/ ,如需转载,请注明出处,否则将追究法律责任。