默认情况下,ALB会将每个客户端请求分别分发到不同的后端服务器上。当您开启了会话保持功能后,会话保持可以使来自同一客户端的请求被转发到同一台后端服务器上。本文为您介绍会话保持的相关配置。

背景信息

当您未开启会话保持时,同一客户端的请求通过ALB可能会被分配到不同的后端服务器,客户端的请求需要重新登录后端服务器。当您开启了会话保持后,会话保持会将同一客户端的会话请求转发给同一台后端服务器处理,这样会避免ALB将同一客户端请求分配到不同的服务器上,客户端的请求无需重复登录后端服务器。

ALB开启会话保持后,需要选择Cookie的处理方式,有植入Cookie和重写Cookie两种处理方式。
  • 植入Cookie:客户端第一次访问时,ALB会在返回请求中植入Cookie(即在HTTP/HTTPS响应报文中插入SERVERID),下次客户端携带此Cookie访问,负载均衡服务会将请求定向转发给之前记录到的后端服务器上。
    说明 会话保持植入Cookie方式自带SameSite=None,无需用户配置,可以有效解决ALB转发规则中跨域(CORS)场景下浏览器无法保存Cookie的问题。
  • 重写Cookie:当ALB发现用户自定义了Cookie,将会对原来的Cookie进行重写,下次客户端携带新的Cookie访问,ALB会将请求定向转发给之前记录的后端服务器。

使用限制

服务器组类型为函数计算类型时,您无需配置会话保持。更多操作,请参见创建服务器组

前提条件

配置会话保持

  1. 登录应用型负载均衡ALB控制台
  2. 在顶部菜单栏处,选择后端服务器组所属的地域。
  3. 在左侧导航栏,选择应用型负载均衡ALB > 服务器组
  4. 服务器组页面,找到目标服务器组,在操作列单击编辑基本信息
  5. 编辑基本信息对话框中,开启或关闭会话保持。
    • 开启会话保持:打开是否开启会话保持开关并选择Cookie处理方式
      • 选择植入Cookie,输入会话保持超时时间,然后单击保存

        会话保持超时时间取值范围为1~86400秒。

      • 选择重写Cookie,输入Cookie名称,然后单击保存
    • 关闭会话保持:关闭是否开启会话保持开关,然后单击保存

后端服务器配置Cookie的方法

当服务器组开启会话保持且选择的Cookie处理方式为重写Cookie时,需要在后端服务器中配置对应的Cookie。
说明
  • 本文将Cookie名称设置为BACKEND_SERVER,该名称仅为示例,您可以自定义该名称。
  • 不同的Web服务器对应的Cookie设置方法不同,以下列举常见Web服务器的设置方法,请您根据实际情况选择,如果您使用的Web服务器不在以下列表中,请您查阅对应的官方文档获取配置方法。
  1. 远程登录ECS。具体操作,请参见ECS远程连接操作指南
  2. 根据不同的Web服务器配置Cookie。
    • Apache
      1. 查看Apache的httpd.conf配置文件,确认以下配置没有被注释,即Apache正常加载了usertrack_module模块。
        说明 如果以下配置被注释,您需要移除注释并重启Apache服务。
        LoadModule usertrack_module modules/mod_usertrack.so
      2. 参考以下内容,在VirtualHost标签中添加配置。
        CookieName BACKEND_SERVER    #Cookie的名称,此处以BACKEND_SERVER为例。
        CookieExpires "1 days"       #Cookie的过期时间,此处以1天为例。
        CookieStyle Cookie
        CookieTracking on
      3. 执行以下命令,重新加载Apache的配置文件,使以上改动生效。
        service httpd reload
    • Nginx
      1. 编辑Nginx的nginx.conf配置文件,参考以下内容进行配置。
        server {    
            listen 80;    
            server_name www.example.com;    
            location / {        
                 add_header Set-Cookie BACKEND_SERVER=<自定义字符串>;    #Cookie的名称,此处以BACKEND_SERVER为例。        
                 root   html;        
                 index  index.html index.htm;
            }
        }
      2. 执行以下命令重新加载Nginx的配置文件。
        nginx -s reload
    • Lighttpd
      1. 编辑Lighttpd的lighttpd.conf配置文件,参考以下内容进行配置。
        server.modules  = ( "mod_setenv" )
        $HTTP["host"] == "www.example.com" {      
        server.document-root = "/var/www/html/"      
        setenv.add-response-header = ( "Set-Cookie" => "BACKEND_SERVER=<自定义字符串>" )
        }
      2. 重启Lighttpd服务,使以上改动生效。
  3. 参考以上步骤,修改服务器组中其余后端服务器的配置,使其含有Cookie配置。
  4. 修改服务器组配置,将Cookie处理方式设置为重写Cookie。
    1. 登录应用型负载均衡ALB控制台
    2. 在顶部菜单栏处,选择后端服务器组所属的地域。
    3. 在左侧导航栏,选择应用型负载均衡ALB > 服务器组
    4. 服务器组页面,找到目标服务器组,在操作列单击编辑基本信息
    5. 编辑基本信息对话框中,选择Cookie处理方式重写Cookie,并设置Cookie名称BACKEND_SERVER

测试会话保持的有效性

在后端服务器配置Cookie后,您需要测试ALB会话保持的有效性。

在测试会话保持有效性之前,您需要满足以下条件:
  • 您已经创建了一个处于运行中状态的公网ALB实例,且为该实例创建了服务器组并配置了监听。具体操作,请参见ALB快速入门
  • 您已经创建了后端服务器ECS01和ECS02,用于接收请求,且在ECS01和ECS02中分别创建了测试页面check.php,该页面将返回ECS实例的Cookie和内网IP地址信息,check.php的代码示例如下:
    <?php
        setcookie('mycookie','cookietest');
        echo 'Cookie is: ';
        echo ($_COOKIE['mycookie']);
        echo '</br>';
        echo 'Current ECS is : ';
        echo '</br>';
        var_dump($_SERVER['SERVER_ADDR']);
    ?>
  • 您已经在客户端创建了ECS03,用于发送请求。
本文中的ALB实例和ECS01、ECS02的网络规划为:
实例 IP规划
ALB 1.1.XX.XX
ECS01 192.168.32.175
ECS02 192.168.32.177
说明 本文中客户端的ECS01,服务端的ECS02和ECS03均安装了Linux操作系统,如果您使用的是其他操作系统,如何测试会话保持的有效性请参见您的操作系统手册。
  1. 远程登录客户端的ECS03,具体操作,请参见ECS远程连接操作指南
  2. 执行以下命令,保存ALB实例的Cookie值。
    说明 ALB的会话保持默认模式是植入Cookie,而curl命令默认不保存和发送Cookie。需要预先保存相应的Cookie,再进行测试。否则,curl测试结果将是随机的,影响测试结果的准确性。
    curl -D test.cookie http://1.1.XX.XX/check.php
  3. 新建测试脚本check_7.sh,内容如下。
    for ((a=1;a<=30;a++))
    do
        curl -b test.cookie http://1.1.XX.XX/check.php 2>/dev/null | grep 'ECS'
        sleep 1
    done
    说明 该脚本默认测试30次,您可以修改a<=30更改测试次数。
  4. 执行以下命令,进行会话保持测试。
    sh check_7.sh
    • 收到如下所示的回复报文,表示返回的后端服务器内网IP均是同一个,则会话保持有效。01
    • 收到如下所示的回复报文,表示返回的后端服务器内网IP不固定,则会话保持失效。02

相关文档