Tôi đã có nginx được định cấu hình như một giao diện người dùng cho ứng dụng Python chạy dưới gunicorn, nhưng nginx đang chấm dứt các kết nối sau khi khoảng 65k dữ liệu đã được gửi.
Ví dụ: tôi đã có một chế độ xem như thế này:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Nhưng khi tôi truy cập URL đó thông qua nginx, tôi chỉ nhận được 65283 byte:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Lưu ý rằng mọi thứ hoạt động như mong đợi khi truy cập trực tiếp gunicorn:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
Cấu hình nginx có liên quan:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
Và nginx phiên bản 1.7.0
Một số sự thật khác:
- Số lượng byte phù hợp từ yêu cầu đến yêu cầu, nhưng nó thay đổi dựa trên nội dung (lần đầu tiên tôi nhận thấy nó có tệp PNG lớn, bị cắt sau 65.372 byte, không phải 65.283)
- 110k byte được gửi chính xác (nghĩa là
"x" * 110000
trả về tất cả 110.000 byte), nhưng 120k byte thì không tcpdump
gợi ý rằng nginx đang gửi gói RST tới gunicorn:
Sẽ rất hữu ích khi xem (a) cách gunicorn chọn khung trả lời có kích thước từ 110k đến 120k byte và (b) làm thế nào nginx sau đó chọn khung của nó cho cùng một phạm vi kích thước tải trọng mẫu trong khoảng từ 110k đến 120k byte. Ba cách mà HTTP có thể đóng khung dữ liệu: cung cấp độ dài nội dung; làm mã hóa chunked; hoặc hoàn toàn không đóng khung trừ việc hứa sẽ đóng ổ cắm khi cơ thể hoàn thành.
—
Brandon Rhodes
Một tiêu đề chiều dài nội dung đang được cung cấp. Hãy để tôi đổ gói để xem chuyện gì đang xảy ra giữa hai người khác
—
David Wolever
Hrm, rất kỳ lạ. tcpdump gợi ý rằng nginx đang tích cực RST kết nối (xem chỉnh sửa). nginx cũng đang sử dụng HTTP / 1.0 và
—
David Wolever
Connection: close
. Tôi cũng đã xác nhận rằng Content-Length
tiêu đề là chính xác.