2014-06-12 5 views
6

개발 한 블로그를 배포하려고 할 때 400 오류가 발생하면 django 개발 - 서버를 사용하여 새로운 테스트 프로젝트를 시작했습니다. (startproject를 사용하고 아무것도하지 않았습니다. 작은 설정을 여기 저기에) 가능한 한 간단하게 유지하기 위해 가능한 한 최소화하십시오.Django uWSGI NGINX Bad Request 400

내가 "manage.py runserver"할 때 내 설정에서 "DEBUG = True"를 가지고 있기 때문에 내가 이것을 볼 수 있다고 말하는 페이지를 보여줍니다.

지금까지 그렇게 좋았습니다. 오류 없음.

그러나 uWSGI 및 NGINX를 사용하면 "잘못된 요청 (400)"페이지가 다시 나타납니다.

처음에는 가져 오기 오류가 있었는데 sys.path에 몇 가지 경로를 추가해야했습니다. 하지만 파이썬, NGINX 또는 uWSGI에서 오류가 발생하지 않고 400 오류 페이지로 끝납니다.

나는 다음 시도했다 : 이

  • ALLOWED_HOSTS = [ '*']
  • ALLOWED_HOSTS = '이 *'
  • 이 주석
  • = 거짓

    • DEBUG = 거짓
    • TEMPLATE_DEBUG을 'django.middleware.clickjacking.XFrameOptionsMiddleware'from MIDDLEWARE_CLASSES
    • mod_wsgi가있는 Apache 대신 uWSGI와 함께 NGINX를 사용합니다. 나는 그것을 좋아하기 때문에 시간이 설정은,하지만 그건 내 문제를) 해결할 수 없습니다

    내 설정 : uWSGI, Nginx에 내 노트북에서 (쿠분투 14.04에서 클라이언트 (파이어 폭스) 실행). 호스트 파일 (cefk_blawg.localhost 127.0.0.1)에 있고 NGINX에서 올바르게 구성된 Vhost/하위 도메인 (cefk_blawg.localhost) (필자가 피라미드 테스트 프로젝트를 사용할 때 실제로 작동합니다. 매력). 도중에 방화벽이 없습니다. virtualenv를 사용하고 pipen-all을 설치했습니다 (django/uwsgi/pillow/mysql-python).

    내 uwsgi.ini :

    [uwsgi] 
    
    # Unix socket (full path) 
    socket = /tmp/cefk_blawg.sock 
    
    # Set socket permissions 
    chmod-socket = 666 
    
    # Master process 
    master = true 
    
    # Maximum number of worker processes 
    processes = 4 
    
    # Set timeout 
    harakiri = 60 
    harakiri-verbose = true 
    
    # Limit post-size 
    limit-post = 65536 
    
    # When to start buffering for post-vars 
    post-buffering = 1  ## none of these makes my problem go away 
    #post-buffering = 8192 ## none of these makes my problem go away 
    #post-buffering = 32768 ## none of these makes my problem go away 
    
    # Daemonize 
    daemonize = /home/cefk/Dokumente/cefk_blawg/uwsgi.log 
    pidfile = /home/cefk/Dokumente/cefk_blawg/uwsgi.pid 
    
    # Limit queue 
    listen = 64 
    max-requests = 1000 
    
    # Whatever this does .. it works for pyramid (got it from a tutorial) 
    reload-on-as = 128 
    reload-on-rss = 96 
    
    no-orphans = true 
    log-slow = true 
    
    # This is the full path to my virtualenv 
    virtualenv = /home/cefk/Dokumente/cefk_blawg/venv 
    
    # Django wsgi file 
    wsgi-file = /home/cefk/Dokumente/cefk_blawg/cefk_info/cefk_info/wsgi.py 
    
    # Settings file (this seems to do nothing) 
    # And it gets set in the wsgi.py-file 
    env = DJANGO_SETTINGS_MODULE=cefk_info.settings 
    
    # Set domain (this seems to do nothing) 
    #domain = cefk_blawg.localhost 
    
    # Django-project base directory (this seems to do nothing) 
    #chdir = /home/cefk/Dokumente/cefk_blawg/cefk_info 
    
    # This seems to do nothing 
    #pythonpath=/home/cefk/Dokumente/cefk_blawg/cefk_info/cefk_info/ 
    
    # Set vhost (this seems to do nothing) 
    #vhost = true 
    
    # Clean up environment on exit 
    vacuum = true 
    
    #

    내 wsgi.py 파일 : 이것은 wsgi.py에 LoggingMiddleware에서 얻을 내 요청/응답을한다

    import os 
    import pprint 
    import site 
    import sys 
    from django.core.wsgi import get_wsgi_application 
    
    base_parent = '/home/cefk/Dokumente/cefk_blawg/' 
    base = '/home/cefk/Dokumente/cefk_blawg/cefk_info/' 
    
    sys.path.append(base_parent) 
    sys.path.append(base) 
    
    site.addsitedir(
        '/home/cefk/Dokumente/cefk_blawg/venv/local/lib/python2.7/site-packages' 
    ) 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cefk_info.settings") 
    
    activate_env = '/home/cefk/Dokumente/cefk_blawg/venv/bin/activate_this.py' 
    execfile(activate_env, dict(__file__=activate_env)) 
    
    # I stole this shamelessly from another stackoverflow-post - this is good to have 
    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(get_wsgi_application()) 
    

    :

    (
        'REQUEST', 
        { 
         'CONTENT_LENGTH': '', 
         'CONTENT_TYPE': '', 
         'DOCUMENT_ROOT': '/home/cefk/Dokumente/cefk_blawg/cefk_info/cefk_info', 
         'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
         'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 
         'HTTP_ACCEPT_LANGUAGE': 'de,en-US;q=0.7,en;q=0.3', 
         'HTTP_CACHE_CONTROL': 'max-age=0', 
         'HTTP_CONNECTION': 'keep-alive', 
         'HTTP_DNT': '1', 
         'HTTP_HOST': 'cefk_blawg.localhost', 
         'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0', 
         'PATH_INFO': '/', 
         'QUERY_STRING': '', 
         'REMOTE_ADDR': '127.0.0.1', 
         'REMOTE_PORT': '42518', 
         'REQUEST_METHOD': 'GET', 
         'REQUEST_URI': '/', 
         'SERVER_NAME': 'cefk_blawg.localhost', 
         'SERVER_PORT': '80', 
         'SERVER_PROTOCOL': 'HTTP/1.1', 
         'UWSGI_SCHEME': 'http', 
         'uwsgi.node': 'lt', 
         'uwsgi.version': '2.0.5.1', 
         'wsgi.errors': <open file 'wsgi_errors', mode 'w' at 0x7ff4337110c0>, 
         'wsgi.file_wrapper': <built-in function uwsgi_sendfile>, 
         'wsgi.input': <uwsgi._Input object at 0x7ff437271e70>, 
         'wsgi.multiprocess': True, 
         'wsgi.multithread': False, 
         'wsgi.run_once': False, 
         'wsgi.url_scheme': 'http', 
         'wsgi.version': (1, 0) 
        } 
    ) 
    ('RESPONSE', '400 BAD REQUEST', [('Content-Type', 'text/html')]) 
    [pid: 2652|app: 0|req: 1/1] 127.0.0.1() {42 vars in 675 bytes} [Thu Jun 12 17:16:59 2014] GET/=> generated 26 bytes in 150 msecs (HTTP/1.1 400) 1 headers in 53 bytes (1 switches on core 0) 
    

    편집 : 이것은 내 (폴더 이름은 그 동안 변경되었을 수 있음을 통지 - 그래서, 제발 무시)의 nginx-설정 :

    # Server configuration 
    server { 
        # Make site accessible from http://cefk_blawg.localhost/ 
        server_name cefk_blawg.localhost; 
    
        root /home/cefk/Dokumente/cefk_blawg_django; 
    
        # Set charset 
        charset utf-8; 
        client_max_body_size 100M; 
    
        location /static { 
         autoindex on; 
         alias /home/cefk/Dokumente/cefk_blawg_django/static; 
        } 
    
        location /media { 
         autoindex on; 
         alias /home/cefk/Dokumente/cefk_blawg_django/media; 
        } 
    
        ################################ 
        # Port-based (old)    # 
        ################################ 
        #location/{ 
        # try_files $uri @application; 
        #} 
    
        #location @application { 
        # include /etc/nginx/uwsgi_params; 
        # uwsgi_pass 127.0.0.1:8000; 
        #} 
        ################################ 
        # /Port-based (old)   # 
        ################################ 
    
        location/{ 
         include /etc/nginx/uwsgi_params; 
         uwsgi_pass unix:///tmp/cefk_blawg.sock; 
        } 
    } 
    

    /편집 내가 아이디어 나갈거야

    .

    도와주세요.

    +1

    오류는 일반적으로 잘못된 ALLOWED_HOSTS을 나타냅니다. 시도를 변경 한 후에 uWSGI를 다시 시작 했습니까? 그리고 uWSGI에 대한 블로그 게시물에서 복사 및 붙여 넣기를 피하고 공식 문서에보고 된대로 최소한의 옵션을 사용하고 환경에 특별히 필요한 사항을 추가하십시오 (예 : 96megs의 rss가 장고 인스턴스를 지속적으로 다시로드 할 수 있음) – roberto

    +0

    예, 나는 매번 재 장전했다. 심지어 nginx를 재시작했습니다. 내가 시도한 첫 번째 일은 ALLOWED_HOSTS를 모든 값으로 변경하는 것이 었습니다. 즉, 감각을 만들 수있는 원격 기회가있었습니다 (localhost/.localhost/my.domain/.my.domain/*를 list/*로 사용). 나는 ALLOWED_HOSTS = '*'와 붙어있다. 또한 처음에는 uwsgi.ini를 사용하지 않았으며 명령 줄에서 호출 할 때만 매개 변수를 제공했습니다. 그 후, 나는 장고 - 문서들 중 하나를 사용했고 .. 그럴듯하고 필요한 모든 것을 찾을 수 있었다. –

    +0

    최근에 django + uwsgi + nginx를 사용하는 사람이 있습니까? 그것은 버그일까요? –

    답변

    1

    좋아요.이 같은 오류가 발생했지만 마침내 알아 냈습니다. (적어도 나에게는). 이 일을 하루 낭비했기 때문에 나는이 일을 하나님 께기도합니다.

    당신이 나를 좋아한다면 : http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html을 기본 설정을 얻는 자습서로 사용하십시오. http를 통해 작동하는 uwsgi가 있고 그것은 TCP 소켓을 통해 작동하는 것 같았다. nginx를 연결하려고하자마자 400 개의 오류가 계속 발생했습니다. 구체적으로 파일 이름을 my_site.conf로 만들고 해당 사이트를 사이트에 연결할 수 있다고 말합니다. 네가 사이트를 체크하면 네가 default라는 파일을 보게 될 것이다. 이 파일의 이름은 default.conf가 아닙니다. my_site.conf의 이름을 my_site로 바꾸고 다시 연결하십시오.

    TDLR : my_site.conf의 링크를 해제하십시오. my_site.conf의 이름을 my_site로 바꿉니다. 웹 사이트에 my_site 연결

    +0

    죄송합니다.이 점을 잊어 버렸지 만 이미 완료했습니다. 그동안 나는 전체 프로젝트를 다시 작성했습니다 (피라미드 + uwsgi 사용). 매혹적인 것은 사소한 변경 사항 (경로, 디렉토리 이름 및 이와 유사한 항목)이있는 동일한 uwsgi-config가 완벽하게 피라미드와 함께 작동한다는 것입니다. –

    +0

    나는 먼저이 튜토리얼을 사용했다. 그 다음에는 https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/uwsgi/ http : // uwsgi-docs에서 찾을 수있다. readthedocs.org/en/latest/tutorials/Django_and_nginx.html 그래서 나는 물건들을 함께 섞어 버리는 것을 끝내었다. 이것에 대한 몇 주간의 좌절 끝에 나는 방금 포기했다. –

    +0

    나는 최근 Django 1.8을 시험해 보았다. 내 프로젝트가 끝나면 자습서를 작성하고 여기에 대한 링크를 게시 할 것입니다. –

    7

    DEBUG = True을 서버에 설정하고 uwsgi 서비스를 다시 시작하고 브라우저에서 django의 디버그 출력을 확인하십시오. django의 개발 서버에서 오류가 표시되지 않는다고해서 오류가 nginx 또는 uwsgi 서비스와 관련이 있음을 의미하지는 않습니다.

    +0

    답변 해 주셔서 감사합니다.나는 실제로 2 년 전에 그 질문을했다. 그래서 장고는 더 이상 존재하지 않는다. 하지만 현재 버전에서 작동하도록했습니다. 나는 아직도 모르겠다. 무엇이 잘못 되었는가. 하지만 요즘에는 효과가 있기 때문에 2 년 전에 무엇이 잘못되었는지 신경 쓰지 않습니다. –

    관련 문제