web-dev-qa-db-ja.com

nginxは65kバイト後に接続を終了します

NginxをPythonアプリケーションをgunicornで実行するためのフロントエンドとして構成しましたが、nginxは約65​​kのデータが送信された後に接続を終了しています。

たとえば、次のようなビューがあります。

def debug_big_file(request):
    return HttpResponse("x" * 500000)

しかし、nginxを介してそのURLにアクセスすると、65283バイトしか取得できません。

$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
   0       1   65283

Gunicornに直接アクセスすると、すべてが期待どおりに機能することに注意してください。

$ curl http://localhost:1234/debug/big-file | wc
…
   0       1   500000

関連するnginx設定:

location / {
    proxy_pass http://localhost:1234/;
    proxy_redirect off;
    proxy_headers_hash_bucket_size 96;
}

そしてnginxバージョン1.7.0

他のいくつかの事実:

  • バイト数はリクエストごとに一貫していますが、内容によって異なります(最初に、大きなPNGファイルで65,283バイトではなく65,372バイトで切り取られていることに気付きました)。
  • 110kバイトは正しく送信されます(つまり、"x" * 110000はすべての110,000バイトを返します)が、120kバイトは返されません
  • tcpdumpは、nginxがRSTパケットをgunicornに送信していることを示唆しています。 nginx sending RST
11
David Wolever

はい! nginxログを再確認した後、これが問題であることが判明しました:

2014/05/26 16:50:56 [crit] 31396#0: *11 open() "…/proxy_temp/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 1.2.3.4, server: _, request: "GET /debug/big-file HTTP/1.1", upstream: "http://127.0.0.1:1234/debug/big-file", Host: "example.com"

いくつかのproxy_tempディレクトリがめちゃくちゃになり、nginxが適切にバッファリングできなくなりました。

10
David Wolever