2009-10-13 3 views
2

개발중인 애플리케이션의 경우 사용자가 멀티 파트 양식 데이터 (content-type : multipart/form-data)와 함께 gzip으로 압축 된 HTTP POST 요청 (content-encoding : GZIP)을 제출합니다. mod_deflate를 압축 해제하는 입력 필터로 사용하고 웹 요청은 장고에서 mod_wsgi를 통해 처리됩니다.gzip으로 처리 된 요청에 응답 할 때 아파치가 느려짐

일반적으로 모든 것이 좋습니다. 그러나 특정 요청 (결정적)의 경우 요청에서 응답까지 거의 지연됩니다. 조사에 따르면 장고의 처리는 즉시 완료되지만 서버의 응답은 중단됩니다. 요청이 GZIP되지 않으면 모든 것이 잘 작동합니다.

mod_wsgi의 결함을 처리하기 위해 content-length를 압축되지 않은 메일 크기로 설정했습니다.

누구에게이 문제가 발생 했습니까? 응답을 처리 할 때 아파치를 쉽게 디버그 할 수있는 방법이 있습니까?

답변

5

mod_wsgi에서 어떤 결함이 있다고 생각합니까?

WSGI 1.0은 요청 내용의 내용 길이를 변경하는 입력 필터를 변경하는 것을 지원하지 않습니다. 따라서 기술적으로 WSGI 1.0을 사용할 때 요청 내용에 대해 Apache에서 mod_deflate를 사용할 수 없습니다. 콘텐츠 길이를 실제 크기가 아닌 다른 값으로 설정하면 mod_deflate의 작동이 멈출 수 있습니다.

압축 된 요청 내용을 처리하려면 WSGI 1.0 사양을 벗어나 비표준 코드를 사용해야합니다. 이 문제와 그것에 대해 제안 설명

http://blog.dscpl.com.au/2009/10/details-on-wsgi-10-amendmentsclarificat.html

:

나는 당신의 읽기를 제안한다.

코드를 작성하는 방법에 대한 토론을 위해이 문제를 공식 mod_wsgi mailing list에게 보내 주시면 매우 좋습니다. 그러나 파이썬 프레임 워크 중 하나를 사용하고 있지만 WSGI 1.0을 구현할 때 수행 할 수있는 작업에 제한이있을 수 있습니다.


UPDATE mod_wsgi에 목록 논의에서 1

는 원래 WSGI 응용 프로그램은 WSGI 미들웨어를 다음에 싸여되어야한다. 이것은 WSGI 어댑터가 실제로 입력에 대한 엔드 센티널로 빈 문자열을 제공하는 경우에만 작동하며 WSGI 1.0에서는 필요하지 않습니다. 이것은 모든 것을 메모리에 읽어 들이기 때문에 작은 업로드에만 사용되어야합니다. 큰 압축 된 업로드가 필요한 경우 축적 된 데이터를 대신 파일에 기록해야합니다.

class Wrapper(object): 

    def __init__(self, application): 
     self.__application = application 

    def __call__(self, environ, start_response): 
     if environ.get('HTTP_CONTENT_ENCODING', '') == 'gzip': 
      buffer = cStringIO.StringIO() 
      input = environ['wsgi.input'] 
      blksize = 8192 
      length = 0 

      data = input.read(blksize) 
      buffer.write(data) 
      length += len(data) 

      while data: 
       data = input.read(blksize) 
       buffer.write(data) 
       length += len(data) 

      buffer = cStringIO.StringIO(buffer.getvalue()) 

      environ['wsgi.input'] = buffer 
      environ['CONTENT_LENGTH'] = length 

     return self.__application(environ, start_response) 


application = Wrapper(original_wsgi_application_callable) 
+0

는 결함에 관해서는, 우리가 실제로 이전에 여기에이 논의 : http://code.djangoproject.com/ticket/10819#comment:1 난 그냥 내용을 설정해야한다는 것을 의미하는 당신의 코멘트를했다 -length는 압축되지 않은 메시지 크기입니다. 그 일을 지금까지 잘 작동했습니다 ... 어느 쪽이든, 나는 mod_wsgi 목록에 물었다. 당신의 도움을 주셔서 감사합니다. – UsAaR33

+1

mod_wsgi 목록에 대한 토론은 'http://groups.google.com/group/modwsgi/browse_frm/thread/54eba8ddff1a8eec'에 나와 있습니다. –

관련 문제