社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

负载均衡Nginx 之 Session 一致性

架构师 • 2 年前 • 717 次点击  
架构师(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
session=


Server 2

[root@c5477d71795c ROOT]# pwd/var/lib/tomcat/webapps/ROOT[root@c5477d71795c ROOT]# cat index.jsp from 172.20.1.102
session=

然后访问 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标签中加入下面的内容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>asmgroupId>    <artifactId>asmartifactId>    <version>3.2version>dependency>
<dependency> <groupId>com.couchbase.clientgroupId> <artifactId>couchbase-clientartifactId> <version>1.4.11version>dependency>
<dependency> <groupId>com.googlecodegroupId> <artifactId>kryo artifactId> <version>1.04version>dependency>
<dependency> <groupId>de.javakaffeegroupId> <artifactId>kryo-serializersartifactId> <version>0.11version>dependency>
<dependency> <groupId>de.javakaffee.msmgroupId> <artifactId>memcached-session-managerartifactId> <version>1.8.2version>dependency>
<dependency> <groupId>de.javakaffee.msmgroupId> <artifactId>memcached-session-manager-tc7artifactId> <version>1.8.2version>dependency>
<dependency> <groupId>com.googlecodegroupId> <artifactId>minlogartifactId> <version>1.2version>dependency>
<dependency> <groupId>de.javakaffee.msmgroupId> <artifactId>msm-kryo-serializerartifactId> <version>1.8.2version>dependency>
<dependency> <groupId>com.esotericsoftwaregroupId> <artifactId>reflectasmartifactId> <version>1.01version>dependency>
<dependency> <groupId>net.spygroupId> <artifactId>spymemcachedartifactId> <version>2.11.4version>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


    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/152312
     
    717 次点击