背景
你好,
我有一台在免费 EC2 实例上运行的服务器。我使用 nginx 和 Passenger/rails 作为我的 Web 服务器和应用程序服务器。该服务器接收的流量很少(仍在开发中),但来自随机机器人的流量相当可观。该服务器还提供来自 S3 的图像。前端在mywebsite.com
一个服务器块中定义的静态服务,后端使用 Passenger 提供服务api.mywebsite.com
。
问题
看似随机的,服务器的 CPU 使用率上升到 100%。CPU 使用率峰值与网络输出峰值相关,尽管网络峰值似乎仍然相对较小。当发生这种情况时,前端无法再提供服务,我甚至无法通过 SSH 进入服务器来检查正在运行的进程。
我尝试过的方法
- 使用以下方式阻止恶意机器人这个坏机器人拦截器。
- 将网络峰值与 nginx 访问日志中的请求关联起来
/var/logs/nginx/access.log
。通常这种关联不太明显。 - 寻找
/var/logs/nginx/error.log
任何相关内容。
当 CPU 出现这种情况时,我经常会在 EC2 控制台上重新启动服务器,这似乎有效,但显然不可持续。
我对部署/DevOps 还不熟悉,所以我想知道根据这些信息,我是否可能遗漏了一些明显的信息。我甚至不确定哪个层导致了问题(AWS/nginx/我的 rails 后端/vanilla HTML/JS 前端)。如果我可以提供任何其他信息,请告诉我。
谢谢,
雅各布
答案1
您需要找出哪些请求导致了 CPU 峰值。从您的访问日志开始,它可能是一小组 IP,但更可能是随机机器人攻击您的服务器。您必须应对这种情况,这在互联网上很正常。
我首先将服务器置于 CloudFlare 后面。确保将安全组更改为仅允许 CloudFlare IP 和您的私有 IP 直接访问服务器。这可能会阻止一些不良行为者。
接下来,您可以设置 Fail2Ban,并可选择配置 fail2ban 以使用 CloudFlare 防火墙阻止不良行为者(文章链接)。