17
回答
Nginx+Tomcat8 Cluster 方式,在两台服务器间SESSION不能正常复制!!??
华为云实践训练营,热门技术免费实践!>>>   

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的相关请求

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

举报
阿斯兰
发帖于8个月前 17回/821阅
共有17个答案 最后回答: 8个月前

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

--- 共有 1 条评论 ---
阿斯兰项目原来一直是单项目,现在头上的人想马上部署就先考虑了这种不改代码的方式 8个月前 回复

看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】 试试

--- 共有 5 条评论 ---
阿斯兰 回复 @伊人梦醉 : 两台都是改成的auto,然后都提示no members active 8个月前 回复
伊人梦醉 回复 @阿斯兰 : 看看日志,一台报no members active;然后启另一台看看是否有我上面贴的那个日志,如果有话,session同步应该就是开启了的 8个月前 回复
伊人梦醉 回复 @阿斯兰 : 两台的Receiver都改成auto 8个月前 回复
阿斯兰你有配置的方案吗? 这个我已经折腾好久了,同步session的日志一直没出现!! 8个月前 回复
阿斯兰就是没有,奇怪得很! auto 也已经试过了,还是一样的 8个月前 回复

用redis共享不是好一些?

--- 共有 4 条评论 ---
阿斯兰 回复 @混乱羽翼 : tomcat-redis-session-manager 这个好像不支持Tomcat8 8个月前 回复
混乱羽翼 回复 @阿斯兰 : 嗯,不需要,配置一下tomcat的session位置,改成redis就行了,你需要的是找台服务器搭建一个redis 8个月前 回复
公孙二狗 回复 @阿斯兰 : 不需要,可以使用 Filter Spring-Session-Data-Redis 8个月前 回复
阿斯兰redis方式需要编码吗? 8个月前 回复

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

--- 共有 1 条评论 ---
阿斯兰现在赶,想完全通过配置 先实现 8个月前 回复
顶部