Tôi đang chạy Django phía sau nginx bằng FastCGI. Tôi đã phát hiện ra rằng trong một số phản hồi được gửi cho khách hàng, lỗi dữ liệu ngẫu nhiên xảy ra ở giữa các phản hồi (có thể là vài trăm byte hoặc hơn ở giữa).
Tại thời điểm này, tôi đã thu hẹp nó thành một lỗi trong trình xử lý FastCGI của nginx hoặc trình xử lý FastCGI của Django (có lẽ là lỗi trong flup), vì sự cố này không bao giờ xảy ra khi tôi chạy máy chủ Django ở runserver
chế độ độc lập (tức là ). Nó chỉ xảy ra trong chế độ FastCGI.
Xu hướng thú vị khác:
Nó có xu hướng xảy ra trên các phản ứng lớn hơn. Khi một khách hàng đăng nhập lần đầu tiên, họ được gửi một loạt các đoạn 1 MB để đồng bộ hóa chúng với DB máy chủ. Sau lần đồng bộ đầu tiên đó, các phản hồi nhỏ hơn nhiều (thường là vài KB mỗi lần). Tham nhũng dường như luôn xảy ra trên các khối 1MB được gửi khi bắt đầu.
Nó xảy ra thường xuyên hơn khi máy khách được kết nối với máy chủ thông qua mạng LAN (tức là độ trễ thấp, kết nối băng thông cao). Điều này khiến tôi nghĩ rằng có một số loại điều kiện chủng tộc trong nginx hoặc flup bị trầm trọng hơn do tốc độ dữ liệu tăng lên.
Ngay bây giờ, tôi đã phải giải quyết vấn đề này bằng cách đưa thêm thông báo SHA1 vào tiêu đề phản hồi và yêu cầu khách hàng từ chối phản hồi trong đó tiêu đề không khớp với tổng kiểm tra cơ thể, nhưng đây là một giải pháp kinh khủng.
Có ai khác đã trải nghiệm bất cứ điều gì như thế này, hoặc có bất kỳ gợi ý nào về cách xác định xem đó là flup hoặc nginx có lỗi ở đây để tôi có thể gửi lỗi với nhóm thích hợp không?
Cảm ơn trước sự giúp đỡ nào.
Lưu ý: Tôi cũng đã đăng một lỗi tương tự trong lighttpd + FastCGI + Django một lúc trước tại đây: /programming/3714361/lighttpd-fastcgi-django-truncated-response-sent-to-client-due-to - thật bất ngờ ... mặc dù điều này không giống nhau (cắt ngắn và tham nhũng), nhưng nó bắt đầu giống như thủ phạm phổ biến là flup / Django chứ không phải là máy chủ web ..
Chỉnh sửa: Tôi cũng cần lưu ý môi trường của tôi là gì:
OSX 10.6.6 trên máy Mac Mini
Python 2.6.1 (Hệ thống)
Django 1.3 (từ tarball chính thức)
flup 1.0.2 (từ trứng Python trên trang web flup)
nginx + ssl 1.0.0 (từ Macports)
EDIT: Đáp lại bình luận của Jerhot, đường dẫn mã lắp ráp phản hồi trông giống như (được chỉnh sửa cho gọn gàng):
# This returns an objc NSData object, which is an array.array
# when pushed through the PyObjC bridge
ret = handler( request )
response = HttpResponse( ret )
response[ "Content-Length" ] = len( ret )
return response
Tôi không nghĩ rằng có thể Độ dài nội dung sai dựa trên điều đó và AFAIK không có cách nào để đánh dấu một đối tượng Django HttpResponse là nhị phân rõ ràng trái ngược với văn bản. Ngoài ra, vì vấn đề chỉ xảy ra không liên tục, tôi không nghĩ rằng điều đó giải thích nó nếu không có lẽ bạn sẽ thấy nó theo mọi yêu cầu.
EDIT @ionelmc: Bạn phải đặt Độ dài nội dung trong Django - nginx không đặt điều này cho bạn, theo ví dụ dưới đây một khi tôi đã tắt cài đặt Độ dài nội dung một cách rõ ràng:
$ curl -i http://localhost/io/ping
HTTP/1.1 200 OK
Server: nginx/1.0.0
Date: Thu, 23 Jun 2011 13:37:14 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
AKSJDHAKLSJDHKLJAHSD