문제

나는 Flup이 제기한 두려운 "처리되지 않은 예외"에 직면했습니다.슬픈 부분은 애플리케이션 수준(Django)이 아닌 웹 서버(lighthttpd+flup) 수준에서 발생한다는 것입니다.따라서 문제가 발생한 위치에 대해 500개의 이메일이 제기되지 않습니다.

우리 팀 전체는 모호한 가져오기로 인해 오류가 발생할 가능성을 없애기 위해 모호한 가져오기 및 그러한 종류의 누군가가 있는 경우 코드베이스를 정리하기 위해 열심히 노력했습니다.그리고 우리는 코드에서 많은 것들을 정리했습니다.여전히 동일한 예외입니다.

솔직히 말해서 저는 Flup의 오류 처리에 정말 실망했습니다.그것은 당신에게 아무것도 말하지 않습니다.가장 나쁜 것은 사용자에게 동일한 "처리되지 않은 예외"가 표시된다는 것입니다.어떻게 해야 통과할 수 있나요?

lighttpd 로그를 확인했습니다.내가 보는 것은 "인터페이스 오류/연결이 이미 닫혔습니다."입니다. 내 응용 프로그램이 FCGI 모드로 실행될 때 유일한 경우가 발생합니다.따라서 문제는 flup이 실제로 내 코드(응용 프로그램)를 어떻게 처리하는지에 있습니다.어떻게 해야 통과할 수 있나요?

나는 flup에 대한 대안을 확인했지만 Django는 명시적으로 flup에 의존합니다(이는 또 하나의 제한 사항이므로 당황스럽습니다)(참조:django_src/django/core/servers/fastcgi.py line:100 / 131)

이 시나리오를 (적어도) 디버깅하고 문제를 해결하려면 어떻게 해야 합니까?저를 도와주세요.3일 동안 애플리케이션이 다운되었습니다.

도움이 되었습니까?

해결책

나는 lighttpd 또는 flup을 사용하지 않으므로 이것은 힌트만큼 대답이 아닙니다.

앱 파일에서 PDB를 실행하거나 Flup Server .run () 메소드를 호출하기 전에 최소한 로그 파일에 쓰기로 시작합니다. 그렇게하면 문제가 FastCGI 또는 Flup에있는 것으로 식별 할 수 있습니다. 호출 된 섹션을 참조하십시오 파이썬 대화식 디버거 mod_wsgi 위키에서. LightTPD와 Flup을 사용하여 같은 일을하는 방법에 대한 아이디어를 줄 수 있습니다.

그런 다음 문제가 Flup이면 PDB에서 예외를 포착하고 거기에서 디버깅 할 수 있습니다.

문제가 LightTPD 인 경우 구성 파일에 어떤 종류의 문제가 있거나 LightTPD가 구축 된 방식에 문제가있을 수 있습니다. LightTP와 FastCGI 모듈 사이에 시스템 라이브러리 불일치가 있을까요?

nginx+fastcgi에서 앱을 실행하고 그것이 작동하는지 또는 최소한 더 나은 오류 메시지를 제공하는지 확인하십시오.

BTW, Flup의 저자 FCGI를 싫어하고 더 이상 Flup을 사용하지 않습니다... 나는 nginx 또는 apache+mod_wsgi로 전환하는 것이 좋습니다.

다른 팁

이는 Django가 설정 모듈 내의 구문 오류와 같은 요청 처리를 시작하기 전에 오류를 나타냅니다. 이러한 문제를 디버깅하는 가장 빠른 방법은 FastCGI 디버그를 켜는 것입니다. 이것은 128 행입니다 django/core/servers/fastcgi.py:

wsgi_opts['debug'] = False # Turn off flup tracebacks

그런 다음 수정 된 Django로 앱을 실행하면 Flup Traceback이 전체 영광을 볼 수 있습니다.

나는 비슷한 것을 쳤습니다. 우리는 NGINX 뒤에 Django가 있고 Django가 500을 처리하도록 허용합니다. 이것은 99.9%의 시간 동안 작동하지만 업그레이드를 수행할 때 때때로 이러한 "처리되지 않은 예외"가 빠져나가는 경우가 있습니다.

Django는 오류 처리를 위해 flup의 후크를 재정의하지 않으므로 우리는 이를 직접 수행하고 Django가 이러한 오류를 처리하도록 해야 합니다.

첫 번째 재정의 flup.server.BaseFCGIServer.error Django를 통해 오류를 처리합니다.그런 다음 Django에게 수정된 코드를 사용하도록 지시하겠습니다. BaseFCGIServer 그 오류를 보려면.

Python은 굉장하기 때문에 우리는 한 곳에서 모든 것을 속이고 몽키패치할 것입니다. django.core.servers.fastcgi.py.여기 있습니다:

# django.core.servers.fastcgi.py

def runfastcgi(argset=[], **kwargs):
    # ...

    # Paste his hack right after the `module` try/catch.

    # Override BaseFCGIServer.error to use Django error handling.
    # http://trac.saddi.com/flup/browser/flup/server/fcgi_base.py#L1210
    def patch_error(self, req):
        import sys
        from django.conf import settings
        from django.core import urlresolvers
        from django.core.handlers.wsgi import WSGIRequest

        urlconf = settings.ROOT_URLCONF
        urlresolvers.set_urlconf(urlconf)
        resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)

        # No access to 'environ' so rebuild WSGIRequest.
        # http://trac.saddi.com/flup/browser/flup/server/fcgi_base.py#L1077
        environ = req.params
        environ.update(self.environ)
        environ['wsgi.version'] = (1,0)
        environ['wsgi.input'] = req.stdin
        self._sanitizeEnv(environ)        
        wsgireq = WSGIRequest(environ)

        # http://code.djangoproject.com/browser/django/trunk/django/core/handlers/base.py#L177    
        response = self.application.handle_uncaught_exception(wsgireq, resolver, sys.exc_info())

        # TODO: NGINX figures this out, but other servers might not.
        # http://trac.saddi.com/flup/browser/flup/server/fcgi_base.py#L1104
        req.stdout.write('Status: 500\r\n')
        req.stdout.write('Content-Type: text/html\r\n\r\n' + response.content)    

    WSGIServer.error = patch_error

이제 flup 레벨 오류에도 Django 스택 추적을 즐길 수 있습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top