【问题标题】:Django-App with Nginx and Gunicorn - Requests get lost?带有 Nginx 和 Gunicorn 的 Django-App - 请求丢失?
【发布时间】:2021-05-19 06:02:36
【问题描述】:

在我们公司,我们使用用 django 构建的时间跟踪系统。它与 Nginx 作为反向代理和 Gunicorn 一起部署以运行 python 代码。 它基本上是一个简单的系统,一个按钮开始考勤,另一个按钮停止。有时用户声称他们按下了开始或停止,但系统没有处理它。 我们现在正在确定我们的 Gunicorn 配置是否不适合我们的用例并且请求会丢失。

所以,我的问题是: 是否有可能,当 Nginx/Gunicorn 无法处理请求数量时,请求会丢失?

事实:

  • 最坏的情况是同时有大约 150 个请求(我们的应用程序有 150 个活跃用户,每个人都想同时注册它的停止。这确实不会发生)
  • Gunicorn 使用默认配置运行,但有 3 个工作人员

感谢您在这种情况下的任何帮助,如果您需要更多信息,请告诉我!

【问题讨论】:

  • 如果网络服务器由于某种原因无法处理传入请求的数量,则请求将超时,因为网络服务器正忙于处理现有请求。我不认为迷失是定义它的好方法。
  • Nginx 是一个反向代理。它实际上只是将请求代理到 gunicorn 服务器。除非您在 Nginx 中添加负载平衡逻辑,否则情况不同。您是否对服务器在特定时间内可以处理的请求数量进行了负载测试?
  • 另外,如果用户正在注册,那么这是对数据库的 INSERT 调用,这对于 Postgres 等数据库来说非常快..
  • 这里您可能需要考虑两件事 - 您的 Web 服务器一次可以处理多少个请求,以及您的数据库一次可以处理多少个请求。您可以通过使用持久连接来优化应用程序和数据库之间的 TCP 连接,这将使 TCP 连接保持打开状态,尤其是在您的应用程序进行大量数据库调用时。
  • 您好 SDRJ,非常感谢您的考虑!没有nginx的负载均衡逻辑,只是反向代理配置。如果服务器无法处理请求,最终用户应该通过其网络浏览器获得通知,对吗?

标签: django nginx gunicorn


【解决方案1】:

感谢@SDRJ 的想法,我可以自己解决这个问题。

原始服务器规格

  • 具有 2 个 CPU 的虚拟机
  • Nginx 作为反向代理
  • Gunicorn 运行 3 个 worker,每个 worker 1 个线程

负载测试

虽然少量请求的平均运行时间为 0.05 秒,但负载测试表明服务器一次无法处理超过 200 个请求。 这导致 Nginx 发出 “Bad Request 502” 信号以接收更多请求,这表明 Nginx 无法再访问 Gunicorn。

优化规格

将gunicorn的配置改为:

  • 3 个工人,4 个线程

这带来了更好的性能。服务器一次能够轻松处理超过 4000 个请求。

结论

是否有可能,当 Nginx/Gunicorn 无法处理请求数量时,请求会丢失?

是的,是的。 “丢失”可能是一个不利的描述,但可能会发生某些请求未得到处理的情况。

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 2013-03-22
    • 2015-03-31
    • 2019-03-22
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2012-11-20
    相关资源
    最近更新 更多