nginx-> gunicorn-> Django アプリに対して HTTP POST リクエストを実行しています。応答本文はすぐに返されますが、さらに約 60 秒間、要求が完全に終了しません。
「完全に終了」とは、私が試したさまざまなクライアント (Chrome、wget、作成中の Android アプリ) が、追加のデータを待っているかのように、要求がまだ進行中であることを示していることを意味します。Wireshark からリッスンすると、すべてのデータがすばやく到着し、60 秒後に ACK FIN が最終的に到着することがわかります。
ローカル開発サーバー ( ./manage.py runserver
) で同じ POST 要求がすばやく実行されます。また、nginx をバイパスして、gunicorn に対して直接実行します。また、Apache/mod_wsgi セットアップですばやく動作します。
GET リクエストには問題はありません。他の POST リクエストでも問題ありません。私が認識している違いの 1 つは、この特定のリクエストが 200 ではなく 201 を返すことです。
ヘッダー、閉じた接続とキープアライブ接続に関係があるContent-Length
と思いますが、どのように正しく動作するのかまだわかりません。
- バックエンド サーバー (gunicorn) は現在接続を閉じています。これは理にかなっています。
- バックエンド サーバーに
Content-Length header
、または を含める必要がありますかTransfer-encoding: chunked
? それとも、nginx はこれらがなくても対応でき、必要に応じて追加できるはずですか? - 接続のキープアライブは有効であり、nginx で無効にすべきではないと思います。
更新:keepalive_timeout
を 0 に設定するとnginx.conf
問題が解決します。しかし、もちろん、キープアライブはなくなりました。何が問題なのかまだわかりません。おそらく、スタック内の何か (私の Django アプリまたは gunicorn) がチャンク転送を正しく実装しておらず、クライアントを混乱させています。