【问题标题】:110: Connection timed out (Nginx/Gunicorn)110:连接超时(Nginx/Gunicorn)
【发布时间】:2011-10-12 13:45:04
【问题描述】:

我在 gunicorn+nginx 上运行 django。我面临文件上传问题。实际上上传工作正常,但 gunicorn 超时,因此在 nginx 中导致此问题:

2011/07/25 12:13:47 [error] 15169#0: *2317 upstream timed out (110: Connection timed out) while reading response header from upstream, client: IP-ADDRESS, server: SERVER, request: "GET /photos/events/event/25 HTTP/1.1", upstream: "http://127.0.0.1:29000/photos/events/event/25", host: "HOST", referrer: "REFERER_ADDRESS"

如果我刷新页面,我可以看到所有照片都正常上传。问题是它会导致超时,从而给人一种上传不起作用的印象。

这是我的 gunicorn conf:

bind = "127.0.0.1:29000"
logfile = "/path/to/logs/gunicorn.log"
workers = 3

我尝试更改超时,但没有成功。

【问题讨论】:

  • 在收到错误之前上传这些文件需要多长时间?
  • 根据文件大小和我的连接速度,在几秒到一分钟之间的任何时间。 (我的速度变化很大:))。有时我什至会得到 20kb 的文件。
  • 是否存在您忘记关闭的某种套接字或通信原语?

标签: django nginx gunicorn


【解决方案1】:

您可以尝试通过添加以下内容来升级 Nginx 中代理传递的超时:

proxy_connect_timeout 75s;
proxy_read_timeout 300s;

如果您想增加 nginx 服务的所有站点的超时限制,请在 /var/nginx/sites-available/[site-config] 或 /var/nginx/nginx.conf 上。

您还必须将 --timeout 300 添加到您的 gunicorn 进程/配置中。

这解决了我过去上传更大的问题。

【讨论】:

  • proxy_connect_timeout nginx.org/en/docs/http/…
  • 我会加一个这个几次。这就是我对所有文件上传感到头疼的原因,我花了几个小时仔细检查我的代码并多次破坏我的 settings.py。我正在搬回 uwsgi。
  • 作为记录,我遇到了一些大文件/处理时间问题,而调整 gunicorn 配置中的“超时”值正是我需要解决的问题。感谢您提及!
  • 只需要在 nginx 配置上调整 proxy_read_timeout 300s; 和在 gUnicorn 命令行上调整 -t 300。在不增加proxy_connect_timeout 参数的情况下工作,根据 nginx 文档不推荐(如上面的 zm1 评论中所示)。
【解决方案2】:

这不是 nginx 超时,但可能是 Gunicorn 超时。 Gunicorn 默认为 30 秒超时。

一般来说,您应该通过不使用超过 30 秒才能返回的端点来解决此问题,但如果它是一个很少使用的端点,您也可以只增加 gunicorn 超时。

如果您这样做,您可能还应该增加 gunicorn 工作进程的数量。

要增加 gunicorn 的超时时间和工作线程,您可以在启动时添加以下命令行选项:

gunicorn --timeout 120 --workers <NUMBER OF WORKER YOU WANT>

【讨论】:

  • 是的,但是 nginx 上的 proxy_read_timeout 的默认值为 60 秒,因此如果您在 gUnicorn 中的进程需要更多时间才能回复,则还需要增加它。 nginx.org/en/docs/http/…
【解决方案3】:

我们在使用 Django+nginx+gunicorn 时遇到了同样的问题。 从 Gunicorn 文档中,我们配置了几乎没有任何区别的优雅超时。

经过一番测试,找到了解决办法,要配置的参数是:timeout (而不是优雅的超时)。它像时钟一样工作..

所以,做:

1) 打开gunicorn配置文件

2) 将 TIMEOUT 设置为您需要的值 - 值以秒为单位

NUM_WORKERS=3
TIMEOUT=120

exec gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--timeout $TIMEOUT \
--log-level=debug \
--bind=127.0.0.1:9000 \
--pid=$PIDFILE

【讨论】:

    【解决方案4】:

    这可能会对有类似问题的人有所帮助。

    我在我的 Django 应用程序上收到来自 nginx 和 gunicorn 的超时错误。由于我从 nginx 收到超时错误,因此我看不到 Django 的真正错误。像 fijter 建议的那样添加新的超时后。我可以看到错误在 settings.py 文件中。

    如果您将 DEBUG 设置为 False,并且未在 ALLOWED_HOSTS 中添加域名,您可能会收到此错误。

    我刚刚在 settings.py 的 ALLOWED_HOSTS 中添加了域,错误消失了。

    非常简单的解决方案!

    【讨论】:

    • 与问题无关,配置错误的ALLOWED_HOSTS不会导致502
    • 由于没有在ALLOWED_HOSTS 中添加domain name,我得到了connection closed
    【解决方案5】:

    如果您在 Nginx 中使用反向代理并使用 Gunicorn 运行 Django 应用程序,请尝试从默认值调整 Gunicorn 超时参数和 proxy_read_timeout 参数。

    【讨论】:

      猜你喜欢
      • 2014-03-01
      • 2018-01-31
      • 2016-06-07
      • 2012-12-19
      • 2013-08-16
      • 2011-08-01
      • 1970-01-01
      • 2021-02-23
      相关资源
      最近更新 更多