构建tomcat集群,实现前端一台nginx反代,到后端的apache服务器,由apache负责向后端的tomcat服务器进行资源调度,这样的模式比直接用nginx反代到后端主机,tomcat服务器所受到的压力会更小,服务将会更加稳定,这样的模式是经过实践检验出来的。如果nginx直接调度到后端tomcat服务器,则只支持http和https,而不支持ajp,http与https模式的设定,可以让外来客户直接访问tomcat服务器,而不需要经过我们设置好的前端nginx的端口,这样是十分不安全的做法,所以常用的模式都是ajp以及mod_jk,这种模式就可以阻止外来用户直接访问tomcat服务器,安全性就有了一定的保障。
在这里实现三种httpd的代理模式,proxy_http_module,proxy_ajp_module,以及mod_jk。并对后端tomcat主机实现负载均衡,session sticky,session cluster,session server操作。
IP配置:
前端nginx:
eno16777736 192.168.72.3
eno33554976 172.16.25.2
httpd调度器:
eno16777736 172.16.25.1
tomcatA:
eno16777736 172.16.25.101
tomcatB:
eno16777736 172.16.25.102
1.负载均衡+session sticky
①proxy_http_moudle
nginx反代:
只需要设置proxy_pass反代即可;
httpd配置:
在报文首部设置Cookie作为标记,当环境env路由改变后即通过ProxySet stickysession触发,将会话保存
Proxy balancer://tcsrvs则是我们在httpd中设置的反代多台服务器的组,相当于nginx中的upstream,
haproxy中的backend。两台主机的域名需要写入到httpd调度器中的/etc/hosts中,否则无法正常解析域名。
route=tomcatA
route=tomcatB
需要我们在后端tomcat服务器的server.xml中的Engine中指定,如
tomcat服务器配置
安装tomcat服务
在本地光盘中有tomcat的安装包
#yum install -y tomcat tomcat-webapps tomcat-lib tomcat-admin-webapps tomcat-docs-webapps
自定义tomcat应用
如:
#mkdir -pv /testapp2/webapps/ROOT/{WEB-INF,lib,classes}
#vim /testapp2/webapps/ROOT/index.jsp (设置jsp页面进行测试)
修改tomcat主配置文件server.xml让其能够通过指定域名访问到我们设置的应用
访问192.168.72.3
因为进行了session sticky所以一直访问到的都是同一个
当我们将tomcatB的服务down掉后
这样就实现了基于proxy_http_module的http模式
②基于proxy_ajp_module
ajp的配置于http的不同就在于对端口以及协议的不同。
需要修改httpd调度器的配置为:
最好将后端tomcat的关于http的connector注释掉;
并修改Engine中的defaultHost指向我们设置好的域名
访问结果如上。
③基于mod_jk
首先,需要在httpd调度器上编译mod_jk,因为默认是不存在的,从网上镜像站点上下载
tomcat-connectors-VERSION
#yun install -y "Development tools" "Server Platform Develop"
安装编译环境。
#yum install -y httpd-devel
#tar -xf tomcat-connectors-VERSION.tar.gz
#cd tomcat-connectors-VERSION/native
#./configure --with-apxs
#make -j 4 && make install
到此,mod_jk便编译完成,可以通过/usr/lib64/httpd/modules/mod_jk进行查看
编写mod_jk配置文件
在/etc/httpd/conf.d/jk_proxy_tomcat.conf中
LoadModule装载模块
JkWorkersFile用于设置任务配置信息
JkLogFile用于设置日志文件
JkLogLevel用于设置日志等级
JkMount到访问到任何数据,都由tcsrvs这个组进行处理,该组设置在workers.properties任务文件中;
/etc/httpd/conf.d/workers.properties
任务文件当中需要设置组中所有tomcat服务器的信息,如host,type,port,lbfactor权重等,有多少个
tomcat服务器则设置多少组。
worker.tcsrvs.type设置为轮询的方式。
worker.tcsrvs.balance_workers=tomcatA,tomcatB用于设置负载均衡的服务器列表
worker.tcsrvs.sticky_session=0表示不支持会话绑定,注意,该行不能省略,否则虽然不出错,但其默认还是绑定;
若需要会话绑定则需要将0置1即可;
2.负载均衡+session server
对tomcat服务器进行负载均衡操作,使用的是httpd调度器的mod_jk形式,关于前端的nginx与httpd,配置同前面一般无二
在这里就不进行细说了,主要是对后端两台tomcat服务器实现seession server,即将会话全部放在一台服务器上,当tomcat
服务器需要时则从session server中取,这样的话session server必须设置高可用,否则当session server挂掉后,便无法正常
提供服务。
导入session server实现所需要的jar包,下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}
要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。将这些jar包放置在/usr/share/java/tomcat中。
在tomcat主配置文件server.xml中设置Context别名,并在该Host上下文中添加session server配置段
Context上下文设置的访问路径path="/test",其应用保存在/testapp2/webapps中,所以需要我们手动进行配置
#mkdir -pv /testapp2/webapps/{lib,classes,WEB-INF}
#vim index.jsp (创建jsp文件)
将/etc/tomcat/web.xml复制到手动创建应用的WEB-INF中,并添加<distributable/>
memcachedNodes为session server的节点,有几台就设几个节点,failoverNodes则是作为备用节点,当n2节点挂掉后
顶上去的。在这里要说一下,session server是基于memcached实现的,所以必须先安装memcached缓存。
设置jvmRoute,该标签需同前面httpd中的一般无二;
使用8009端口的ajp协议进行访问时,需要将8080端口的Connector上下文注释掉。
到此一台tomcat配置完成,只需要在另一台主机处进行相同的设置即可
访问结果:
访问内容的会话ID以及,创建会话时间都相同。
3.负载均衡+session cluster
session cluster的实现,适用于多个tomcat服务器之间,相互备份对方的session,这样
每台tomccat的服务器中就拥有所有的session,这样,即便一台tomcat或多台tomcat
down掉后,只要有一台服务器正常工作,会话就将继续保持,但如果所有的tomcat服
务器down掉就无法正常利用会话工作。
session cluster实现方式同session server差不多,不同在于对server.xml中的cluster集
群的上下文配置。
如:
需要进行修改的也就是前半段配置,Membership上下文用于设置cluster之间的组播通信地址,端口,
以及持续时间,超时时间等;
Receiver上下文则是用于设置cluster之间互相发送会话数据的IP地址,端口,时间等;需要将IP地址改
为当前服务器中可用的IP地址;
后半段配置无需变动。
将之前的session server相关配置注释掉。
本文转自 wujunqi1996 51CTO博客,原文链接:http://blog.51cto.com/12480612/2055100