FastCGI kullanarak Django nginx arkasında çalıştırıyorum. İstemciye gönderilen yanıtların bazılarında, yanıtların ortasında rasgele veri bozulması oluştuğunu keşfettim (ortada birkaç yüz bayt olabilir).
Bu noktada ya nginx FastCGI işleyicisi veya Django FastCGI işleyicisi (yani muhtemelen flup bir hata) bir hata olarak daralttım, çünkü Django sunucusunu tek başına (ie runserver
) modunda çalıştırdığınızda bu sorun asla oluşmaz . Sadece FastCGI modunda olur.
Diğer ilginç eğilimler:
Daha büyük yanıtlarda ortaya çıkma eğilimindedir. Bir istemci ilk kez oturum açtığında, bunları sunucu DB'siyle eşitlemek için 1 MB'lık bir grup gönderilir. Bu ilk senkronizasyondan sonra yanıtlar çok daha küçüktür (genellikle bir seferde birkaç KB). Yolsuzluk her zaman başlangıçta gönderilen 1 MB'lık parçalarda meydana gelir.
İstemci sunucuya LAN üzerinden bağlandığında daha sık olur (düşük gecikme süresi, yüksek bant genişliği bağlantısı). Bu, nginx veya flup'ta artan veri hızıyla şiddetlenen bir çeşit yarış durumu olduğunu düşündürüyor.
Şu anda, yanıt başlığına fazladan bir SHA1 özeti ekleyerek ve istemcinin başlığın vücut sağlama toplamıyla eşleşmediği yanıtları reddetmesini sağlayarak bu sorunu çözmek zorunda kaldım, ancak bu korkunç bir çözüm.
Herkes böyle bir şey yaşadı mı, ya da uygun bir takım ile bir hata dosyalamak böylece burada hatalı flup ya da nginx olup olmadığını belirlemek için herhangi bir işaret var mı?
Herhangi bir yardım için şimdiden teşekkürler.
Not: Ben de bir süre önce lighttpd + FastCGI + Django'da benzer bir hata gönderdim: /programming/3714489/lighttpd-fastcgi-django-truncated-response-sent-to-client-due-to -beklenmedik ... bu aynı şey olmasa da (yolsuzluk vs yolsuzluk), ortak suçlu web sunucusu yerine flup / Django gibi görünmeye başlıyor ..
Düzenleme: Ayrıca ortamımın ne olduğunu da not etmeliyim:
Mac Mini'de OSX 10.6.6
Python 2.6.1 (Sistem)
Django 1.3 (resmi tarball'dan)
flup 1.0.2 (flup sitesinde Python yumurtasından)
nginx + ssl 1.0.0 (Macports'tan)
DÜZENLEME: Jerzyk yorumuna yanıt olarak, yanıtı birleştiren kod yolu şöyle görünür (özlü olma için düzenlenmiştir):
# 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
Buna göre İçerik Uzunluğu'nun yanlış olduğunu düşünmüyorum ve AFAIK, bir Django HttpResponse nesnesini metnin aksine açıkça ikili olarak işaretlemenin bir yolu yok. Ayrıca, sorun sadece aralıklı olarak gerçekleştiği için, bunu her türlü talepte göreceğinizi düşünüyoruz.
@İonelmc DÜZENLEME: Django'da İçerik Uzunluğu'nu ayarlamanız gerekir - İçerik Uzunluğu ayarını açıkça devre dışı bıraktıktan sonra aşağıdaki örneğe göre nginx bunu sizin için ayarlamaz:
$ 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