假设 EC2 实例上的 nginx 崩溃了。该实例运行正常,CloudWatch 指标也很好,但服务器上托管的所有域现在都处于“连接被拒绝”状态。
这似乎是一个非常基本的功能 - 监控以确保网站返回 200。这在 CloudWatch 中吗?我认为有些东西可以curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
,如果它没有收到 200 的返回代码(比如连续 5 次),它将触发实例重启和 SNS 通知。
也许我应该在 EC2 实例上运行某些东西,如果某些东西无法访问,它会重新启动 nginx?无论哪种方式,我都很想知道如何使用 AWS 资源执行此操作,这样我甚至可以监控任何站点并启动 SNS。
抱歉,如果我在这里遗漏了一些简单的东西。这似乎很容易搜索到,但我花了几个月的时间才弄清楚。
答案1
这通常是负载均衡器(ALB 或 ELB)可以检测实例上的 Web 服务器是否正在运行,如果没有,您可以通过以下方式触发某些操作云监控. 同样,通常情况下,通过Auto Scaling 组。
即使您只需要一个实例,使用 ASG 和 ALB 也是完全正常的。
或者你可以创建自定义 CloudWatch 指标使用实例上安装的 CW 代理。然后您可以报告任何您想要的内容。
希望有帮助:)
答案2
在我看来,因为 Nginx 停止响应而替换实例并不是一个好的工程解决方案。实例替换可能需要几分钟,因此依赖 AWS 来执行此操作将意味着您的服务在此期间处于离线状态,而简单的 Nginx 重新加载只需不到 1 秒的时间。
Nginx 是一项非常非常强大的技术。如果它失败到了你需要 AWS 解决方案来保证可靠性的地步,你可能需要回头看看你的 Nginx 设置。我很感激你想了解 AWS,但我不认为这是一个好的用例。
回答这个问题:在 AWS 中实现站点可靠性的方法有很多种。如果您想使用单个实例来实现这一点并且不需额外付费,我建议您使用 ElasticBeanstalk 作为交钥匙解决方案。它将根据您提供的健康检查应用您需要的所有必要的可靠性机制。您还可以在 ElasticBeanStalk 中利用 Docker,这是所有 SRE 操作的最终目标。