1

我有以下设置...

  • nginx 监听公共端口 80 并将请求代理到localhost:10000
  • 运行 django 站点 1 的 uwsgi 监听 localhost:10000 并生成一些网页。它还对网络服务进行一些调用localhost:10001
  • 运行 django 站点 2 的 uwsgi 侦听localhost:10001等等,它对 web 服务进行了一些调用otherhost:1234

忙时otherhost,一些请求预计最多需要 10 分钟才能完成。不幸的是,恰好 2 分钟后,nginx 给出了一个502 Bad Gateway.

据我所知,问题必须是...

nginx超时:

我相信这不太可能,因为那将是 504,但我正在使用:

proxy_read_timeout 1800;
proxy_connect_timeout 1800;

uwsgi #1 超时:

我正在像这样启动 uwsgi(在这两种情况下)

nohup uwsgi --http :8000 --chdir /opt/Path/To/Project --module Project.wsgi
            --virtualenv /opt/pyenv --enable-threads --logto /var/log/LogFile.log -p 1
            --threads 50 -t 1800 2> /dev/null &

Django 站点 1 调用站点 2:

呼叫是这样进行的:

    response = urllib.request.urlopen(Url, urlencode(Data).encode("utf-8"), 
               timeout=1800).read().decode("utf-8")

站点 2 呼叫其他站点:

这是由一个使用HTTPConnectionPool. 我已经配置了 10 分钟的超时。我认为这不太可能,因为将其设置为(比如说)2s 会导致 Http 500 超时...

我已经扫描了我的代码库timeout(和120, 120000,甚至,绝望地2),但我找不到任何设置超时的地方 - 我认为它是something的默认值。

如果我跳过 nginx 并执行以下操作:

curl -m1800 -XGET 'http://localhost:10000/UI/Url'

我明白了

curl:(52)来自服务器的空回复

整整一分钟后。

有什么明显的我失踪了吗?有什么好的方法来追踪这个?

4

2 回答 2

2

你有一个非常“奇怪”的设置:

nginx -> uwsgi http 路由器 -> uwsgi

代替

nginx -> uwsgi

也许你有一些很好的理由,但在这种情况下,你需要通过 --http-timeout 1800 设置 uwsgi http 路由器和 uwsgi 之间的超时

如果 http 路由器不是您想要/需要的,您可以让 uwsgi 使用 --http-socket 选项说 http

于 2013-06-19T04:07:29.003 回答
0

尝试增加uwsgi_read_timeout

于 2013-06-20T06:49:50.143 回答