

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用基于应用程序的 Cookie 进行粘性会话
<a name="app-cookies-stickiness"></a>

当您使用带有基于应用程序的 Cookie 的 Application Load Balancer 时：
+ Application Load Balancer 使用[目标组权重](https://aws.amazon.com/premiumsupport/knowledge-center/elb-make-weighted-target-groups-for-alb/)来确定如何在目标组之间平衡传入流量。
+ 默认情况下，Application Load Balancer 使用循环方法[将请求路由到目标目标组中的 EC2 实例](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#modify-routing-algorithm)。
+ 在流量最初路由到实例后， EC2 EC2 实例应用程序响应应包含自定义应用程序 Cookie，该应用程序将与自动的 Application Load Balancer cookie 一起发送回客户端。
+ 如果客户端发回应用程序 Cookie 和 Application Load Balancer cookie，则后续流量将持续到该 EC2 实例。
+ 基于应用程序的 Cookie 在配置的持续时间内不使用后过期。

**模板：**使用 CloudFormation 模板`stickysessionsapp.yml`（包含在[示例代码.zip 文件](samples/stickiness.zip)中）尝试使用基于应用程序的 Cookie 进行粘性会话。

## 常见使用案例
<a name="app-cookies-use-cases"></a>

如果您想在以下情况下进行更多控制，请使用带有应用程序生成的 Cookie 的粘性会话：
+ PHP 网络服务器
+ 维护日志、购物车或聊天对话等临时会话数据的服务器

## basic.yml 的代码发生了变化
<a name="app-cookies-code-changes"></a>

唯一的代码更改是在目标组配置中。我们在 Application Load Balancer 和目标组属性中添加了粘性配置。应用程序 Cookie 持续时间已指定，目标群组已启用应用程序 Cookie 粘性。



|  |  | 
| --- |--- |
| basic.yml | stickysessionsapp.yml | 
| <pre>TG1:<br />   Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'<br />   Properties:<br />     Name: TG1<br />     Protocol: HTTP<br />     Port: 80<br />     TargetType: instance<br />     Targets:<br />       - Id: !Ref Instance1<br />       - Id: !Ref Instance2<br />VpcId: !Ref CustomVPC</pre> | <pre>TG1:<br />  Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'<br />  Properties:<br />    Name: TG1<br />    Protocol: HTTP<br />    Port: 80<br />    TargetType: instance<br />    Targets:<br />      - Id: !Ref Instance1<br />      - Id: !Ref Instance2<br />    VpcId: !Ref CustomVPC<br />    TargetGroupAttributes:<br />      - Key: stickiness.enabled<br />        Value: true<br />      - Key: stickiness.type<br />        Value: app_cookie<br />      - Key: stickiness.app_cookie.duration_seconds<br />        Value: 10<br />      - Key: stickiness.app_cookie.cookie_name<br />        Value: TESTCOOKIE</pre> | 

## 步骤
<a name="app-cookies-steps"></a>

**备注**  
NAT 网关的费用很小。
多个 EC2 实例将比单个 EC2实例更快地耗尽您的免费套餐时间。

1. 在实验室环境`stickysessionslb.yml`中部署 CloudFormation 模板。

1. 等待，直到目标组实例的运行状况从**初始**变为正**常**。

1. 使用 HTTP (TCP/80) 在网络浏览器中导航到 Application Load Balancer 网址。

   例如：`http://alb-123456789.us-east-1.elb.amazonaws.com/`

   该网页显示以下内容之一：**实例 1- TG1**、**实例 2- TG1**、**实例 3- TG2** 或**实例 4- TG2**。

1. 多次刷新页面。

## 预期结果
<a name="app-cookies-results"></a>

**注意**  
本示例中的 CloudFormation 模板已将粘性配置为持续 10 秒。有效的粘性持续时间配置介于 1 秒到 1 周之间。

加载网页的实例应保持不变，如页面文本所示。

粘性持续时间不会刷新，而是基于在 Application Load Balancer 中为实例生成的应用程序 Cookie 配置的过期时间。 EC2 

**示例 1：**等待 5 秒钟刷新页面。同一个实例将加载，粘性将再刷新 10 秒钟。

**示例 2：**等待时间超过 10 秒以重新加载页面。应用程序 Cookie 过期，您将被路由到另一个实 EC2 例。这个新实例会生成另一个持续时间为 10 秒的应用程序 Cookie。

## 工作方式
<a name="app-cookies-how"></a>
+ 在此示例中，这些 EC2 实例安装了 Apache Web 服务器 (`httpd`)。该`httpd.conf`文件配置为向客户端（您的 Web 浏览器）返回静态`Set-Cookie`值。该`Set-Cookie`值被硬编码为。`TESTCOOKIE=<somevalue>`
+ 打开浏览器的 **Inspect Element** 选项，选择**网络**选项卡，然后选择加载页面的 Ge **t** 方法。您将看到一个 **Cookie** 选项卡。
+ 浏览器是一个客户端应用程序，它会自动配置为使用服务器`Set-Cookie`响应中收到的 Cookie 向服务器返回任何后续更新。
+ 当您重新加载页面时，在初始页面加载时收到的 Cookie 会自动发送回 Application Load Balancer。
  + 如果 Cookie 已过期（即自您上次调用以来已过 10 秒），Application Load Balancer 将使用新的逻辑来确定将流量路由到哪个 EC2 实例。
  + 如果 cookie 尚未过期，Application Load Balancer 会将流量路由到同一个 EC2实例。