负载均衡Nginx 之 Session 一致性

架构师(JiaGouX)我们都是架构师!
架构未来,你来不来?



HTTPS 请求跳转

如下面的配置:

location /test {   proxy_pass http://www.baidu.com/;}

在访问 URI 为 /test 时会跳转到百度,但此时浏览器中的 URL 也会发生变化。


这是因为:向 http://www.baidu.com/ 发送请求后, Nginx 返回的是一个跳转的响应。


此后, 客户端会重新向 https://www.baidu.com/ 发送请求(此过程不再经历 Nginx)。


所以,最终浏览器发生了跳转, 而非 Nginx 的负载均衡。


问题解决


将配置中的 http 改为 https 即可。



Session 一致性


在使用 Nginx 做反向代理时,如果后端服务器是 Tomcat 等动态服务器,则可能会出现 Session 一致性问题。


即: 无法确保同一个 Session 一定对应同一个 Server;


配置网络

下面使用 Docker 来演示。


配置 IP 地址:



并在 Server1 和 Server2 上启动 Tomcat。


配置 Server

在 Server 端创建 jsp 页面:


Server 1

[root@c5477d71795c ROOT]# pwd/var/lib/tomcat/webapps/ROOT[root@c5477d71795c ROOT]# cat index.jsp from 172.20.1.101<br/>session=<%=session.getId()%>


Server 2

[root@c5477d71795c ROOT]# pwd/var/lib/tomcat/webapps/ROOT[root@c5477d71795c ROOT]# cat index.jsp from 172.20.1.102<br/>session=<%=session.getId()%>

然后访问 http://172.20.1.101:8080/ 和 http://172.20.1.102:8080/。


可分别显示来自哪个 Server 和对应的 SessionId,并且刷新页面时 SessionId 不会变化(即使是使用 Ctrl+F5 刷新)。


配置 Nginx

修改 Nginx 的配置文件, 加入新的 upstream 配置和 server 配置。

upstream tomcat {    server 172.20.1.101:8080;    server 172.20.1.102:8080;}
server { ...... location /cat { proxy_pass http://tomcat/; }}


重启 Nginx:

[root@ce12b3b4ce00 sbin]# ./nginx -s reload

访问 http://172.20.1.10/cat 并刷新,发现 from 172.20.1.10x 一直在变化,并且session=xxx 也变化。


说明:此时 Nginx 的配置无法保证 Session 一致性!


解决方案

在 Tomcat 后面部署 Redis,MemCached 等内存数据库来保存 Session 相关信息。


本例中在 Nginx 服务器上安装 memcached 来解决 Session 一致性问题。


安装 memcached

在 Nginx 容器中使用 yum 安装:

yum install -y memcached


启动 memcached

使用 memcached 命令启动:

memcached -d -m 128m -p 11211 -l 172.20.1.10 -u root -P /tmp/

参数说明:

  • -d: 后台启动

  • -m: 缓存大小

  • -p: 端口

  • -l: IP地址

  • -P: 服务启动后系统进程 ID 存储文件的目录

  • -u: 服务器以哪个用户作为管理用户


修改 Tomcat 配置


在两台 Server 中修改 tomcat 的配置:

[root@3a53f7504511 ROOT]# vi /etc/tomcat/context.xml 
# context标签中加入下面的内容<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.20.1.10:11211" sticky="false" sessionBackupAsync="false" lockingMode="auto" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />


导入 jar 包使用 yum 安装的 Tomcat 可将 jar 包放在 /usr/share/java/tomcat/ 目录下。


需要的 jar 包:



Maven 依赖如下:

<dependency>    <groupId>asm</groupId>    <artifactId>asm</artifactId>    <version>3.2</version></dependency>
<dependency> <groupId>com.couchbase.client</groupId> <artifactId>couchbase-client</artifactId> <version>1.4.11</version></dependency>
<dependency> <groupId>com.googlecode</groupId> <artifactId>kryo</artifactId> <version>1.04</version></dependency>
<dependency> <groupId>de.javakaffee</groupId> <artifactId>kryo-serializers</artifactId> <version>0.11</version></dependency>
<dependency> <groupId>de.javakaffee.msm</groupId> <artifactId>memcached-session-manager</artifactId> <version>1.8.2</version></dependency>
<dependency> <groupId>de.javakaffee.msm</groupId> <artifactId>memcached-session-manager-tc7</artifactId> <version>1.8.2</version></dependency>
<dependency> <groupId>com.googlecode</groupId> <artifactId>minlog</artifactId> <version>1.2</version></dependency>
<dependency> <groupId>de.javakaffee.msm</groupId> <artifactId>msm-kryo-serializer</artifactId> <version>1.8.2</version></dependency>
<dependency> <groupId>com.esotericsoftware</groupId> <artifactId>reflectasm</artifactId> <version>1.01</version></dependency>
<dependency> <groupId>net.spy</groupId> <artifactId>spymemcached</artifactId> <version>2.11.4</version></dependency>

注: 如果依赖和 Tomcat 版本不对应可能会什么也不显示,此时响应码为 500。


验证


上述步骤都正确配置之后, 再次访问 http://172.20.1.10/cat 并刷新会发现 SessionId 不再变化。


如喜欢本文,请点击右上角,把文章分享到朋友圈
如有想了解学习的技术点,请留言给若飞安排分享

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

·END·

相关阅读:

    作者:Jasonkay

    来源:https://jasonkayzk.github.io/2020/04/13/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1Nginx-%E4%B8%80%E4%BA%9B%E5%B8%B8%E8%A7%81%E7%9A%84%E9%97%AE%E9%A2%98/

    版权申明:内容来源网络,仅供学习研究,版权归原创者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

    架构师

    我们都是架构师!



    关注架构师(JiaGouX),添加“星标”

    获取每天技术干货,一起成为牛逼架构师

    技术群请加若飞:1321113940 进架构师群

    投稿、合作、版权等邮箱:admin@137x.com


    相关推荐

  • 家电捡漏:4L透明空气炸锅,到手200出头
  • 俄称将敦促联合国调查“北溪”管道被炸事件;朝鲜进行火箭炮射击训练;拜登体检显示“胜任工作” ,前白宫医生质疑 | 每日大新闻
  • 美国反腐“道德委员会”:只反小腐,不管大贪
  • 拜占庭将军问题和Raft共识算法讲解
  • 中国开源社区健康案例——Apache bRPC社区
  • Bing ChatAI偶发赛博精神病,微软紧急限制其聊天次数
  • 开源方案低成本复现ChatGPT流程,仅需1.6GB显存即可体验
  • 微软 ChatGPT 版必应,疯了...
  • 微信全文搜索耗时降94%?我们用了这种方案
  • 港大禁用 ChatGPT 等 AI 工具,网友:“从万众瞩目到千夫所指?”
  • 一雪被 AlphaGo 狠虐的“前耻”!14:1,这次人类终于赢了围棋 AI
  • 前端框架的未来:useSignal()
  • Python 初版发布 | 历史上的今天
  • 新 Bing 惨遭微软“脑叶切除”,引大量网友不满!
  • 裸辞两年,靠做海外dǒu音副业全款买房:求求你不要再赚死工资了!
  • Google 员工愤然离职,剑指这家搜索巨头已迷失方向!
  • 再见了,华为!活命要紧 ~
  • “雇佣”ChatGPT编码,应如何进行面试?
  • 雷军计划将铁蛋、铁大推向海外;全球首本ChatGPT撰写的图书即将出版;给员工打“低绩效”,Meta新一轮裁员将至 | T资讯
  • Python爬虫神器!