Nginx 负载均衡会话保持
背景
负载均衡时,如果APP需要保持特定状态的时候,就要保证同一用户的 session 会被分配到同一台服务器上。
实现方案
- 使用cookie
将用户的 session 存入 cookie 里,当用户分配到不同的服务器时,先判断服务器是否存在该用户的 session,如果没有就先把 cookie 里面的 sessoin 存入该服务器,实现 session 会话保持。缺点是存入 cookie 有安全隐患。 - 使用缓存
利用 memcache ,Redis 等缓存分布式的特点,可以将所有服务器产生的 session 存入同一台服务器的缓存中,实现 session 共享。这样安全性比较高,而且从内存中读取 session 比从文件中读取速度快。 - 使用 ip_hash
如果是 nginx 服务器的负载均衡,可以在 upstream 里设置 ip_hash,每个请求按访问 ip 的 hash 结果分配,映射到固定某一台的服务器。缺点是可能导致负载不均衡。
upstream https_proxy { server 172.26.114.89:8443; server 172.26.114.93:8443; ip_hash; }
注:ip_hash 不能和 weight 在一起使用。
注:使用案例,使用 Spring 框架,Redis 共享 Session,在页面出错的时候会频繁切换节点,有时候会导致两个节点执行相同的相应,这时就需要启动 ip_hash 来固定访问者。