tomcat集群共享session(nginx+redis)

nginx+tomcat+redis配置session共享和负载均衡

使用nginx作为前端服务器,将需要的session存入到redis中,当tomcat有一台挂了后,session还能从redis中取到。

在这里有两种方案。

方案一:使用tomcat-redis-seesion-manager,将jar包放入tomcat的lib中。


jar下载:

tomcat-redis-session-manage-tomcat7.jar

commons-pool2-2.2.jar

jedis-2.5.2.jar

jar包下载地址:http://download.csdn.net/detail/lh2420124680/9904714

修改tomcat的context.xml文件,

加入:

 
                 host="localhost"  
             port="6379"  
             database="0"  
             maxInactiveInterval="60" />

然后按照方案二的nginx配置,启动tomcat和nginx


方案二:在代码中使用redis来处理逻辑。

1.nginx.conf的配置

tomcat集群共享session(nginx+redis)_第1张图片

在这里取了一个clu作为集群的名字,下面有两个服务器(两个tomcat,修改为不同的端口),这里主要是做负载均衡,nginx会把请求转发到不同的服务器中,减少访问的压力。

其中的location ~ (.*\.(jpg|jpeg|png|ico|gif|css|js|html))配置是因为项目中有post请求静态资源,因为nginx不允许post请求静态资源,所以在这里配置了一下,请求如果是405就转200.

然后在登录的代码中加入redis的存储方法


在这里,我将session数据转成json的string类型,然后escape存入redis,不然redis会把“”号等特殊符号转义,取出来就不是原来的数据了,所以取出来用unescape

下面是escape和unescape的方法

public static String escape(String src) {  
        int i;  
        char j;  
        StringBuffer tmp = new StringBuffer();  
        tmp.ensureCapacity(src.length() * 6);  
        for (i = 0; i < src.length(); i++) {  
            j = src.charAt(i);  
            if (Character.isDigit(j) || Character.isLowerCase(j)  
                    || Character.isUpperCase(j))  
                tmp.append(j);  
            else if (j < 256) {  
                tmp.append("%");  
                if (j < 16)  
                    tmp.append("0");  
                tmp.append(Integer.toString(j, 16));  
            } else {  
                tmp.append("%u");  
                tmp.append(Integer.toString(j, 16));  
            }  
        }  
        return tmp.toString();  
    }  


public static String unescape(String src) {  
      StringBuffer tmp = new StringBuffer();  
      tmp.ensureCapacity(src.length());  
      int lastPos = 0, pos = 0;  
      char ch;  
      while (lastPos < src.length()) {  
          pos = src.indexOf("%", lastPos);  
          if (pos == lastPos) {  
              if (src.charAt(pos + 1) == 'u') {  
                  ch = (char) Integer.parseInt(src  
                          .substring(pos + 2, pos + 6), 16);  
                  tmp.append(ch);  
                  lastPos = pos + 6;  
              } else {  
                  ch = (char) Integer.parseInt(src  
                          .substring(pos + 1, pos + 3), 16);  
                  tmp.append(ch);  
                  lastPos = pos + 3;  
              }  
          } else {  
              if (pos == -1) {  
                  tmp.append(src.substring(lastPos));  
                  lastPos = src.length();  
              } else {  
                  tmp.append(src.substring(lastPos, pos));  
                  lastPos = pos;  
              }  
          }  
      }  
      return tmp.toString();  
  }  

redis取出数据

tomcat集群共享session(nginx+redis)_第2张图片


然后分别启动两个tomcat,登录,然后关闭一台tomcat,测试用户是否登录.

你可能感兴趣的:(tomcat,nginx,session,redis,java,nginx)