负载均衡 Nginx Session 一致性

点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:jasonkayzk.github.io/2020/04/13

/负载均衡Nginx-一些常见的问题/

2b5e7b53d3ed0349e2257be089849969.jpeg


HTTPS 请求跳转

如下面的配置:

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

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

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

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

问题解决

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

Session 一致性

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

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

配置网络

下面使用 Docker 来演示。

配置 IP 地址:

1c8849308966cce34a169db922faf814.png
图片

并在 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 


> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://github.com/YunaiV/yudao-cloud>
> * 视频教程:<https://doc.iocoder.cn/video/>

# 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 包:

e06d09414591152f62392e77050b251c.png
图片

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 不再变化。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

e7216bc4b0ae7c7461aa507154ba6577.png

已在知识星球更新源码解析如下:

d2598615571c2b6027627b4ffa8b4463.jpeg

cfea61c86652cfe1a97f42fc1c30dc43.jpeg

5c71c356e97686b4447d987e19018f24.jpeg

2f9af056e0c25f5f7b6a556ef8f023fc.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值