NginxをPythonアプリケーションをgunicornで実行するためのフロントエンドとして構成しましたが、nginxは約65kのデータが送信された後に接続を終了しています。
たとえば、次のようなビューがあります。
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
他のいくつかの事実:
"x" * 110000
はすべての110,000バイトを返します)が、120kバイトは返されませんtcpdump
は、nginxがRSTパケットをgunicornに送信していることを示唆しています。 はい! 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が適切にバッファリングできなくなりました。