最近配置一个SSH项目的集群,遇到不少麻烦。网上查找了不少资料但是都不齐全。为了减少新手少走弯路,特此分享出来。老鸟可以略过。。板砖轻拍。
首先说下框架
Spring 2.5+struts 2.2.1+hibernate 3.2 hibernate 的二级缓存实现使用的是Ehcache 1.6.2
阅读此文前,请先确认你的项目相关实体类进行了序列化也就是继承了java.io.Serializable 接口。
详细信息请Google之,不详细解释。
环境 JDK 1.6 , tomcat 5.5.30 ,Apache 2.2.17
其他版本的配置基本相同。不同的地方会指示出来。相关软件的下载安装略过。
一.apache+tomcat负载均衡和集群的配置。
1.修改apache的conf下的httpd.conf 添加如下内容
mod_jk-1.2.31-httpd-2.2.3.so 可以从apache官网下载,请注意对应的apache版本,并放入Apache的modules目录。
日志文件,最好写上,可以快速排错。知道哪里出问题了。
mod_jk的配置文件加载。下面会详细讲解。
上述代码片段均添加到apache中 httpd.conf配置文件中,插入位置,请参照httpd.conf配置本身
2.在conf目录 新建 mod_jk.conf 文件,内容如下
什么样的请求分发给tomcat处理。可以实现动态文件跟静态文件的分离,例如,只是把jsp,跟Action的请求转发给Tomcat处理。
其他js,html,jpg,css等静态文件可以给apache处理。(静态文件需要拷贝至apache的工作目录,或者修改配置文件指向静态文件所在目录)
3.在conf中新建workers.properties文件
这两个tomcat是在本机配置的,所以修改了相应的端口号,如果是在不同机器中配置,则不需修改,详细配置参考
下面的tomcat配置
需要注意的是session粘性的配置。
sticky_session 和sticky_session_force属性
worker.loadbalancer.sticky_session=true
此处指定集群是否需要会话复制,如果设为true,则表明为会话粘性,不进行会话复制,当某用户的请求第一次分发到哪台Tomcat后,后继的请求会一直分发到此Tomcat服务器上处理;如果设为false,则表明需求会话复制。
worker.loadbalancer.sticky_session_force=true
如果上面的sticky_session设为true时,建议此处也设为true,此参数表明如果集群中某台Tomcat服务器在多次请求没有响应后,是否将当前的请求,转发到其它Tomcat服务器上处理;此参数在sticky_session=true时,影响比较大,会导致转发到其它Tomcat服务器上的请求,找不到原来的session,所以如果此时请求中有读取session中某些信息的话,就会导致应用的null异常
3.tomcat的配置
以tomcat5.5为例,6.0及7.0或更高版本配置请参考tomcat文档
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation)
server.xml完整代码,如果是本机运行多个tomcat,请修改相应端口。防止冲突。请参考上面的workers.properties文件修改
关于tomcat,你可以复制多份进行测试,也可以修改server.xml,添加多个实例进行运行,但是为了更直观的查看建议复制多份。
修改tomcat的Context.xml文件 打开全局session复制
<Context distributable="true">