Saya punya nginx yang dikonfigurasikan sebagai front-end ke aplikasi Python yang berjalan di bawah gunicorn, tetapi nginx memutuskan koneksi setelah sekitar 65 ribu data telah dikirim.
Misalnya, saya punya tampilan yang terlihat seperti ini:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Tetapi ketika saya mengakses URL itu melalui nginx, saya hanya mendapatkan 65283 byte:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Perhatikan bahwa semuanya berfungsi seperti yang diharapkan ketika mengakses gunicorn langsung:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
Konfigurasi nginx yang relevan:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
Dan nginx versi 1.7.0
Beberapa fakta lain:
- Jumlah byte konsisten dari permintaan untuk meminta, tetapi bervariasi berdasarkan konten (saya pertama kali melihatnya dengan file PNG besar, yang terputus setelah 65.372 byte, bukan 65.283)
- 110k byte dikirim dengan benar (yaitu,
"x" * 110000
mengembalikan semua 110.000 byte), tetapi 120k byte tidak tcpdump
menunjukkan bahwa nginx mengirim paket RST ke gunicorn:
Connection: close
. Saya juga sudah mengkonfirmasi bahwaContent-Length
tajuknya benar.Jawaban:
Baik! Setelah memeriksa log nginx, ini menjadi masalah:
Entah bagaimana izin untuk
proxy_temp
direktori menjadi kacau yang mencegah nginx melakukan buffering dengan benar.sumber
[crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream
, lakukansudo chown -R www-data:www-data /var/lib/nginx/
dan diperbaiki.