最近apache做了一个企业集群项目的反向代理,发现当高峰期的时候会出现503的报错,但是系统页面刷新一下几十秒之后就正常了,没有找到好的办法解决
于是想到用更好的nginx,并且想配置负载均衡,但是由于我们的系统是SSO单点登陆的集成项目,存在session的问题,找开发弄session序列化弄不好,人也不好协调,就想采用nginx的ip_hase策略;
在网上找了半天都没有具体看懂这种策略的逻辑原理,只不过大概知道是根据客户端IP锁定到其中一个节点;
现在就是想找位大师了解下,ip_hase负载分发策略的时候 具体怎么实现的;会不会出现当用户第一次登陆系统的时候分发到某一个节点,然后从此这个用户就永远锁定到这个节点了,什么情况下用户能够在登陆访问的时候重新根据逻辑选择节点?
拿PHP提供的session来说,默认使用的是文件存储的方式,会话文件就保存在当前的服务器,一般是/tmp下:
session.save_handler=files
session.save_path=/tmp
PHP的会话机制会给客户端设置一个cookie用来保存sesseion_id,对应服务器上的会话文件/tmp/sess_
sesseion_id
把这些session绑定在本机的Web应用放到
Nginx的upstream应用集群应该是不合适的,就算
设置ip_hash让固定IP只访问一个后端,
但如果客户端IP在会话中改变,那就有可能连上后端其他的服务器,这样会导致找不到会话.
还有如果这台后端服务器宕机,那用户的会话也会丢失.
所以最好还是自己用cookie实现一套适合自己的session机制,比如用mysql内存表或者memcached来保存cookie对应的会话数据,非关键和不敏感的数据直接设置cookie保存到客户端,这样会话数据就不会存储在具体的应用服务器上,方便了使用Nginx的 upstream进行php-fpm应用服务器集群扩展.
拿PHP提供的session来说,默认使用的是文件存储的方式,会话文件就保存在当前的服务器,一般是/tmp下:
session.save_handler=files
session.save_path=/tmp
PHP的会话机制会给客户端设置一个cookie用来保存sesseion_id,对应服务器上的会话文件/tmp/sess_
sesseion_id
把这些session绑定在本机的Web应用放到
Nginx的upstream应用集群应该是不合适的,就算
设置ip_hash让固定IP只访问一个后端,
但如果客户端IP在会话中改变,那就有可能连上后端其他的服务器,这样会导致找不到会话.
还有如果这台后端服务器宕机,那用户的会话也会丢失.
所以最好还是自己用cookie实现一套适合自己的session机制,比如用mysql内存表或者memcached来保存cookie对应的会话数据,非关键和不敏感的数据直接设置cookie保存到客户端,这样会话数据就不会存储在具体的应用服务器上,方便了使用Nginx的 upstream进行php-fpm应用服务器集群扩展.
回复 @eechen:同样多谢大神,我刚开始学习nginx,太复杂的话反而我怕造成其他问题,ip_hase这样的方式也算是适合我们想在的系统环境了,不是完全“均衡”的负载,但是也能分担单个节点压力,存在节点的宕机风险导致部分用户无法使用,也好过现在单个节点承受的风险,是不是这个道理哈~~这个你最好问下Tengine作者 @shudu,看看有没有可行的方法。把内网特定的IP段用Nginx分流到后端Tomcat上,可以试着这样干:可以把session托管到memcache或者redis嘛
推荐你使用Tengine:
1、使用Tengine的consistent_hash功能,以你的登录的cookie为key,这样的话一个固定的用户(登录cookie值)可以hash到一台固定的机器上。
2、如果没有登录(即没有登录cookie),则使用round-robin方式(默认的负载均衡方式)。
3、你可以使用if来判断cookie值是否为空。
兼容从nginx转tengine有无什么限制?都兼容么?赞一个mark客户端服务器session是靠浏览器cookie维持的,每次去请求都会带一个参数SESSIONID。so...只要把nginx的分发策略设置为根据cookie中的SESSIONID来分发。可以满足你的需求。只要第一次登陆(不管ip是否登陆过)都会走负载,重新分配节点;如果已经访问过(带cookie)则可以保证分配到同一节点。QQ:875881559欢迎交流版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。