FastCGI를 사용하여 nginx 뒤에 Django를 실행하고 있습니다. 클라이언트로 전송 된 일부 응답에서 응답 중간에 임의의 데이터 손상이 발생한다는 것을 발견했습니다 (중간에 몇 백 바이트 정도일 수 있음).
이 시점에서 나는 장고 서버를 독립형 (즉 runserver
) 모드로 실행할 때이 문제가 발생하지 않기 때문에 nginx의 FastCGI 처리기 또는 Django의 FastCGI 처리기 (즉, 플랩의 버그) 중 하나 인 버그로 좁혔습니다 . FastCGI 모드에서만 발생합니다.
다른 흥미로운 트렌드 :
더 큰 응답에서 발생하는 경향이 있습니다. 클라이언트가 처음 로그인하면 1MB 청크가 전송되어 서버 DB와 동기화됩니다. 첫 번째 동기화 후 응답은 훨씬 작습니다 (보통 한 번에 몇 KB). 손상은 항상 처음에 전송 된 1MB 청크에서 발생하는 것으로 보입니다.
클라이언트가 LAN을 통해 서버에 연결된 경우 (즉, 지연 시간이 짧은 고 대역폭 연결) 더 자주 발생합니다. 이것은 nginx 또는 flup에 일종의 경쟁 조건이 증가하여 데이터 속도가 증가한다고 생각합니다.
지금은 응답 헤더에 추가 SHA1 다이제스트를 넣고 헤더가 본문 체크섬과 일치하지 않는 응답을 클라이언트가 거부하도록 하여이 문제를 해결해야했지만 이것은 끔찍한 해결책입니다.
다른 사람이 이와 같은 것을 경험했거나 여기에 결함이있는 플랩인지 또는 nginx인지 식별하는 방법에 대한 조언이 있습니까? 그래서 적절한 팀에 버그를 제기 할 수 있습니까?
도움을 주셔서 감사합니다.
참고 : 나는 또한 여기에 잠시 동안 lighttpd + FastCGI + Django에 비슷한 버그를 게시했습니다 : https : //.com -예상치 못한 일이지만 ... (절단 대 손상) 같은 것은 아니지만 일반적인 원인은 웹 서버가 아니라 flup / Django 인 것처럼 보이기 시작합니다.
편집 : 나는 또한 내 환경이 무엇인지 주목해야합니다.
Mac Mini의 OSX 10.6.6
파이썬 2.6.1 (시스템)
장고 1.3 (공식 타르볼에서)
flup 1.0.2 (플 루프 사이트의 Python egg에서)
nginx + ssl 1.0.0 (Macports에서)
편집 : Jerzyk의 의견에 대한 응답으로 응답을 구성하는 코드 경로는 다음과 같습니다 (간결성을 위해 편집 됨).
# 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
나는 그것을 기반으로 Content-Length가 잘못되었을 가능성이 없다고 생각하며 AFAIK는 Django HttpResponse 객체를 텍스트와 달리 명시 적으로 바이너리로 표시 할 수있는 방법이 없습니다. 또한 문제가 간헐적으로 발생하기 때문에 모든 요청에서 볼 수 있다고 설명하지는 않습니다.
@ionelmc 편집 : Django에서 Content-Length를 설정해야합니다-nginx는 Content-Length 설정을 명시 적으로 비활성화 할 때 아래 예제에 따라 이것을 설정하지 않습니다.
$ 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