即使源服务器返回 HTTP 200

问题描述

当我们使用 经典 负载均衡器在 已退役 Tomcat 8 和 Java 8 运行于 64 位 Amazon Linux/3.3.8 上时,我们从未发现 HTTP 5xx 错误

该平台已停用,因此我们创建了一个新环境“Tomcat 8.5 with Corretto 11 在 64 位 Amazon Linux 2/4.1.3 上运行”,并在此过渡期间从 AWS Classic Load 迁移平衡器到他们较新的应用程序负载平衡器。

从那时起,除了两个例外,一切都非常顺利

1 - 任何引用 myapp.com//rest/something 的 URL 都失败(需要删除双斜杠,我不知道为什么这突然成为一个问题 - 但它通过一个简单的代码调整解决了,它只影响了我们的UAT 测试)

2 - 我注意到 CloudFront 门户中显示了一堆 HTTP 5xx 错误。这是我在这个问题中所关注的。

Table - Reports & Analytics > Popular Objects

您会注意到也有 2xx 响应?,因此这排除了有关 SSL 配置不正确的最常见问题 - 我原以为它们都会失败,而不是 50%。

我看到 2-4% 的错误率,我假设从流行对象表中它们都深层链接相关。

I'm consistently seeing 2-4% error rate

我已验证通过浏览器(和 curl)访问深层链接文件页面返回 HTTP 200 状态。我已经尝试通过 CDN 并使用 AWS 公共弹性 beantalk URL 直接连接到负载平衡器。

我看到过错误配置 SSL 会导致这些 502 错误的报告,但是我为不同的 URL 路径设置了多种行为,它们都使用相同的 SSL 证书。此外,您可以从第一个屏幕截图中看到,大约 50% 的请求命中了缓存,4,300 个请求是 HTTP 成功 2xx。

我已经使缓存无效,并且在 5-10 分钟后速率没有变得更糟,所以我必须得出结论,CDN 和源通信正常,至少有一半的时间。

我还看到服务器端重定向 (HTTP 301) 可能导致来自 CloudFront 的 HTTP 5xx 的报告,但我已经验证,对于深层链接 URL(例如 apple-app-site-association),它是一个静态 HTML 文件,没有重定向过滤器。

我已尝试比较 CloudFront 日志以将其与 HTTP 2xx 和 5xx 响应进行比较,但没有明显的模式可以解释它。例如,我看到相同 SSL 协议/密码的错误和成功(虽然我不太了解这个领域!),下面只是每个 HTTP 响应类别中的一些示例

502

  13: 2020-12-27    00:00:03    AMS54-C1    1304    [ip-redacted]   GET d2yrbvancsuyx.cloudfront.net    /apple-app-site-association 502 -   swcd%20(unkNown%20version)%20CFNetwork/1126%20Darwin/19.5.0 -   -   Error   TC10VGvkak58IlwqwCXpG9_GiR3HZR5vaouaC3AhiU6U5vFKbItI5g==    mycompany.com   https   230 0.073   -   TLSv1.3 TLS_AES_128_GCM_SHA256  Error   HTTP/1.1    -   -   54519   0.073   OriginConnectError  text/html   951 -   -

   50: 2020-12-27   00:00:05    WAW50-C1    1304    [ip-redacted]   GET d2yrbvancsuyx.cloudfront.net    /.well-kNown/apple-app-site-association 502 -   swcd%20(unkNown%20version)%20CFNetwork/976%20Darwin/18.2.0  -   -   Error   lCjWcds-6t1jOt1GI1mII-7DoPVKEE8mIxtT5sGZpWN7vj6t2gqBcQ==    mycompany.com   https   241 0.096   -   TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 Error   HTTP/1.1    -   -   63785   0.095   OriginConnectError  text/html   951 -   -

   51: 2020-12-27   00:00:05    WAW50-C1    1312    [ip-redacted]   GET d2yrbvancsuyx.cloudfront.net    /apple-app-site-association 502 -   swcd%20(unkNown%20version)%20CFNetwork/976%20Darwin/18.2.0  -   -   Error   g8Zj46gI3HMK3KJehze1u9WYMlxCl8dlIjc3vZFat-Jx3HmZD_I17w==    mycompany.com   https   229 0.050   -   TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 Error   HTTP/1.1    -   -   63785   0.050   Error   text/html   951 -   -

200 个


   23: 2020-12-27   00:00:08    LHR3-C2 598 [ip-redacted]   GET d2yrbvancsuyx.cloudfront.net    /.well-kNown/apple-app-site-association 200 -   swcd%20(unkNown%20version)%20CFNetwork/1128.0.1%20Darwin/19.6.0 -   -   Hit tdbpQ0zxszX4y70H9vniecKe9HP3xwd_KeI5SjrlckgrKNgsTJJFdA==    www.mycompany.com   https   250 0.001   -   TLSv1.3 TLS_AES_128_GCM_SHA256  Hit HTTP/1.1    -   -   10372   0.001   Hit -   193 -   -

   45: 2020-12-27   00:00:11    AMS54-C1    599 [ip-redacted]   GET d2yrbvancsuyx.cloudfront.net    /.well-kNown/apple-app-site-association 200 -   swcd%20(unkNown%20version)%20CFNetwork/1126%20Darwin/19.5.0 -   -   Hit QpbX2mGlhzXZR1gBC-HaZfBA-q5VWUC6t4NQgb6w3At4sCGhIz8ihQ==    www.mycompany.com   https   246 0.001   -   TLSv1.3 TLS_AES_128_GCM_SHA256  Hit HTTP/1.1    -   -   54526   0.001   Hit -   193 -   -

   53: 2020-12-27   00:00:07    WAW50-C1    599 [ip-redacted]   GET d2yrbvancsuyx.cloudfront.net    /.well-kNown/apple-app-site-association 200 -   swcd%20(unkNown%20version)%20CFNetwork/976%20Darwin/18.2.0  -   -   Hit UjQtTqnrlVbupxZmXj8RxwwISCfXgJ8viMD38vvEYXdmO-UWcFjk3A==    www.mycompany.com   https   245 0.002   -   TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 Hit HTTP/1.1    -   -   63787   0.002   Hit -   193 -   -

当我启动我们的应用程序时,深层链接 URL 得到了正确处理;启动应用程序而不是显示浏览器,并按预期呈现详细信息。我什至删除了该应用并从应用商店重新安装它,并且深层链接已按预期注册

弹性 beanstalk 已使用 Apache HTTP 服务器(而不是 Nginx)进行设置,它托管在欧洲/爱尔兰,并带有 SSL 证书以匹配 *.mycompany www.mycompany 和其他一些子域。我可以使用弹性 beantalk 公共 URL 直接访问它并给出证书警告,但这是可以预料的,因为该证书适用于 mycompany 而不是 mycomapny.eu-west-1.elasticbeanstalk.com - 检查证书表明它是有效的(未过期)对于域 mycompany.com,我已将其添加到我的信任存储区以继续查看文件 - 它按预期使用 HTTP 200 正常返回。

遗憾的是,CloudFront CDN 没有引用 AWS 欧盟/爱尔兰 SSL 证书的选项,因此我使用 AWS 证书管理器 (ACM) 通过美国/东部(北弗吉尼亚州)生成 SSL 证书。>

CloudFront 在内部从源检索数据并设置为使用 HTTP 或 HTTPs,然后将使用欧盟/爱尔兰 SSL 证书访问源。

就像我说的,这对于所有其他 CDN 行为都可以正常工作,但由于某种原因,5xx 仅显示在深链接文件的流行对象表中(我认为都是 502 错误)。

应用程序日志没有显示任何问题,但我认为它们甚至没有到达原点,因此出现 5xx 错误

有谁知道我如何通过 CloudFront --> 应用程序 负载均衡器 --> Apache --> 我们的静态 HTML 页面解决 5xx 错误

明确地说,我们在使用 CloudFront 时没有看到这个问题 --> CLASSIC 负载均衡器。

所有行为都与以前相同,我所做的只是将新源添加到 CloudFront 分配,然后更改每个行为以引用源。

仅供参考,我确实注意到 AWS 中存在一个错误,在编辑行为期间它清除了列入白名单的标头,因此我必须重新选择“主机”,否则页面会出现“使用 SSL 与ELB 源,转发所有标头或将 Host 标头列入白名单。如果您不想转发任何标头,请将源协议策略更改为 HTTP Only。'

解决方法

目前看起来问题与如何为 *.mycompany.com 通配 SSL 证书有关,但通配符不涵盖通过 mycompany.com(直接访问 apex)访问站点。

我怀疑我需要编辑或创建一个新的 ACM 预配证书,该证书明确列出 mycompany.com 和 *.mycompany.com - 我正在等待 AWS 的确认。

似乎 Apple 必须在没有 www 前缀的情况下从我们的服务器请求文件,但也许一旦失败,它会使用 www 前缀重试,我认为这可以解释为什么我看到几乎 50% 的失败(首先失败)时间,重试成功 = 50% 成功)。

更新:我可以确认,自从将顶级顶点 (mycompany.com) 添加到 SSL 证书后,除了通配符域 (*.mycompany.com) 之外,错误是不见了。