在tomcat+nginx分布式環(huán)境下,如果有一臺服務(wù)器掛掉,那個它上面的session則會消失(session是保存在服務(wù)器上面),那么我們怎么解決這個問題?我們可以把信息保存在cookie中(cookie是保存在客戶端,也就是游覽器),但是,這樣是不安全的,下面我要介紹的是用redis保存session信息,而達(dá)到session共享(我也是剛看別人的博客,搭建出來,有些注意的地方要知道)。
1、需要3個jar包,分別是commons-pool2-2.3.jar,jedis-2.7.2.jar,tomcat-redis-session-manager1.2.jar(這個jar包我是直接下載的,沒去原版的github拉取。),將3個jar包放在每臺服務(wù)器tomcat的lib當(dāng)中。
2、配置tomcat的context.xml文件,將redis鏈接配置(以及使用tomcat-redis-session-manager1.2.jar進(jìn)行session的存儲共享)到當(dāng)中,如下:
<!-- 利用redis 進(jìn)行session 共享 單例模式 只有一臺redis -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="3600"/>
<!-- redis-Sentinel 配置 多例模式 -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
maxInactiveInterval="60"
sentinelMaster="mymaster"
sentinels="127.0.0.1:26379,127.0.0.1:26479" />
我們這里使用單例模式,redis集群,在接下來幾篇會有
注意:一定要反編譯你拿到的tomcat-redis-session-manager1.2.jar包,看看RedisSessionHandlerValve.class、RedisSessionManager.class的路徑(之前直接復(fù)制網(wǎng)上的配置,發(fā)現(xiàn)找不到類,然后反編譯jar包找到對應(yīng)的位置),如果你的redis有密碼,則在manager下面加入
password="????",如果沒有密碼,不要加入這段!。
3、nginx的配置
這個其實不需要的和redis沒關(guān)聯(lián),只是測試的時候,為了看出效果如下:
upstream localhost {
server localhost:8090 weight=1;
server localhost:8080 weight=1;
#ip_hash;
}
注意上面的ip_hash,它的作用是如果用戶在服務(wù)器1進(jìn)行登錄,之后的所有操作都會在服務(wù)器1上進(jìn)行,
如果沒有它,那么,用戶的所有操作都將是交給nginx進(jìn)行分配的,現(xiàn)在我們這里把它注釋掉,測試
的時候登錄之后進(jìn)行操作,各個服務(wù)器將是共享的,可能在1,可能在n,那么session也是共享的,
然后,將其中一臺服務(wù)器停掉,繼續(xù)操作,結(jié)果當(dāng)然是在其他服務(wù)器上執(zhí)行,現(xiàn)在,我們將ip_hash
加上,繼續(xù)之前的操作,從頭再來,結(jié)果。。。。。你懂的。