在《高可用笔记(1)nginx》中已经使用过nginx反向代理tomcat的http服务,本文将介绍如何用nginx+tomcat+redis的组合实现负载均衡。
首先来看负载均衡需要解决的2个问题
- 多个tomcat的部署的web应用怎么实现统一出口?
答:用nginx代理多个tomcat,可以根据实际情况设置不同的权重weight。 - 多个tomcat的session共享问题怎么解决?
答:将session的数据保存到同一个redis数据库中。将会用到tomcat-redis-session-manager插件。
准备测试环境
还是这三台测试主机
- host1 192.168.30.1 (redis/master, nginx, tomcat)
- host2 192.168.30.2 (redis/slave, tomcat)
- host3 192.168.30.3 (redis/slave, tomcat)
安装tomcat
经过前面两个笔记,host1的redis、nginx和tomcat均已安装好,host2和host3的redis也已经安装好。
还需要在host2和host3安装tomcat:
$ yum install tomcat -y
$ systemctl enable tomcat
部署tomcat测试项目
拷贝host1的hellonginx项目到host2和host3的相应目录,稍作修改:
$ scp -r root@192.168.30.1:/var/lib/tomcat/webapps/hellonginx /var/lib/tomcat/webapps/
……
#将index.html的“host1”分别改为“host2”和“host3”
……
$ systemctl start tomcat
nginx代理多个tomcat
修改host1的配置文件/etc/nginx/conf.d/http_proxy.conf:
upstream tomcat_server {
server 192.168.30.1:8080 weight=1; #weight是权重
server 192.168.30.2:8080 weight=1;
server 192.168.30.3:8080 weight=1;
}
server {
listen 80;
server_name localhost;
location /hellonginx{
proxy_pass http://tomcat_server/hellonginx;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
$ nginx -s reload
用浏览器打开http://192.168.30.1/hellonginx
第一次:
第二次:
第三次:
第四次:
......
如果host2宕机了,那么第一次是host1,第二次是host3,第三次又是host1。
显然host1是不能宕机的,整个环境的高可用还必须借助keepalived+vip,后面的笔记会讲到。
tomcat的session共享
redis的高可用在上一个笔记中已经部署好了,在这里也仅仅是保存session的作用,就不在赘述了。
那么如何将tomcat的session保存到redis中呢?
该tomcat-redis-session-manager出场了。
准备几个jar包:
- commons-pool2-2.4.2.jar
- jedis-2.9.0.jar
- tomcat-redis-session-manager-2.0.0.jar
将三个jar包分别放入三台主机的/usr/share/tomcat/lib/目录下
修改三个tomcat的配置文件/etc/tomcat/context.xml
……
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/>
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
maxInactiveInterval="60"
sentinelMaster="mymaster"
sentinels="192.168.30.1:7000,192.168.30.2:7000,192.168.30.3:7000"/>
……
重启三个tomcat,完成!
注意:
这里使用的tomcat-redis-session-manager是v2.0.0,配合的另外两个jar是commons-pool2-2.4.2和jedis-2.9.0的。这个版本支持redis-sentinels配置。
小于v2.0.0版本的tomcat-redis-session-manager需要配合commons-pool-1.x和jedis-2.1.0。并且不支持redis-sentinels,只能配置单个redis的host和ip。
附件是上面三个jar包。