编辑应用程序负载均衡器的属性 - Elastic Load Balancing

编辑应用程序负载均衡器的属性

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

连接空闲超时

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

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

默认情况下,Elastic Load Balancing 将负载均衡器的空闲超时值设置为 60 秒(即 1 分钟)。使用以下过程设置不同的空闲超时值。

使用控制台更新连接空闲超时值
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 属性选项卡上,选择编辑

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

  6. 选择 Save changes(保存更改)

使用 AWS CLI 更新空闲超时值

使用带 idle_timeout.timeout_seconds 属性的 modify-load-balancer-attributes 命令。

HTTP 客户端保持连接持续时间

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

注意

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

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

使用控制台更新客户端保持连接持续时间值
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 属性选项卡上,选择编辑

  5. 流量配置下,输入 HTTP 客户端保持连接持续时间的值。有效范围是 60 至 604800 秒。

  6. 选择 Save changes(保存更改)

使用 AWS CLI 更新客户端保持连接持续时间值

使用带 client_keep_alive.seconds 属性的 modify-load-balancer-attributes 命令。

删除保护

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

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

使用控制台启用删除保护
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 属性选项卡上,选择编辑

  5. 配置下,打开删除保护

  6. 选择 Save changes(保存更改)

使用控制台禁用删除保护
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 属性选项卡上,选择编辑

  5. 配置页面下,关闭删除保护

  6. 选择 Save changes(保存更改)

使用 AWS CLI 启用或禁用删除保护

使用带 deletion_protection.enabled 属性的 modify-load-balancer-attributes 命令。

异步缓解模式

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

http_desync_guardian 库会分析 HTTP 请求,防止发生 HTTP 异步攻击。有关更多信息,请参阅 GitHub 上的 HTTP 异步监护

分类

下面列出了这些分类。

  • 合规 – 请求符合 RFC 7230 标准,不构成已知的安全威胁。

  • 可接受 - 请求不符合 RFC 7230 标准,但不构成已知的安全威胁。

  • 不明确 - 请求不符合 RFC 7230 标准,会带来风险,因为各个 Web 服务器和代理可能会以不同的方式处理该请求。

  • 严重 - 请求会带来很高的安全风险。负载均衡器会阻止请求,向客户端提供 400 响应,并关闭客户端连接。

如果请求不符合 RFC 7230 标准,负载均衡器将递增 DesyncMitigationMode_NonCompliant_Request_Count 指标。有关更多信息,请参阅 Application Load Balancer 指标

每个请求的分类都包含在负载均衡器访问日志中。如果请求不符合,则访问日志将包含分类原因代码。有关更多信息,请参阅 分类原因

模式

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

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

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

使用控制台更新异步缓解模式
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 属性选项卡上,选择编辑

  5. 数据包处理下,对于 Desync 缓解模式,选择防御最严格监控

  6. 选择 Save changes(保存更改)

使用 AWS CLI 更新异步缓解模式

使用 modify-load-balancer-attributes 命令,并将 routing.http.desync_mitigation_mode 属性设置为 monitordefensivestrictest

主机标头保留

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

默认情况下,未启用 Preserve host header(保留主机标头)属性时,应用程序负载均衡器会通过以下方式修改 Host 标头:

未启用主机标头保留,且侦听器端口为非默认端口时:不使用默认端口(端口 80 或 443)时,如果客户端尚未附加端口号,我们会将端口号附加到主机标头中。例如,假设侦听器端口是非默认端口(例如 8080),HTTP 请求中具有 Host: www.example.comHost 标头将被修改为 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
使用控制台启用主机标头保留
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 属性选项卡上,选择编辑

  5. 数据包处理下,打开保留主机标头

  6. 选择 Save changes(保存更改)

使用 AWS CLI 启用主机标头保留

使用 modify-load-balancer-attributes 命令,并将 routing.http.preserve_host_header.enabled 属性设置为 true