

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

# 编辑应用程序负载均衡器的属性
<a name="edit-load-balancer-attributes"></a>

创建应用程序负载均衡器后，您可以编辑其属性。

**Topics**
+ [连接空闲超时](#connection-idle-timeout)
+ [HTTP 客户端保持连接持续时间](#http-client-keep-alive-duration)
+ [删除保护](#deletion-protection)
+ [异步缓解模式](#desync-mitigation-mode)
+ [主机标头保留](#host-header-preservation)

## 连接空闲超时
<a name="connection-idle-timeout"></a>

连接空闲超时是指在负载均衡器关闭连接之前，现有客户端或目标连接可以保持不活动状态（不发送或接收任何数据）的时间段。

为确保文件上传等耗时较长的操作有时间完成，请在每个空闲超时期限过去之前发送至少 1 字节的数据，并根据需要增加空闲超时期限的长度。此外，我们建议您将应用程序的空闲超时配置为大于负载均衡器的空闲超时的值。否则，如果应用程序不正常地关闭了与负载均衡器的 TCP 连接，则负载均衡器可能会在收到数据包之前向应用程序发送请求，表明连接已关闭。如果是这种情况，则负载均衡器将向客户端发送 HTTP 502 Bad Gateway（HTTP 502 无效网关）错误。

应用程序负载均衡器不支持 HTTP/2 PING 框架。此类框架不会重置连接空闲超时。

默认情况下，Elastic Load Balancing 将负载均衡器的空闲超时值设置为 60 秒。

------
#### [ Console ]

**更新空闲超时值**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择负载均衡器。

1. 在**属性**选项卡上，选择**编辑**。

1. 在**流量配置**下，输入**连接空闲超时**的值。有效范围是 1 至 4000 秒。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

**更新空闲超时值**  
使用带 `idle_timeout.timeout_seconds` 属性的 [modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html) 命令。有效范围为 1 至 4000 秒。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn {{load-balancer-arn}} \
    --attributes "Key=idle_timeout.timeout_seconds,Value={{120}}"
```

------
#### [ CloudFormation ]

**更新空闲超时值**  
更新[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)资源以包含该`idle_timeout.timeout_seconds`属性。有效范围为 1 至 4000 秒。

```
Resources:
  myLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup
      LoadBalancerAttributes: 
        - Key: "idle_timeout.timeout_seconds"
          Value: "{{120}}"
```

------

## HTTP 客户端保持连接持续时间
<a name="http-client-keep-alive-duration"></a>

HTTP 客户端保持连接持续时间是应用程序负载均衡器与客户端保持持久 HTTP 连接的最长时间长度。在配置的 HTTP 客户端保持连接持续时间过去后，应用程序负载均衡器将接受另一个请求，然后返回一个正常关闭连接的响应。

负载均衡器发送的响应类型取决于客户端连接使用的 HTTP 版本。
+ 对于使用 HTTP 1.x 连接的客户端，负载均衡器会发送包含字段 `Connection: close` 的 HTTP 标头。
+ 对于使用 HTTP/2 连接的客户端，负载均衡器会发送 `GOAWAY` 帧。

默认情况下，应用程序负载均衡器将负载均衡器的 HTTP 客户端保持连接持续时间值设置为 3600 秒（即 1 小时）。HTTP 客户端保持连接持续时间不能关闭或设置为低于最小值 60 秒，但您可以增加 HTTP 客户端保持连接持续时间，最长可达 604800 秒（即 7 天）。当最初建立与客户端的 HTTP 连接时，应用程序负载均衡器开始 HTTP 客户端保持连接持续时间。持续时间在没有流量时会继续，并且在建立新连接之前不会重置。

当使用可用区转移或可用区自动转移将负载均衡器流量从受损的可用区转移出来时，具有现有开放连接的客户端可能会继续向受损位置发出请求，直到客户端重新连接。为了支持更快的恢复，请考虑设置较低的保持连接持续时间值，以限制客户端保持连接到负载均衡器的时间。有关更多信息，请参阅《*Amazon 应用程序恢复控制器（ARC）开发人员指南*》中的 [Limit the time that clients stay connected to your endpoints](https://docs.aws.amazon.com/r53recovery/latest/dg/route53-arc-best-practices.zonal-shifts.html#arc-zonal-shift.existing-connections)。

**注意**  
当负载均衡器将应用程序负载均衡器的 IP 地址类型切换为 `dualstack-without-public-ipv4` 时，负载均衡器会等待所有活动连接完成。要缩短切换应用程序负载均衡器的 IP 地址类型所需的时间，请考虑降低 HTTP 客户端保持连接持续时间。

应用程序负载均衡器在初始连接期间分配 HTTP 客户端保持连接持续时间值。当您更新 HTTP 客户端保持连接持续时间时，这可能会导致同时建立具有不同 HTTP 客户端保持连接持续时间值的连接。现有连接将保留其初始连接期间应用的 HTTP 客户端保持连接持续时间值。新连接将接收更新后的 HTTP 客户端保持连接持续时间值。

------
#### [ Console ]

**更新客户端保持连接持续时间**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择负载均衡器。

1. 在**属性**选项卡上，选择**编辑**。

1. 在**流量配置**下，输入 **HTTP 客户端保持连接持续时间**的值。有效范围为 60 至 604800 秒。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

**更新客户端保持连接持续时间**  
使用带 `client_keep_alive.seconds` 属性的 [modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html) 命令。有效范围为 60 至 604800 秒。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn {{load-balancer-arn}} \
    --attributes "Key=client_keep_alive.seconds,Value={{7200}}"
```

------
#### [ CloudFormation ]

**更新客户端保持连接持续时间**  
更新[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)资源以包含该`client_keep_alive.seconds`属性。有效范围为 60 至 604800 秒。

```
Resources:
  myLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup
      LoadBalancerAttributes: 
        - Key: "client_keep_alive.seconds"
          Value: "{{7200}}"
```

------

## 删除保护
<a name="deletion-protection"></a>

为了防止您的负载均衡器被意外删除，您可以启用删除保护。默认情况下，已为负载均衡器禁用删除保护。

如果您为负载均衡器启用删除保护，则必须先禁用删除保护，然后才能删除负载均衡器。

------
#### [ Console ]

**启用或禁用删除保护**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择负载均衡器。

1. 在**属性**选项卡上，选择**编辑**。

1. 在**保护**部分，启用或禁用**删除保护**。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

**要启用或禁用删除保护**  
使用带 `deletion_protection.enabled` 属性的 [modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html) 命令。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn {{load-balancer-arn}} \
    --attributes "Key=deletion_protection.enabled,Value={{true}}"
```

------
#### [ CloudFormation ]

**要启用或禁用删除保护**  
更新[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)资源以包含该`deletion_protection.enabled`属性。

```
Resources:
  myLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup
      LoadBalancerAttributes: 
        - Key: "deletion_protection.enabled"
          Value: "{{true}}"
```

------

## 异步缓解模式
<a name="desync-mitigation-mode"></a>

异步缓解模式可以保护您的应用程序不受由于 HTTP 异步造成的问题的影响。负载均衡器根据每个请求的威胁级别对请求进行分类，允许安全请求，然后根据您指定的缓解模式来减轻风险。异步缓解模式包括“监控”、“防御”和“最严格”。默认情况下采用“防御”模式，该模式可在保持应用程序可用性的同时，针对 HTTP 异步提供持久的缓解作用。您可以切换到最严格模式，确保应用程序只接收符合 [RFC 7230](https://tools.ietf.org/html/rfc7230) 标准的请求。

http\_desync\_guardian 库会分析 HTTP 请求，防止发生 HTTP 异步攻击。有关更多信息，请参阅上的 [HTTP Desync Guardian](https://github.com/aws/http-desync-guardian)。 GitHub

**分类**

下面列出了这些分类。
+ 合规 – 请求符合 RFC 7230 标准，不构成已知的安全威胁。
+ 可接受 - 请求不符合 RFC 7230 标准，但不构成已知的安全威胁。
+ 不明确 - 请求不符合 RFC 7230 标准，会带来风险，因为各个 Web 服务器和代理可能会以不同的方式处理该请求。
+ 严重 - 请求会带来很高的安全风险。负载均衡器会阻止请求，向客户端提供 400 响应，并关闭客户端连接。

如果请求不符合 RFC 7230 标准，负载均衡器将递增 `DesyncMitigationMode_NonCompliant_Request_Count` 指标。有关更多信息，请参阅 [Application Load Balancer 指标](load-balancer-cloudwatch-metrics.md#load-balancer-metrics-alb)。

每个请求的分类都包含在负载均衡器访问日志中。如果请求不符合，则访问日志将包含分类原因代码。有关更多信息，请参阅 [分类原因](load-balancer-access-logs.md#classification-reasons)。

**模式**  
下表描述 Application Load Balancer 如何根据模式和分类来处理请求。


| 分类。 | 监控模式 | 防御模式 | 最严格模式 | 
| --- | --- | --- | --- | 
| 合规 | 已允许 | 已允许 | 已允许 | 
| 可接受 | 已允许 | 已允许 | 阻止 | 
| 不明确 | 已允许 | 已允许¹ | 阻止 | 
| 严重 | 已允许 | 阻止 | 阻止 | 

¹ 系统将路由请求，但关闭客户端和目标连接。如果您的负载均衡器在防御模式下收到大量不明确请求，则可能会产生额外费用。这是因为每秒增加的新连接数会影响每小时使用的负载均衡器容量单位 (LCU)。您可以使用 `NewConnectionCount` 指标比较负载均衡器在监控模式和防御模式下建立新连接的方式。

------
#### [ Console ]

**更新异步缓解模式**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择负载均衡器。

1. 在**属性**选项卡上，选择**编辑**。

1. 在**流量配置**部分的**数据包处理**下，对于**异步缓解模式**，选择**防御**、**最严格**或**监控**。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

**更新异步缓解模式**  
使用带 `routing.http.desync_mitigation_mode` 属性的 [modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html) 命令。可能的值为 `monitor`、`defensive` 或 `strictest`。默认值为 `defensive`。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn {{load-balancer-arn}} \
    --attributes "Key=routing.http.desync_mitigation_mode,Value={{monitor}}"
```

------
#### [ CloudFormation ]

**更新异步缓解模式**  
更新[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)资源以包含该`routing.http.desync_mitigation_mode`属性。可能的值为 `monitor`、`defensive` 或 `strictest`。默认值为 `defensive`。

```
Resources:
  myLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup
      LoadBalancerAttributes: 
        - Key: "routing.http.desync_mitigation_mode"
          Value: "{{monitor}}"
```

------

## 主机标头保留
<a name="host-header-preservation"></a>

启用 **Preserve host header**（保留主机标头）属性时，应用程序负载均衡器会保留 HTTP 请求中的 `Host` 标头，并将请求发送到目标而不做任何修改。如果应用程序负载均衡器收到多个 `Host` 标头，它会保留所有这些标头。侦听器规则仅会应用于收到的第一个 `Host` 标头。

默认情况下，未启用 **Preserve host header**（保留主机标头）属性时，应用程序负载均衡器会通过以下方式修改 `Host` 标头：

**未启用主机标头保留，且侦听器端口为非默认端口时**：不使用默认端口（端口 80 或 443）时，如果客户端尚未附加端口号，我们会将端口号附加到主机标头中。例如，假设侦听器端口是非默认端口（例如 `8080`），HTTP 请求中具有 `Host: www.example.com` 的 `Host` 标头将被修改为 `Host: www.example.com:8080`。

**未启用主机标头保留，并且侦听器端口为默认端口（端口 80 或 443）时**：对于默认侦听器端口（端口 80 或 443），我们不会将端口号附加到传出的主机标头中。传入主机标头中已经存在的任何端口号都将被移除。

应用程序负载均衡器将如何根据侦听器端口来处理 HTTP 请求中的主机标头的更多示例见下表。


| 侦听器端口 | 示例请求 | 请求中的主机标头 | 已禁用主机标头保留（默认行为） | 已启用主机标头保留 | 
| --- | --- | --- | --- | --- | 
| 请求在默认 HTTP/HTTPS 监听器上发送。 | GET /index.html HTTP/1.1 Host: example.com | example.com | example.com | example.com | 
| 在默认的 HTTP 侦听器上发送请求，并且主机标头具有端口（例如，80 或 443）。 | GET /index.html HTTP/1.1 Host: example.com:80 | example.com:80 | example.com | example.com:80 | 
| 请求具有绝对路径。 | GET https://dns\_name/index.html HTTP/1.1 Host: example.com | example.com | dns\_name | example.com | 
| 在非默认侦听器端口（例如 8080）上发送请求 | GET /index.html HTTP/1.1 Host: example.com | example.com | example.com:8080 | example.com | 
| 在非默认侦听器上发送请求，并且主机标头具有端口（例如 8080）。 | GET /index.html HTTP/1.1 Host: example.com:8080 | example.com:8080 | example.com:8080 | example.com:8080 | 

------
#### [ Console ]

**启用主机标头保留**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择负载均衡器。

1. 在**属性**选项卡上，选择**编辑**。

1. 在**数据包处理**下，打开**保留主机标头**。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

**启用主机标头保留**  
使用`routing.http.preserve_host_header.enabled`属性设置为的[modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html)命令`true`。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn {{load-balancer-arn}} \
    --attributes "Key=routing.http.preserve_host_header.enabled,Value={{true}}"
```

------
#### [ CloudFormation ]

**启用主机标头保留**  
更新[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)资源以包含该`routing.http.preserve_host_header.enabled`属性。

```
Resources:
  myLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup
      LoadBalancerAttributes: 
        - Key: "routing.http.preserve_host_header.enabled"
          Value: "{{true}}"
```

------