在 Docker 后面运行的 Nginx 上出现随机 502/503 错误(在 ECS 集群 + ALB 上)

Posted

技术标签:

【中文标题】在 Docker 后面运行的 Nginx 上出现随机 502/503 错误(在 ECS 集群 + ALB 上)【英文标题】:Random 502/503 error on Nginx running behind Docker (on ECS cluster + ALB) 【发布时间】:2019-04-22 16:14:19 【问题描述】:

所以我设置了一个 laravel 应用程序并托管在一个 docker 上,该 docker 使用在 ALB 后面运行的 AWS ECS 集群进行托管。

到目前为止,我的应用程序已按预期启动并运行,一切都按原样运行(例如,会话存储在 memcached 中并正常工作,静态资产在 S3 存储桶中,等等)。

现在我只有 1 个稳定性问题,我不确定问题到底出在哪里。当我点击我的 URL / 网站时,有时(随机)它会返回 502/503 HTTP 错误。发生这种情况时,我必须等待大约一两分钟,然后应用才能返回 200 个 HTTP 代码。

这是在我的 docker 上执行 tail 的结果(即 nginx 日志)

在这一点上,我完全迷失了,不知道我应该去哪里检查。我尝试了以下方法:

    在本地运行它,使用相同的 docker / nginx >> 工作正常。 在不使用 ALB 的情况下运行它(即仅使用 1 个 EC2)>> 遇到类似问题。 在 2 种不同的 EC2 类型(即 t2.small 和 micro)上使用 ALB 运行它>>两者都有类似的问题。 仅在 1 个 EC2 上使用 ALB 运行它 >> 遇到类似问题。

【问题讨论】:

您的实例真的要死了吗?您可以在 ECS 控制台中进行检查。如果容器被杀死,您可能会找出原因。看起来它正在被杀死,这可能表明内存不足 【参考方案1】:

根据您的日志,ngjnx 正在回答 401 Unauthorized 到 ALB 健康检查请求。您必须在 / 端点中回答 200 OK,或者在您的 ALB 目标组中配置一个不同的,例如 /ping

使用控制台检查目标的运行状况

    通过https://console.aws.amazon.com/ec2/ 打开 Amazon EC2 控制台。

    在导航窗格的负载平衡下,选择目标组。

    选择目标群体。

    在 Targets 选项卡上,Status 列指示每个目标的状态。

    如果状态不是“健康”,请查看工具提示以获取更多信息。

更多信息:https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html

【讨论】:

很好,只是未经授权。 谢谢让我这样做,看看它是否有助于解决问题。 感谢@TenorFlyy,已修复。【参考方案2】:

我过去曾遇到过类似的问题,原因可能有几个;

为 ALB 配置的运行状况检查,例如ALB 正在等待配置的检查次数变为绿色(例如,每 30 秒命中一个端点并等待 200 次,共 4/5 次。在“不健康阶段”期间,实例可能被指定为离线。这通常最常发生在重新启动或部署后或实例运行状况不佳时立即执行。 NGINX 中的 DNS。如果 NGINX 正在代理的下游服务的 DNS 记录已更改,则可能是 NGINX 已缓存(根据 TTL 或更长的时间,具体取决于您的配置)旧记录,因此无法连接到下游。

为了帮助进行全面调试,可能值得确定 502/503 是来自 ALB 还是来自 NGINX。您或许可以从 ALB 的访问日志或容器中的 /var/log/nginx/access|error.log 中确定这一点。

这也可能有助于检查响应中是否有响应正文?

【讨论】:

谢谢让我这样做,看看它是否有助于解决问题。

以上是关于在 Docker 后面运行的 Nginx 上出现随机 502/503 错误(在 ECS 集群 + ALB 上)的主要内容,如果未能解决你的问题,请参考以下文章

Angular App 在 nginx 上运行并在附加的 nginx 反向代理后面

如何使用 docker 和 nginx 在同一台服务器上运行多个站点?

Centos7上运行Docker容器

在 nginx 代理后面使用 docker 私有注册表 (v2) 的 HTTP 响应格式错误

代理错误后面的docker容器中的Gitlab vs Registry

在 docker-compose、nginx、mysql 和 php 上运行 wordpress