nginx实现session共享

article/2025/9/17 9:38:34

在nginx实现了负载均衡之后,用户第一次请求的tomcat和第二次请求的tomcat基本不是同一个,但是你在第一次请求放在session中的值只有一个tomcat1才有,第二个请求的那个tomcat2里面是没有的。这样就出现了用户不停登入的情况。为了解决这个session共享的问题,于是我们提出了以下几个方案:

文章目录

  • nginx实现session共享
    • ip_hash(ip绑定)
      • 步骤实现
        • 大致描述
        • 优缺点
    • tomcat集群实现session的共享
      • 步骤实现
        • 创建一个web项目
        • 复制一份tomcat到文件夹中
        • 导出war包
        • 修改server.xml
        • 修改端口及工作路径
        • 启动tomcat
        • 修改nginx配置文件
        • 测试是否成功
        • 关闭nginx
        • 优缺点
    • redis实现session的共享

nginx实现session共享

ip_hash(ip绑定)

原理:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

步骤实现

大致描述

直接在配置文件里面添加ip_hash 则可以实现ip绑定,ip绑定 和什么浏览器没有关系,是和本机电脑ip有关系,A B 两个客户端,如果 nginx配置ip绑定以后 A 客户端如果请求的 是8080 服务器,则以后来自客户端的A 的请求都将交给8080服务器处理,如果是IP 绑定,在高并发的情况下,也没有什么作用,但是 ip绑定可以实现 会话共享

upstream backserver {
ip_hash;server 192.168.0.14:88;server 192.168.0.15:80;
}

优缺点

优点:实现也比较简单,需要修改一下nginx的配置文件即可
缺点

  • 一大堆人连同一个网访问的时候,就没有负载均衡这一说了,这一大堆的ip都是一样,都去访问同一个tomcat。
  • 如果这个人访问的tomcat突然挂了,那nginx的故障转移机制将会分发给另一个tomcat服务器,这样一来所有请求这个tomcat的所有用户就又需要重新登入了。
  • 如果这个人用着用着突然在用的网络不稳定,然后这个人换了另一个网,这样ip一换,这个人又要重新登入了。
    小结:这样的解决方案能简单的实现,但是不能满足商业需求。

tomcat集群实现session的共享

原理:这个方法原理比较简单,就是有几个tomcat,就复制了几个session,比如一个tomcat的session发生了改变,其余tomcat的session也会复制发生改变,保证了用户的session在所有的tomcat中都是相同的。

步骤实现

创建一个web项目

在起始页index.jsp中写入以下代码(便于之后观察)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%>  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  <head>  <base href="<%=basePath%>">  <title>My JSP 'index.jsp' starting page</title>  <meta http-equiv="pragma" content="no-cache">  <meta http-equiv="cache-control" content="no-cache">  <meta http-equiv="expires" content="0">      <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  <meta http-equiv="description" content="This is my page">  <!-- <link rel="stylesheet" type="text/css" href="styles.css"> -->  </head>  <body>  SessionID:<%=session.getId()%>  <BR>  SessionIP:<%=request.getServerName()%>  <BR>  SessionPort:<%=request.getServerPort()%>  <%  out.println("This is Tomcat Server 111");  %>  </body>  
</html>  

记得修改一下输出语句,进行不同tomcat的区分
写入之后,在web.xml中添加一个<distributable/>节点,放在display下面
在这里插入图片描述

复制一份tomcat到文件夹中

(文件夹用于储存tomcat)
在这里插入图片描述
两个tomcat内容都是一样的,只不过文件夹命名不一样

导出war包

放到tomcat的的webapps中

导出两次,第二次的时候,把输出语句换成2222,以便于观察,把第二次导出的war包放入到tomcat2中,第一次的就是放在tomcat1中。
在这里插入图片描述

修改server.xml

打开tomcat的conf文件夹,对server.xml文件修改
找到<Engine name="Catalina" defaultHost="localhost">这一条语句,在此语句后输入:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="8">  <Manager className="org.apache.catalina.ha.session.DeltaManager"  expireSessionsOnShutdown="false"  notifyListenersOnReplication="true"/>  <Channel className="org.apache.catalina.tribes.group.GroupChannel">  <Membership className="org.apache.catalina.tribes.membership.McastService"  address="228.0.0.4"  port="45564"  frequency="500"  dropTime="3000"/>  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  address="auto"  port="4000"  autoBind="100"  selectorTimeout="5000"  maxThreads="6"/>  <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  </Sender>  <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  </Channel>  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  filter=""/>  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  tempDir="/tmp/war-temp/"  deployDir="/tmp/war-deploy/"  watchDir="/tmp/war-listen/"  watchEnabled="false"/>  <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  </Cluster>

修改端口及工作路径

修改端口
打开tomcat的conf文件夹,对server.xml文件修改,修改成不一样的即可,我为了简便,修改为如下:

tomcat1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
tomcat2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改工作路径
打开tomcat的bin文件夹,对startup.bat文件修改
@echo off前面加上:

set TLTLE="tomcat002"
set CATALINA_BASE="D:\tomcat_cluster\tomcat002"
set CATALINA_HOME="D:\tomcat_cluster\tomcat002"

记得两个tomcat都要修改

启动tomcat

两个都要启动(忽略乱码问题)
在这里插入图片描述

修改nginx配置文件

修改conf路径下的nginx.conf文件
在这里插入图片描述

  • 第一个参数为为自己的tomcat地址
  • weight:权重
  • fail_timeout:失败时间
  • max_fails:失败次数

fail_timeout与max_fails可以理解为,在fail_timeout的时间内,失败max_fails次,那就把请求分配给其他服务器

测试是否成功

在浏览器输入自己的url以及端口测试
在这里插入图片描述
测试成功:是两个不同的tomcat,但是是一样的session,session共享成功

关闭nginx

在这里插入图片描述
再次进入已经显示进不去了,证明nginx关闭了
在这里插入图片描述

优缺点

优点:实现简单,没有什么花里胡哨的操作。如果集群中的tomcat的个数不多,而且用户没有那么多的时候可以选择这种方式。
缺点:只要Session数据有变化,就需要将数据同步到所有其他机器上,机器越多,同步带来的网络带宽开销就越大;当用户很多时,每台机器用于保存Session数据的内容占用会很严重。


redis实现session的共享

暂未学习,学习之后再加入。


http://chatgpt.dhexx.cn/article/Z399VvyE.shtml

相关文章

tomcat配置session共享

tomcat官网 打开 tomcat 官网&#xff1a; http://tomcat.apache.org/ &#xff0c; 找到需要配置的tomcat版本的文档&#xff0c;这里以 tomcat7 为例&#xff0c; 找到对应的 Clustering 配置&#xff08;因为配置session共享&#xff0c;就是配置集群&#xff09;&#xff…

Nginx——Session共享

文章目录 其他文章1、Session共享1.1、session 一致性解决方案1.1.1、session 复制1.1.2、共享 session 1.2、安装memcached1.2.1、 node2 和 node3 上安装 jdk 和 tomcat1.2.2、nginx1 上安装 memcached 其他文章 Nginx——安装Nginx1.6.1 Nginx——工作模型 Nginx——配置文…

Springboot整合springsession实现session共享

Springboot整合springsession实现session共享 简介 session我们之前有介绍过&#xff08;可见springboot整合springsecurity&#xff09;&#xff0c;简单来说就是将用户信息或者数据存储在服务器上&#xff0c;通常用于验证用户身份或者避免通过获取相关信息。 但是&#x…

集群产生的session共享问题

前言&#xff1a; 为了解决集群产生的session共享问题&#xff0c;我们首先需要知道以下三个概念&#xff1a; cookiesessionnginx ​ 下面将逐个分析。 Cookie 1.Cookie是什么 ​cookie的中文翻译是曲奇&#xff0c;小甜饼的意思。cookie其实就是一些数据信息&#xff0c…

Websocket Session 共享解决

Websocket Session 共享解决&#xff08;方案一&#xff09; 既然Websocket Session 不能直接序列化然后存储&#xff0c;而且如果用户请求的时候&#xff0c;开始与集群中的A 节点创建链接&#xff0c;就算把这个 Session 拿到B 节点去再给用户Push 消息&#xff0c;应该也…

使用redis实现session共享

继上一遍文章&#xff0c;使用nginx实现负载均衡以后&#xff0c;新的问题又产生了&#xff0c;当使用负载均衡以后&#xff0c;我们如何实现session共享&#xff0c;因为session是保存在服务端的&#xff0c;对于单体应用来说这不是问题&#xff0c;因为只有一个服务器&#x…

Session共享问题-session原理

问题1&#xff1a;微服务情况下。域名不同。session不共享 问题2&#xff1a;分布式系统下。同一个域名下&#xff0c;多个服务。session会出现不同步问题&#xff08;例如第一次访问的是A服务&#xff0c;保存了。第二次访问了B,查询到的还是没信息&#xff09; 解决&#xf…

Springboot:Session共享

1、概述 传统单机web应用中&#xff0c;一般使用tomcat/jetty等web容器时&#xff0c;用户的session都是由容器管理。浏览器使用cookie中记录sessionId&#xff0c;容器根据sessionId判断用户是否存在会话session。这里的限制是&#xff0c;session存储在web容器中&#xff0c…

Java -- SpringSession实现session共享

在集群系统中&#xff0c;经常需要将 Session 进行共享。不然会出问题&#xff1a;用户在系统A上登陆以后&#xff0c;假如后续的一些操作被负载均衡到系统B上面&#xff0c;系统B发现本机上没有这个用户的 Session &#xff0c;会强制让用户重新登陆。 如在同域名&#xff0c…

shiro分布式session共享

当我们开发的程序需要跑在多个tomcat容器或者多台机器上时&#xff0c;shiro的默认session存储就不能满足我们的需求了&#xff0c;其中shiro默认的session是存储在运行jvm内存中的&#xff0c;使用的AbstractSessionDAO抽象类的一个子类MemorySessionDAO&#xff0c;当我们需要…

tomcat+redis实现session共享

注意&#xff1a;在实际应用中&#xff0c;发现该方案会不定期导致Tomcat假死&#xff08;怀疑Redis连接未释放&#xff09;&#xff0c;慎用。 服务器192.168.14.132和192.168.14.133&#xff0c; 均已经安装tomcat&#xff0c;tomcat安装过程不再赘述。 采用192.168.14.132…

Session共享问题

Session共享及Session保持或者叫做Session⼀致性 1、Session问题原因分析 出现这个问题的原因&#xff0c;从根本上来说是因为Http协议是无状态的协议。客户端和服务端在某次会话中产生的数据不会被保留下来&#xff0c;所以第⼆次请求服务端无法认识到你曾经来过&#xff0c;…

session共享(redis实现)

引言 大厂很多项目都是部署到多台服务器上&#xff0c;这些服务器在各个地区都存在&#xff0c;当我们访问服务时虽然执行的是同一个服务&#xff0c;但是可能是不同服务器运行的&#xff1b; 在我学习项目时遇到这样一个登录情景&#xff0c;假设有如下三台服务器&#xff0…

如何实现session共享的几种解决方案?

先了解一下为什么会出现这种session共享的解决方案&#xff1f; 随着互联网公司的项目在微服务和分布式的环境下进行的搭建&#xff0c;导致一个项目可能分别部署在几个甚至很多的服务器集群下&#xff0c;此时就会出现一个问题当用户进行一个session会话的时候&#xff0c;比…

session共享几种方式

Session共享三种方式 1.nginx基于ip_hash负载均衡。 只需要更改nginx.conf配置文件。添加ip_hash就可以了。 缺点&#xff1a;1.由于ip_hash分配tomcat的时候用的是除法&#xff0c;所以新添加一台服务器会导致分配不到原来程序上&#xff0c;session会丢失。2.同一个公网ip…

session共享学习

一、Session共享 1 什么是Session共享    是指在一个浏览器对应多个Web服务时&#xff0c;服务端的Session数据需要共享。 2 Session共享应用场景 单点登录Web服务器集群等 3 Session共享常见的解决方案 3.1 Session复制       通过对应用服务器的配置开启服务器的Sess…

redis实现session共享

session共享 什么是session&#xff1f; 由于 HTTP 协议是无状态的协议&#xff0c;所以服务端需要记录用户的状态时&#xff0c;就需要用某种机制来识具体的用户。Session 是另一种记录客户状态的机制&#xff0c;不同的是 Cookie 保存在客户端浏览器中&#xff0c;而 Sessi…

UART协议概述与实现

UART协议概述&#xff08;一&#xff09; 协议描述关键代码逻辑写在最后 协议描述 常见的三大低速通信协议之一&#xff0c;UART&#xff0c;通用异步收发协议。非常简单的协议&#xff0c;协议细节不需要多说&#xff0c;只说需要注意的点。空闲位为高位&#xff0c;起始位为…

UART协议简述及编程

UART原理简述 通用异步收发器简称UART&#xff08;universal asynchronous receiver transmitter&#xff09;。他的用途很广泛&#xff0c;一般常用的就是用来输出打印的信息&#xff0c;也可以外接各种模块&#xff0c;例如GPS和蓝牙等。 正是因为这种协议非常的简单可靠&…

UART协议及串口回环

UART协议及串口回环 一、异步通信的分类1、UART&#xff08;通用异步收发器&#xff09;2、RS4223、RS4854、Modbus5、接口标准 二、UART协议要求1、空闲状态2、起始位3、数据位4、校验位5、停止位6、波特率7、比特率 三、汉字发送四、串口回环uart_txuart_rxctrltop 五、参考六…