web-dev-qa-db-ja.com

Apache / Django / WSGI Bad Request(400)エラーのデバッグ

シンプルなDjangoアプリはデバッグモード(_manage.py runserver_)で正常に動作し、開発ボックスでWSGI + Apacheの下で動作しましたが、EC2にプッシュすると、断続的に(10-80%時刻)表示しようとするURLのBad Request (400)のエラー(アプリ内またはDjango admin内)。

これに関するデバッグ情報はどこで入手できますか? _/var/log/Apache2/error.log_であっても、_LogLevel=info_には何も表示されません。バージョンを確認し、リクエスト環境を記録しました(cf. ModWSGI Debugging Tips )。大きな違いはありません。

残っていたのは、Python 2.7.1に対してビルドされたUbuntu 12.04のmod_wsgi(libapache2-mod-wsgi 3.3-4build1)を使用していることです。 Python 2.7.3があります。 Djangoは1.6で、Ubuntu Preciseバージョンよりも新しいです。クリーンアップするのは非常に難しく、これらはマイナーバージョンの変更のように見えるため、ソースからパッケージのビルドを開始することをheします.

ご協力ありがとうございます。

(参照用に、Apache configおよび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())
_
60
mrisher

次のように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ドキュメントに移動しました。

105
teewuane

確実に設定した場合ALOWED_HOSTS-ホスト名にアンダースコアが含まれていないことを確認してください。技術的に違法です。

さまざまな機能を印刷する必要がありましたが、この正規表現はDjango.http

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

実際、私のドメインにはアンダースコアが含まれていました。

これはソリューションではないですが、デバッグ目的の場合、settings.pyでALLOWED_HOSTS設定をこのように設定できます

ALLOWED_HOSTS = ['*']

それは間違いなく動作するはずです。そうでない場合、少なくとも問題はDjango指定されたURLへのアクセスを拒否していないことがわかります。

0
user3770635