Django 504使用nginx和gunicorn的AWS超时

Django 504使用nginx和gunicorn的AWS超时,django,amazon-web-services,nginx,gunicorn,Django,Amazon Web Services,Nginx,Gunicorn,我正在AWS EC2实例上运行python Django应用程序。它使用gunicorn和nginx为应用程序提供服务,EC2位于应用程序负载平衡器的后面。偶尔会出现504错误,所有人都无法访问整个EC2实例(包括通过SSH,否则我一直使用SSH)。然后我需要重新启动所有需要时间的事情 我可以通过重载应用程序来复制错误(例如上载和处理非常大的图像),在这种情况下,gunicorn worker超时(我在日志中看到超时消息),出现504错误,实例变得无法访问。我将我的枪角设定为5分钟(300秒)后

我正在AWS EC2实例上运行python Django应用程序。它使用gunicorn和nginx为应用程序提供服务,EC2位于应用程序负载平衡器的后面。偶尔会出现504错误,所有人都无法访问整个EC2实例(包括通过SSH,否则我一直使用SSH)。然后我需要重新启动所有需要时间的事情

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


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

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

Nginx使用“事件驱动”方法处理请求,因此Nginx的单个工作程序可以同时处理1000个请求。但另一方面,Gunicorn主要(默认情况下)使用sync worker,这意味着在处理请求之前,请求将保留在worker中

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

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

编辑:

如果您无法捕获(缓存)oom,那么您唯一可以做的就是在系统重新启动后查看/var/logs/syslogs。。。正如我所说的AWS内存监视器中的监视器(我对AWS没有太多经验)

关于解决办法,

  • 您首先增加EC2的内存,直到您没有得到一个错误来查看问题有多大

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


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

Nginx使用“事件驱动”方法处理请求,因此Nginx的单个工作程序可以同时处理1000个请求。但另一方面,Gunicorn主要(默认情况下)使用sync worker,这意味着在处理请求之前,请求将保留在worker中

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

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

编辑:

如果您无法捕获(缓存)oom,那么您唯一可以做的就是在系统重新启动后查看/var/logs/syslogs。。。正如我所说的AWS内存监视器中的监视器(我对AWS没有太多经验)

关于解决办法,

  • 您首先增加EC2的内存,直到您没有得到一个错误来查看问题有多大

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


谢谢,它看起来确实很像。你知道有没有办法修复它(捕获错误),或者我应该完全改变技术吗?好的,谢谢。与此同时,我从gunicorn搬到了uWSGI。有了gunicorn,我总是可以通过上传一个大的图像文件并对其进行处理来复制问题。使用uWSGI,同一个文件要么被上传,要么我得到一个502错误,该错误不会使实例崩溃(只有我得到它,而不是所有人)。到目前为止看起来很有希望。谢谢,看起来确实如此。你知道有没有办法修复它(捕获错误),或者我应该完全改变技术吗?好的,谢谢。与此同时,我从gunicorn搬到了uWSGI。有了gunicorn,我总是可以通过上传一个大的图像文件并对其进行处理来复制问题。使用uWSGI,同一个文件要么被上传,要么我得到一个502错误,该错误不会使实例崩溃(只有我得到它,而不是所有人)。目前看来很有希望。