首页 > 解决方案 > 使用 nginx 和 gunicorn 在 AWS 上出现 504 超时

问题描述

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

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

我正在为所有当前和未来的案例寻找解决此问题的方法。即,我希望出现这样的情况,如果站点超载,它会返回一条错误消息,而不是变得对每个人都完全无法访问。有没有办法做到这一点?

标签: djangoamazon-web-servicesnginxgunicorn

解决方案


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

Nginx 使用“事件驱动”的方法来处理请求,因此单个 nginx 工作人员可以同时处理 1000 个请求。但另一方面,Gunicorn 主要(默认情况下)使用同步工作者,这意味着请求将保留在工作者中,直到它被处理。

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

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

编辑:

AFAIK您无法捕获(缓存)oom,您唯一能做的就是后果,即在系统重启后看到/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


推荐阅读