会话保持原理

会话保持是一种将同一客户端的请求分配到同一个后端服务器的技术,可以避免会话丢失。

会话保持优势

  • 避免会话丢失:避免会话丢失,提高用户体验
  • 提高性能:减少后端服务器的会话同步开销
  • 简化架构:简化后端服务器的架构

IP 哈希

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}

IP 哈希说明

  • ip_hash:使用 IP 哈希算法分配请求

IP 哈希原理: IP 哈希是一种基于客户端 IP 地址的会话保持方法,根据客户端 IP 地址的哈希值分配请求。同一客户端的请求会分配到同一个后端服务器。

哈希

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

哈希说明

  • hash $request_uri consistent:使用请求 URI 的哈希值分配请求

哈希原理: 哈希是一种基于自定义变量的会话保持方法,根据自定义变量的哈希值分配请求。同一变量的请求会分配到同一个后端服务器。

Cookie 保持

upstream backend {
    server backend1.example.com;
    server backend2.example.com;

    sticky cookie srv_id expires=1h domain=example.com path=/;
}

Cookie 保持说明

  • sticky cookie srv_id expires=1h domain=example.com path=/:使用 Cookie 保持会话

Cookie 保持原理: Cookie 保持是一种基于 Cookie 的会话保持方法,Nginx 会在响应中设置 Cookie,客户端会在后续请求中携带 Cookie,Nginx 根据 Cookie 分配请求。

学习保持

upstream backend {
    server backend1.example.com;
    server backend2.example.com;

    sticky learn create=$upstream_cookie_examplecookie
          lookup=$cookie_examplecookie
          zone=client_sessions:1m
          timeout=1h;
}

学习保持说明

  • sticky learn:使用学习保持会话
  • create=$upstream_cookie_examplecookie:创建 Cookie
  • lookup=$cookie_examplecookie:查找 Cookie
  • zone=client_sessions:1m:设置共享内存区域
  • timeout=1h:设置超时时间

学习保持原理: 学习保持是一种基于学习的会话保持方法,Nginx 会学习后端服务器设置的 Cookie,并在后续请求中根据 Cookie 分配请求。

会话保持方法对比

方法说明优点缺点
ip_hashIP 哈希简单、可靠不能根据后端服务器的负载情况分配请求
hash哈希灵活不能根据后端服务器的负载情况分配请求
sticky cookieCookie 保持可以根据后端服务器的负载情况分配请求需要客户端支持 Cookie
sticky learn学习保持可以根据后端服务器的负载情况分配请求需要后端服务器设置 Cookie