REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

一、Nginx

 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,*使用nginx网站用户有:百度、新浪、网易、腾讯等。

  最新版本的nginx版本为1.9.3,我这下载的是window版本的,一般实际场景都是安装在linux系统下的,由于linux系统目前正在摸索中这里就不介绍。官方下载地址:nginx-1.9.3.zip 博客园下载地址:nginx-1.9.3.zip 。下载完成之后解压运行nginx.exe就启动了nginx了,启动后会在进程里面看到nginx。

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

   要实现负载均衡需要修改conf/nginx.conf的配置信息,修改配置信息之后重新启动nginx服务,可以通过nginx -s reload指令实现。这里我们使用 Ants 提供的一个批处理来操作。

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

将nginx.bat文件放到nginx.exe相同文件夹下,直接运行就行了。文章结尾会提供本文用到的所有文件。

 REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

启动Nginx,访问 localcast,如果出现以下页面,则启动成功。

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)



准备2个tomcat,修改server.xml,设置不同的端口号,我是8080和8180。注意也要同步修改其他的端口号

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)


 


修改nginx.conf配置文件

配置集群:
upstream testsite.com{
  server 127.0.0.1:8080 weight=1;
  server 127.0.0.1:8180 weight=2;
    #ip_hash;
}


当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。



配置规则:

location /mysite/ {
          proxy_pass http://testsite.com/;
       proxy_redirect default;
}   



使用服务器组  注意!!!!!   如果 location / { proxy_pass http://testsite.com; }   proxy_pass http://testsite.com 末尾可以不用加 / ,但是 location /other_string/ { proxy_pass http://testsite.com/; }    proxy_pass http://testsite.com 之后一定要加 / 

  需要特别注意的是,在location指令中使用正则表达式后,proxy_pass后面的代理路径不能含有地址链接,也就是不能写成http://192.168.12.130:8080/,或者类似http://192.168.12.130:8080/jsp的形式。在location指令不使用正则表达式时,没有此限制。


重启Nginx,访问http://localhost/mysite/

多次刷新,会分别进入2个tomcat

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 
这就实现了基本的Nginx负载均衡。



接下来搭建redis服务器。

 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  最新版本的redis版本为3.0.3,支持集群功能。我这下载的是window版本的,实际场景都是安装在linux系统下的。下载地址:redis-2.8.19.rar 。更多下载地址: 

    下载完成之后解压运行redis-server.exe就启动了redis了,启动后会在进程里面看到reids。

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

   1.读写分离配置

   redis的读写分离需要修改配置文件,把解压的文件复制了一份。两份文件是一样的,分别命名为MasterRedis-2.8.19(主redis服务),SlaveRedis-2.8.19(从redis服务)。redis默认绑定的是6379端口,

 我们保持主服务配置不变,修改从服务配置。

 REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

  • 修改从服务绑定端口(修改时可以直接搜索port关键字)

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

  • 修改从服务对应的主服务地址(修改时可以直接搜索slaveof关键字)

 REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

  • 配置文件修改完成以后,分别启动主服务和从服务

     从服务启动以后,主服务会发送一条同步的sync命令,同步从服务器的缓存数据。


注意,启动redis可能会出现报错,如下图:
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 需要将最大堆内存maxheap设置小一些、
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 在cmd打开,
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 使用命令
redis-server.exe redis.conf --maxheap 200m



成功启动master和slave后:
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 




其实用redis实现session主要原理就是
将Session数据集中存储,然后不同Web服务器从同样的地方获取Session,如下图:
        REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)


实现redis session需要tomcat-redis-session-manager,从以下网址下载,源码不支持tomcat8,需要修改代码。

下载下来,用到这几个类
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 
在eclipse新建一个java project,复制到项目中,下载需要的jar包。
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

 修改RedisSessionManager.java (tomcat7和tomcat8的实现代码不一样)

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

将项目打成jar包。redis-tomcat8.jar

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 


redis实现session是需要在tomcat端配置,
将 redis-tomcat8.jar,commons-pool2-2.4.3.jar, jedis-2.6.2.jar 放入tomcat的lib文件夹中。
修改tomcat的配置文件context.conf,
  
<!-- 
com.orangefunction.tomcat.redissessions 是自定义maven项目的报名路径,切需要与maven 中 RedisSessionManager的serializationStrategyClass值一致
-->
<!-- redis session 共享配置 -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
    host="127.0.0.1"  
    port="6379"  
    database="0"  
    maxInactiveInterval="60" />

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 
到此处配置已完成。
为了更好的显示session共享的效果,修改第一个tomcat的index.jsp文件:

REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

 第二个tomcat的index.jsp:
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 

注意要将page的session属性改为true,支持session。




重启tomcat。
注意,重启tomcat如果报错:java.lang.NoClassDefFoundError: org/apache/catalina/util/LifecycleSupport
at com.orangefunction.tomcat.redissessions.RedisSessionManager.<init>(RedisSessionManager.java:82)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:117)
at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1190)

请查看环境变量配置的JDK是否是1.8
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 



然后,我们访问http://localhost/mysite/,会有负载均衡的效果。分别显示如下页面:
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

可以发现sessionId是相同的。
 


redis在存session的时候也可以看到主从头部的效果
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)
 






与redis类似,memcached也可以实现redis共享,

memcached-session-manager



最后是所有用到的文件内容:
REDIS+TOMCAT8 实现session共享 ,结合NGINX实现负载均衡(Windows)

nginx_iis文件夹是存放nginx负载均衡配置,里面有2个tomcat和nginx配置
ResidSessionDemo文件夹是存放redis主从
tomcat-redis-session-manager-master貌似是网上下载下来的那个实现redis session共享的项目,打包后为jar包放到tomcat里
tomcat-redis-session-manager这个压缩包是我自己修改了一下的项目,打包后为redis-tomcat8.jar
以及其他需要的jar包

https://download.csdn.net/download/u012560410/10324507