nginx chấm dứt kết nối sau 65k byte


11

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" * 110000trả 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: nginx gửi RST

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à Connection: close. Tôi cũng đã xác nhận rằng Content-Lengthtiêu đề là chính xác.
David Wolever

Câu trả lời:


10

Được chứ! Sau khi kiểm tra hai lần nhật ký nginx, điều này hóa ra là vấn đề:

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"

Một số cách các quyền cho proxy_tempthư mục bị rối tung khiến cho nginx không được đệm đúng cách.


1
Vâng, tôi vừa giải quyết một vấn đề như thế này, nhìn vào nhật ký nginx, có một dòng chứa [crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream, đã làm sudo chown -R www-data:www-data /var/lib/nginx/và nó đã được sửa.
Epigene
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.