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的相关请求
请问大家有配置过吗!? 很捉急!!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(21)
分布式 web 后端之间共享 session 最好用 redis 之类的。一旦后端多了起来,广播的方式负担太重
推荐使用redis或zookeeper等用于共享session,Tomcat的广播方式不是最佳选择。
虽然看不太懂,但有没有想过另一个思路,把session存在数据库里,通过客户端cookie里session的id实现session共享
现在赶,想完全通过配置 先实现
时间赶得话,完全可以搭一个主从redis作为session中心
我的博文,可以参考下。
两台不同的主机上部署测试过吗???
tomcat自带的session共享不稳定的,基于redis做一个独立的session存储中心。
redis方式需要编码吗?
回复
@阿斯兰 : 嗯,不需要,配置一下tomcat的session位置,改成redis就行了,你需要的是找台服务器搭建一个redis
回复
@阿斯兰 : 不需要,可以使用 Filter Spring-Session-Data-Redis
回复
@混乱羽翼 : tomcat-redis-session-manager 这个好像不支持Tomcat8
用redis共享不是好一些?
就是没有,奇怪得很! auto 也已经试过了,还是一样的
你有配置的方案吗? 这个我已经折腾好久了,同步session的日志一直没出现!!
回复
@阿斯兰 : 两台的Receiver都改成auto
回复
@阿斯兰 : 看看日志,一台报no members active;然后启另一台看看是否有我上面贴的那个日志,如果有话,session同步应该就是开启了的
回复
@伊人梦醉 : 两台都是改成的auto,然后都提示no members active
看catalina.out的日志,有组播共享session的日志打印么?
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="120.76.54.22" port="4002" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
这个的address改成 【auto】 试试
项目原来一直是单项目,现在头上的人想马上部署就先考虑了这种不改代码的方式
没有配置过这种方式。可以考虑存储cookie,将信息保存在客户端。