负载均衡 Nginx Session 一致性

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


Server 2


[root@c5477d71795c ROOT]# pwd
/var/lib/tomcat/webapps/ROOT
[root@c5477d71795c ROOT]# cat index.jsp 
from 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标签中加入下面的内容


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


需要的 jar 包:



Maven 依赖如下:



    asm
    asm
    3.2




    com.couchbase.client
    couchbase-client
    1.4.11




    com.googlecode
    kryo
    1.04




    de.javakaffee
    kryo-serializers
    0.11




    de.javakaffee.msm
    memcached-session-manager
    1.8.2




    de.javakaffee.msm
    memcached-session-manager-tc7
    1.8.2




    com.googlecode
    minlog
    1.2




    de.javakaffee.msm
    msm-kryo-serializer
    1.8.2




    com.esotericsoftware
    reflectasm
    1.01




    net.spy
    spymemcached
    2.11.4


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


验证


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



展开阅读全文

页面更新:2024-04-25

标签:可能会   时会   缓存   端口   容器   页面   地址   发现   服务器   用户

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top