nginx集群tomcat,session共享问题
簡介
上一篇中,nginx實(shí)現(xiàn)了tomcat集群,但是其實(shí)集群還有很多問題,比如session共享問題。簡單來說就是通過負(fù)載均衡之后,用戶第一次請求的tomcat和第二次請求的tomcat基本不是同一個,但是你在第一次請求放在session中的值只有一個tomcat才,第二個請求的那個tomcat里面是沒有的。這樣就出現(xiàn)了用戶不停登入的情況。。。
方法一:復(fù)制session信息
原理:講道理,這個方法比較蠢,就是有幾個tomcat,就復(fù)制幾個session,只要有一個tomcat中的session發(fā)生變化,其他tomcat中的session跟著復(fù)制變化,保證所有用戶的session在所有的tomcat中都存在而且相同。這樣一來無論用戶的請求被分配到哪個tomcat都是無所謂的,因?yàn)樗械膖omcat中都有他們存放的session。
打個比方:如果tomcat相當(dāng)于飯店,會話相當(dāng)于筷子的話,如果每次吃飯都要用自己的筷子,那是不是要把每個飯店都放一雙自己的筷子。這就是這個方法的原理。
實(shí)現(xiàn):
1、修改sever.xml文件:將Cluster的注釋去掉?
?
2、打開自己項(xiàng)目的web.xml(不是tomcat/conf/web.xml),增加distributable。?
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,沒有什么花里胡哨的操作。如果集群的tomcat不多,而且用戶沒有那么多的時候可以選擇這種方式。
缺點(diǎn):只要Session數(shù)據(jù)有變化,就需要將數(shù)據(jù)同步到所有其他機(jī)器上,機(jī)器越多,同步帶來的網(wǎng)絡(luò)帶寬開銷就越大;當(dāng)用戶很多時,每臺機(jī)器用于保存Session數(shù)據(jù)的內(nèi)容占用會很嚴(yán)重。
方法二:ip綁定
原理:說白了就是上篇中說到的負(fù)載均衡算法的ip綁定,就是你第一次訪問哪個tomcat,之后所有的請求都會被分配到那個tomcat上。
打個比方:如果tomcat相當(dāng)于飯店,會話相當(dāng)于筷子的話,要保證每次吃飯都用自己的筷子的話,我就把筷子存在某一家飯店,并且每次都去這家店吃飯。
優(yōu)點(diǎn):實(shí)現(xiàn)也比較簡單,需要修改一下nginx的配置文件即可。。。
缺點(diǎn):
1、一大堆人連同一個網(wǎng)訪問的時候,就沒有負(fù)載均衡這一說了,這一大堆的ip都是一樣,都去訪問同一個tomcat。
2、如果這個人訪問的tomcat突然掛了,那nginx的故障轉(zhuǎn)移機(jī)制將會分發(fā)給另一個tomcat服務(wù)器,這樣一來所有請求這個tomcat的所有用戶就又需要重新登入了。
3、如果這個人用著用著突然在用的網(wǎng)絡(luò)不穩(wěn)定,然后這個人換了另一個網(wǎng),這樣ip一換,這個人又要重新登入了。
方法三:tomcat-redis-session-manager
版本: apache-tomcat-8.0.32、nginx-1.13.12、redis_3.2.1
github地址: https://github.com/mzd123/session_manager 讀者可以直接下載體驗(yàn)一下。
實(shí)現(xiàn):
1、下載:https://github.com/ran-jit/tomcat-cluster-redis-session-manager/wiki
2、解壓之后。將jar包放入tomcat的lib中(注意是tomcat/lib中,不是我們自己項(xiàng)目的lib)?
3、配置解壓之后的redis-data-cache.properties(根據(jù)你的redis配置吧)。配置完將這個文件放入tomcat/conf文件夾中。?
4、配置tomcat/cong/context.xml,增加如下兩行。?
5、注意:因?yàn)閠omcat-redis-session-manager這個版本的不同,classname會隨著變化,2.0.4的版本是叫這兩個。其實(shí)可以打開你下載的tomcat-cluster-redis-session-manager.jar看看他到底叫什么(不少小伙伴,本人第一次搞也是,網(wǎng)上代碼一抄,發(fā)現(xiàn)tomcat啟動就報(bào)類找不到。。。你classname都填錯了,當(dāng)然找不到了,能找到就奇怪了。。。)?
測試:
1、nginx配置:
? ? ? upstream mzd{
? ? ? ?server 127.0.0.1:8091;
? ? ? ?server 127.0.0.1:8090;
? ? }
? ? server {
? ? ? ? listen ? ? ? 80;
? ? ? ? server_name ?www.tuesdayma.com;
? ? ? ? location / {
? ? ? ? ? ? proxy_pass http://mzd;
? ? ? ? ? ? proxy_connect_timeout 3s;
? ? ? ? ? ? proxy_read_timeout 5s;
? ? ? ? ? ? proxy_send_timeout 3s;
? ? ? ? ? ? index ?index.html index.htm;
? ? ? ? }
? ? ? ? error_page ? 500 502 503 504 ?/50x.html;
? ? ? ? location = /50x.html {
? ? ? ? ? ? root ? html;
? ? ? ? }
? ? }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2、準(zhǔn)備兩個tomcat,一個端口為8090,一個為8091
3、tomcat中jsp代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> ?
<%@ page language="java" import="java.text.SimpleDateFormat"%>
<% ?
? request.getSession().setAttribute("mzd","123");
? SimpleDateFormat simpleDateFormat=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
? String date=simpleDateFormat.format(new Date());
%> ?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ?
<html> ?
? <head> ??
? ? <title>tomcat1</title> ?
? </head> ?
? <body> ?
? ? ? ? SessionID:<%=session.getId()%> ?
? ? ? ? <BR> ?
? ? ? ? 當(dāng)前時間為:<%=date%> ?
? ? ? ? <BR> ?
? ? ? ? SessionPort:<%=request.getServerPort()%> ?
? ? ? ? <BR> ?
? ? ? ? mzd的值為:<%=session.getAttribute("mzd")%> ?
? ? ? ?<BR> ?
? ? ? ? <% ?
? ? ? ? out.println("這是tomcat1"); ?
? ? ? ? %>?
? </body> ?
</html>
來源:https://blog.csdn.net/tuesdayma/article/details/81387862
總結(jié)
以上是生活随笔為你收集整理的nginx集群tomcat,session共享问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx反向代理,负载均衡,redis
- 下一篇: 使用 monitor 命令查看 redi