Nginx+Tomcat8 Cluster 方式,在两台服务器间SESSION不能正常复制!!??

发布于 2021-12-06 07:34:20 字数 5911 浏览 847 评论 21

Nginx 配置文件(server是两台不同的服务器)

       #tomcat的2个服务
    upstream mysite {
      server 120.76.55.66:6060 weight=5;
      server 120.76.54.22:6060 weight=1;
    }

    server {
        listen       80;
        server_name  test.yangchaomin.cn;

                location / {
            proxy_pass http://mysite;
            proxy_redirect off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       50m;
            client_body_buffer_size    128k;

                        #添加如下3个配置后,当一台server宕机,切换速度会很快,此时配置是10秒
            proxy_connect_timeout   10;
            proxy_send_timeout      10;
            proxy_read_timeout      10;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }

 

Tomcat1:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="4">
          <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <!-- address="228.0.0.4" 保留ip,用于广播-->
                <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
                <!--port="4001" 如果是在同一台机器上的两个tomcat做负载,则此端口则不能重复-->
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="120.76.55.66" port="4002" 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=".*.gif|.*.js|.*.jpeg|.*.jpg|.*.png|.*.htm|.*.html|.*.css|.*.txt|.*.pdf"/>
          <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>

Tomcat2:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="4">
          <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <!-- address="228.0.0.4" 保留ip,用于广播-->
                <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
                <!--port="4001" 如果是在同一台机器上的两个tomcat做负载,则此端口则不能重复-->
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="120.76.54.22" port="4002" 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=".*.gif|.*.js|.*.jpeg|.*.jpg|.*.png|.*.htm|.*.html|.*.css|.*.txt|.*.pdf"/>
          <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>

 

web.xml 添加了:

<distributable />

Linux 添加了组播:

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

现在是平均分配到两台服务器上面,SESSION会丢失,是因为因为是两个不同的地址(IP不同 ,但是映射的域名都是一样的)造成cookie不一样,从而导致session不一样了!!!???

在Tomcat日志文件也没有看到发送session的相关请求

请问大家有配置过吗!? 很捉急!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(21

残花月 2021-12-06 10:29:49

分布式 web 后端之间共享 session 最好用 redis 之类的。一旦后端多了起来,广播的方式负担太重

草莓味的萝莉 2021-12-06 10:29:47

推荐使用redis或zookeeper等用于共享session,Tomcat的广播方式不是最佳选择。

只为守护你 2021-12-06 10:29:46

虽然看不太懂,但有没有想过另一个思路,把session存在数据库里,通过客户端cookie里session的id实现session共享

小情绪 2021-12-06 10:29:46

现在赶,想完全通过配置 先实现

冬天旳寂寞 2021-12-06 10:29:46

时间赶得话,完全可以搭一个主从redis作为session中心

酒几许 2021-12-06 10:29:43

我的博文,可以参考下。

别低头,皇冠会掉 2021-12-06 10:29:43

两台不同的主机上部署测试过吗???

勿忘初心 2021-12-06 10:29:43

tomcat自带的session共享不稳定的,基于redis做一个独立的session存储中心。

灵芸 2021-12-06 10:29:42

redis方式需要编码吗?

白龙吟 2021-12-06 10:29:40

回复
@阿斯兰 : 嗯,不需要,配置一下tomcat的session位置,改成redis就行了,你需要的是找台服务器搭建一个redis

辞别 2021-12-06 10:29:40

回复
@阿斯兰 : 不需要,可以使用 Filter Spring-Session-Data-Redis

奈何桥上唱咆哮 2021-12-06 10:29:39

回复
@混乱羽翼 : tomcat-redis-session-manager 这个好像不支持Tomcat8

归属感 2021-12-06 10:29:38

用redis共享不是好一些?

终止放荡 2021-12-06 10:29:34

就是没有,奇怪得很! auto 也已经试过了,还是一样的

瑾兮 2021-12-06 10:29:31

你有配置的方案吗? 这个我已经折腾好久了,同步session的日志一直没出现!!

风透绣罗衣 2021-12-06 10:29:18

回复
@阿斯兰 : 两台的Receiver都改成auto

把回忆走一遍 2021-12-06 10:28:52

回复
@阿斯兰 : 看看日志,一台报no members active;然后启另一台看看是否有我上面贴的那个日志,如果有话,session同步应该就是开启了的

兮颜 2021-12-06 10:28:47

回复
@伊人梦醉 : 两台都是改成的auto,然后都提示no members active

多彩岁月 2021-12-06 09:42:11

看catalina.out的日志,有组播共享session的日志打印么? 

Nov 24, 2016 11:03:01 AM org.apache.catalina.ha.session.DeltaManager getAllClusterSessions
INFO: Manager [xxxx.xxxx.com], requesting session state from org.apache.catalina.tribes.membership.MemberImpl[tcp://{xxx, xx, xxx, xx}:5000,{xxx, xx, xxx, xx},5000, alive=1967089944, securePort=-1, UDP Port=-1, id={-82 93 -43 60 -18 70 64 -82 -75 28 123 112 18 -10 103 64 }, payload={}, command={}, domain={}, ]. This operation will timeout if no session state has been received within 60 seconds.

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="120.76.54.22" port="4002" autoBind="100" selectorTimeout="5000" maxThreads="6"/>

这个的address改成 【auto】 试试

终陌 2021-12-06 09:13:34

项目原来一直是单项目,现在头上的人想马上部署就先考虑了这种不改代码的方式

最偏执的依靠 2021-12-06 08:57:21

没有配置过这种方式。可以考虑存储cookie,将信息保存在客户端。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文