Programing

Apache / Django / WSGI 잘못된 요청 (400) 오류 디버깅

lottogame 2020. 12. 1. 07:33
반응형

Apache / Django / WSGI 잘못된 요청 (400) 오류 디버깅


내 간단한 Django 앱은 디버그 모드 ( manage.py runserver) 에서 잘 작동하고 내 dev 상자의 WSGI + Apache에서 작동하지만 EC2로 푸시 할 때 Bad Request (400)시도하는 모든 URL 대해 간헐적 인 (10-80 %) 오류가 발생하기 시작했습니다. 보기 (내 앱이든 Django 관리자이든 상관 없습니다.

이에 대한 디버그 정보는 어디에서 찾을 수 있습니까? /var/log/apache2/error.log에도 아무 것도 나타나지 않습니다 LogLevel=info. 버전을 확인하고 요청 환경 ( ModWSGI 디버깅 팁 참조)을 기록했으며 큰 차이점이 없습니다.

남은 생각은 Python 2.7.1에 대해 빌드 된 Ubuntu 12.04 (libapache2-mod-wsgi 3.3-4build1)의 mod_wsgi를 사용하고 있다는 것입니다. Python 2.7.3이 있습니다. Django는 1.6으로 Ubuntu Precise 버전보다 최신 버전입니다. 정리하기가 너무 어렵고 사소한 버전 변경처럼 보이기 때문에 소스에서 패키지 빌드를 시작하는 것을 주저합니다.

도와 주셔서 감사합니다.

(참고로 여기 Apache 구성 및 WSGI 앱이 있습니다.)

Apache 구성 (000- 기본값)

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www
    WSGIScriptAlias /rz /usr/local/share/rz/rz.wsgi
    ...

rz.WSGI 앱

import os
import sys
import django.core.handlers.wsgi
import pprint

path = '/usr/local/share/rz'
if path not in sys.path:
    sys.path.insert(0, path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'rz.settings'

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

    def __call__(self, environ, start_response):
        errors = environ['wsgi.errors']
        pprint.pprint(('REQUEST', environ), stream=errors)

        def _start_response(status, headers, *args):
            pprint.pprint(('RESPONSE', status, headers), stream=errors)
            return start_response(status, headers, *args)

        return self.__application(environ, _start_response)

application = LoggingMiddleware(django.core.handlers.wsgi.WSGIHandler())

ALLOWED_HOSTS 설정을 settings.py에 추가하십시오.

ALLOWED_HOSTS = [
    '.example.com', # Allow domain and subdomains
    '.example.com.', # Also allow FQDN and subdomains
]

나는이 같은 문제가 있었고 여기 문서에서 답을 찾았습니다.

업데이트 : django 1.6 문서가 더 이상 온라인 상태가 아닙니다 ALLOWED_HOSTS. 설정 을 위해 django 1.7 문서로 이동하도록 링크를 업데이트했습니다 .


If you've definitely set ALOWED_HOSTS - make sure your hostname doesn't contain underscores. It's technically illegal.

I had to print out various functions and it boiled down to this regex failing to detect a domain in django.http

host_validation_re = re.compile(r"^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9:]+\])(:\d+)?$")

And indeed, my domain had an underscore in it.


This is not a solution, but for debugging purposes you might set the ALLOWED_HOSTS setting in your settings.py like this

ALLOWED_HOSTS = ['*']

It should definitely work. If not, at least you will know the problem isn't Django denying access to the given url.

참고URL : https://stackoverflow.com/questions/20321673/debugging-apache-django-wsgi-bad-request-400-error

반응형