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.youkuaiyun.com/detail/lh2420124680/9904714
修改tomcat的context.xml文件,
加入:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60" />
方案二:在代码中使用redis来处理逻辑。
1.nginx.conf的配置
在这里取了一个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,登录,然后关闭一台tomcat,测试用户是否登录.