Nginx+Tomcat反向代理之负载均衡,redis存放session,keepalived暂未搭建

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+Tomcat反向代理之负载均衡,redis存放session,keepalived暂未搭建相关的知识,希望对你有一定的参考价值。

由于公司特定机器还未申请到位,本人之前对这一块也不是很了解,所以前期需要先探路的原因,直接在阿里云上申请了一台测试机,这里部署的所有服务及操作全部在一台机器上,经过一晚上的时间终于达到了负载均衡后session共享的机制。以下有部分操作未上截图是因为我在写该文章时该服务已经搭建成功,所以中间截图就没来得及截下,望大家谅解!

此处用的远程工具SecureCRT,如需用到rz和sz服务请运行该命令(yum install lrzsz),运行完后在SecureCRT下就可以实现上传下载功能!

sz截图如下:

技术分享

 

1.准备阶段(需要下载的资源)

   jdk-7u80-linux-x64(jdk安装这里不做描述)
   apache-tomcat-7.0.69(免安装版)
   nginx-1.8.1
   redis-3.2.11

2.安装及测试阶段

上传apache-tomcat-7.0.69到linux服务器并复制两份,分别起名为apache-tomcat-7.0.69_1和apache-tomcat-7.0.69_2,然后分别放入需要部署的项目,我这里不做测试demo,直接放工作中实际的项目,项目名改为ROOT放入tomcat webapp目录中,因为有现成的登录功能(为了节约时间,哈哈),别忘了tomcat需要改下端口,我这边给出的端口分别是8081和8082,端口改完后我们先把这两个tomcat服务分别启动,以确保在没有加入nginx之前tomcat可以正常发布项目。

相关截图如下:

技术分享

 

至于项目发布成功的截图由于是公司商业性项目,所以这里就不上截图了。

上传nginx-1.8.1资源,在安装nginx-1.8.1之前,需要先安装几个工具(nginx运行环境需要)

以下安装命令依次执行:yum命令安装gcc,pcre,zlib,openssl,(百度得知:-y代表自动安装)

yum install -y gcc

yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

用该命令解压 tar -zxvf nginx-1.8.0.tar.gz文件,解压后得到nginx-1.8.0文件夹,然后利用cd命令进入该文件夹依次执行以下命令。

依次执行命令:
./configure
make
mkae install

此时nginx安装完毕,安装目录是/usr/local/nginx

技术分享

nginx默认占用80端口

 nginx主要配置看conf/nginx.conf文件,截图如下:

技术分享

技术分享

nginx.conf中加入以下红线区域配置就可以达到反向代理与负载均衡功能:

 技术分享

 其中,sbin目录为nginx执行命令,conf目录下的nginx.conf为默认加载的配置文件

启动nginx:
./sbin/nginx
关闭nginx:
./sbin/nginx -s stop

启动nginx后访问该服务器的项目地址,注意我用的是nginx默认端口80,所以访问就用ip:80端口去访问,分别在不同浏览器下面访问该地址,可以看出它们是来自不同tomcat项目服务,这时恭喜你已经达到了反向代理之负载均衡功能。

以上已经利用tomcat和nginx搭建了负载均衡服务,不过最终在实际项目中,如果当前用户已经登录成功在后台做功能操作,这时由于未知原因导致他正在访问的这个项目下的tomcat突然down机,这个时候虽然nginx会自动切换到正常运行的tomcat下,但由于session的不共享会导致当前用户莫名其妙的退出后台操作界面,这个在实际项目运行过程中是绝对不允许发生的。

解决方案:

1.nginx提供了ip_hash策略,可以保持用户ip进行hash值计算固定分配到某台服务器上,然后只要是该ip则会保持分配到该服务器上,保证用户访问的是同一台服务器,那么session问题就不存在了。这也是解决session共享的一种方式,也称为黏性session。但是假设一台tomcat服务器挂了的话,那么session也会丢失。所以比较好的方案是抽取session。
2.session存在memcache或者redis中,以这种方式来同步session,把session抽取出来,放到内存级数据库里面,解决了session共享问题,同时读取速度也是非常之快。

设计图如下:

技术分享

 

redis解决session共享:

由于gcc编译器我们上面已经安装过,所以在安装redis时可以直接忽略

上传redis-3.2.11安装包至linux /usr/local/redis-src/中,解压进入解压后目录redis-3.2.1,执行make命令进行编译,安装到目录/usr/local/redis

执行:make PREFIX=/usr/local/redis install 安装完成之后将redis配置文件拷贝到安装目录下,redis.conf是redis的配置文件,redis.conf在redis源码目录,port默认6379。

执行拷贝命令:cp /usr/local/redis-src/redis-3.2.1/redis.conf /usr/local/redis/

在redis安装目录启动和关闭redis:

启动:./bin/redis-server ./redis.conf
关闭redis:./bin/redis-cli shutdown

redis启动需注意一点,redis启动分为前端启动和后端启动,控制哪种方式启动是根据nginx.conf下的daemonize值来区分,默认是no,修改为daemonize yes,yes代表是后端启动。

tomcat与redis集成实现session共享还需要三个jar:

技术分享

 

在所有需要共享session的服务器的tomcat中目录下:lib目录中添加以下三个jar包,注意版本最好一致,不然极容易出现错误;

 

conf目录中content.xml中配置redis服务
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />

<Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="${ip}" port="6379" database="0" maxInactiveInterval="60"/>

 

技术分享

到此nginx+tomcat+redis已经全部搭建完毕,这时你就可以启动所有服务来体验下所谓负载均衡的魅力了!

启动顺序以下:

启动redis服务,启动所有tomcat,启动nginx,访问80端口的nginx服务并登录到后台,可以在登录成功后的页面加入一个标示来区分当前是来自于tomcat1还是tomcat2,然后再人为关闭该用户正访问的服务,这时你再刷新页面,该用户还是保留登录状态并切换到另一个服务中。哈哈,这是一个神奇的网站吧!

注意点:

有可能此时访问会报错,redis无法访问,这是由于redis的安全机制,默认只有127.0.0.1才能访问,在redis.conf中可以找到bind 127.0.0.1,你可以将此ip改为访问者ip,如果有多个访问者,也可以把bind 127.0.0.1注释掉,然后在配置文件中找到protected-mode,修改protected-mode yes改为protected-mode no 关闭redis保护模式即可;

本人在搭建的时候一不留神把tomcat下的context.xml配置错了,结果导致一启动nginx,redis就down掉,后来再排查问题的时候看出了这个情况,最终改掉就ok;

keepalived暂时还未搭建,因为目前项目中还不需要对nginx做监测;

keepalived主要是防止nginx服务down机,keepalived可以监测nginx服务是否down机,如果发生down机了可以实时的切换上正常nginx服务,防止系统崩溃;

技术分享

 

原文出自于:http://www.cnblogs.com/mrlinfeng/p/6146866.html

我也是参考该博主博客后自行搭建的,写这篇文章目的有两个:

(1)为了让自己印象更深刻且供大家参考;

(2)公司领导需要我总结后作出技术分享;

哈哈,本人第二次发文,如果有不正确的地方希望大家多多指导! 好了,不说了,回家睡觉了。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于Nginx+Tomcat反向代理之负载均衡,redis存放session,keepalived暂未搭建的主要内容,如果未能解决你的问题,请参考以下文章

Nginx反向代理,负载均衡,redis session共享,keepalived高可用

Nginx+Tomcat反向代理之负载均衡,redis存放session,keepalived暂未搭建

nginx反向代理及tomcat负载均衡

nginx反向代理及tomcat负载均衡

Nginx+Tomcat负载均衡群集+反向代理

nginx+tomcat实现反向代理的负载均衡