使用 nginx 和 gunicorn 在 AWS 上出现 504 超时

504 timeout on AWS with nginx and gunicorn

我是 运行 AWS EC2 实例上的 python Django 应用程序。它使用 gunicorn 和 nginx 来为应用程序提供服务,EC2 在应用程序负载均衡器后面。有时我会收到 504 错误,其中整个 EC2 实例对每个人都无法访问(包括通过 SSH,否则我一直使用它)。然后我需要重新启动所有需要时间的东西。

我可以通过重载应用程序(例如上传和处理非常大的图像)来复制错误,在这种情况下,gunicorn worker 超时(我在日志中看到超时消息),出现 504 错误并且实例变为无法到达。我将我的 gunicorn 设置为 5 分钟(300 秒)后超时,但它倒下的速度比这更快。 CloudWatch 日志中没有真正有用的东西。

我正在寻找解决所有当前和未来案例的方法。也就是说,我想要这样一种情况,如果站点超载,它会 returns 一条错误消息,而不是变得对每个人都完全无法访问。有办法吗?

这里有很多事情需要考虑和测试,以了解这是什么原因,但我认为这是 OOM(内存不足),主要是因为您甚至必须重新启动才能登录 SSH。

Nginx uses "event‑driven" approach to handle requests so a single worker of nginx can handle 1000s of req simultaneously. But Gunicorn on the other hand mostly(by default) uses sync worker which means a request will remain with a worker till it is processed.

当您提出一个大请求时,您的机器会尝试处理该请求,直到发生溢出,大多数情况下它不会被机器内的任何服务 运行 检测到。只需尝试通过 AWS 中的任何监控工具或仅通过 SSH 监控内存,并在调用 API.

之前使用 htop

在大多数情况下 Django/gunicorn 是 oom 的罪魁祸首。

编辑:

AFAIK 你不能捕获(缓存)一个 oom,你唯一能做的就是后果,即在系统重启后 sees/var/logs/syslogs ... 正如我在 AWS 内存监视器中所说的监视器(我没有太多使用 AWS 的经验)。

关于解决方案,

  • 你先把你的EC2的内存加大,直到不报错,看看问题有多大

  • 然后您通过分析哪个部分实际占用了这么多内存来优化您的应用程序。我没有使用任何内存分析,所以也许你可以告诉我哪个更好。 您唯一能做的就是优化您的应用程序,查看常见问题、最佳实践、查询优化等。

https://haydenjames.io/how-to-diagnose-oom-errors-on-linux-systems/ https://www.pluralsight.com/blog/tutorials/how-to-profile-memory-usage-in-python