web-dev-qa-db-ja.com

gunicorn + nginxでの長時間実行リクエスト

Djangoを利用したアプリケーション用の統合サーバーを作成しました。一部の機能はまだ実験段階であり、リクエストが非常に長くなります。

今のところ、パフォーマンスの低下は問題ありませんが、統合できるようにする必要があります。長いリクエストにつながる機能を使用すると、アプリは(予想どおり)ハングし、おそらく1分半後に「502-Bad Gateway」を返します。アプリの残りの部分は問題なく動作します。

私はgunicornログをチェックしました、そしてこれが起こるときはいつでも私は次のような行を取得します

2012-01-20 17:30:13 [23128] [DEBUG] GET /results/
2012-01-20 17:30:43 [23125] [ERROR] WORKER TIMEOUT (pid:23128)
Traceback (most recent call last):
  File "/home/demo/python_envs/frontend/lib/python2.6/site-packages/gunicorn/app/base.py", line 111, in run
    os.setpgrp()
OSError: [Errno 1] Operation not permitted

ただし、これは実際のワーカータイムアウトのかなり前に発生します。念のため、10分に設定しました。これは、gunicornを実行するupstartスクリプトの一部です。

description "..."

start on runlevel [2345]
stop on runlevel [!2345]
#Send KILL after 5 seconds
kill timeout 5
respawn

env VENV="/path/to/a/virtual/env/"

#how to know the pid
pid file $VENV/run/guniconr-8080.pid

script
exec Sudo -u demo $VENV/bin/gunicorn_Django --preload --daemon -w 4 -t 600 --log-level debug --log-file $VENV/run/gunicorn-8080.log -p $VENV/run/gunicorn-8080.pid -b localhost:8080 /path/to/settings.py
end script

私はgunicornバージョン0.13.4を実行しています。どんな助けでも大歓迎です。

8
Matt Luongo

502 Bad Gatewayは、gunicornワーカーがタイムアウトしたことを意味します。 gnuicornコマンドに--timeoutオプションを追加できます。デフォルトは30秒です。

@ greg-kが注記しているように、Nginxのproxy_read_timeoutオプションはさらに別のタイムアウトを制御します。 504 Gateway Timeoutエラーが表示された場合は、このオプションを調整できます。

5
Fish Monitor

これはおそらくnginx構成の問題です。 proxy_read_timeout値を構成しましたか?

このディレクティブは、プロキシされたサーバーの応答の読み取りタイムアウトを設定します。 nginxがリクエストへの応答を取得するために待機する時間を決定します。タイムアウトは、応答全体に対してではなく、2つの読み取り操作の間にのみ確立されます。

ソース: http://wiki.nginx.org/HttpProxyModule#proxy_read_timeout

3
Greg K