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檔案,
加入:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60" />
然後按照方案二的nginx配置,啟動tomcat和nginx
方案二:在代碼中使用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,測試使用者是否登入.