我已经设置了gunicorn与3个工人,30个工人连接和使用eventlet工人类。它被设置在Nginx后面。每请求几次,我就会在日志里看到这个。

[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514

为什么会这样?我怎样才能知道哪里出了问题呢?


当前回答

你需要使用另一个worker类型类,比如gevent或tornado。 第一个解释:

如果您预计应用程序代码在请求处理期间可能需要暂停较长时间,您可能还需要安装Eventlet或Gevent

第二点:

默认的同步工作线程假定您的应用程序在CPU和网络带宽方面受到资源限制。通常这意味着您的应用程序不应该执行任何花费未定义时间的操作。例如,对互联网的请求就符合这个标准。在某些时候,外部网络会出现故障,客户端会堆积在您的服务器上。

其他回答

弗兰克的回答给我指明了正确的方向。我有一个数字海洋液滴访问管理数字海洋Postgresql数据库。我所需要做的就是将我的液滴添加到数据库的“可信来源”。

(在DO控制台点击数据库,然后点击设置。编辑Trusted Sources,选择液滴名称(在可编辑区域点击,会提示)。

在谷歌云 只需在app.yaml的入口点添加——timeout 90

entrypoint: gunicorn -b :$PORT main:app --timeout 90

这招对我很管用:

gunicorn app:app -b :8080 --timeout 120 --workers=3 --threads=3 --worker-connections=1000

如果你有eventlet,添加:

--worker-class=eventlet

如果你有gevent添加:

--worker-class=gevent

除了已经建议的gunicorn超时设置,因为你在前面使用nginx,你可以检查这两个参数是否有效,proxy_connect_timeout和proxy_read_timeout默认为60秒。可以在nginx配置文件中这样设置它们,

proxy_connect_timeout 120s;
proxy_read_timeout 120s;

使用——log-level debug运行Gunicorn。

它应该会给你一个应用程序堆栈跟踪。