<返回更多

负载均衡 Nginx Session 一致性

2023-01-29  网易号  蒲公英互联
加入收藏

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.jspfrom 172.20.1.101
session=<%=session.getId()%>

Server 2

[root@c5477d71795c ROOT]# pwd/var/lib/tomcat/webapps/ROOT[root@c5477d71795c ROOT]# cat index.jspfrom 172.20.1.102
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/

参数说明:

 

 

修改 Tomcat 配置

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

[root@3a53f7504511 ROOT]# vi /etc/tomcat/context.xml# context标签中加入下面的内容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 依赖如下:

asmasm3.2com.couchbase.clientcouchbase-client1.4.11com.googlecodekryo1.04de.javakaffeekryo-serializers0.11de.javakaffee.msmmemcached-session-manager1.8.2de.javakaffee.msmmemcached-session-manager-tc71.8.2com.googlecodeminlog1.2de.javakaffee.msmmsm-kryo-serializer1.8.2com.esotericsoftwarereflectasm1.0.NET.spyspymemcached2.11.4

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

验证

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

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>