2012-10-25 1 views
7

uWSGI를 사용하여 NGINX에서 병 응용 프로그램을 호스팅하려고합니다.NGINX + uWSGI 피어 간 연결 재설정

여기 나의

location /myapp/ { 
     include uwsgi_params; 
     uwsgi_param X-Real-IP $remote_addr; 
     uwsgi_param Host $http_host; 
     uwsgi_param UWSGI_SCRIPT myapp; 
     uwsgi_pass 127.0.0.1:8080; 
    } 

nginx.conf 내가 POST 요청을 사용하고이

uwsgi --enable-threads --socket :8080 --plugin python -- wsgi-file ./myApp/myapp.py 

로 uwsgi 실행 해요입니다. 그 dev에 HTTP 클라이언트를 사용합니다. 내가

http://localhost/myapp 

uWSGI 서버가 요청 및 인쇄

[pid: 4683|app: 0|req: 1/1] 127.0.0.1() {50 vars in 806 bytes} [Thu Oct 25 12:29:36 2012] POST /myapp => generated 737 bytes in 11 msecs (HTTP/1.1 404) 2 headers in 87 bytes (1 switches on core 0) 

만의 nginx 오류 로그

2012/10/25 12:20:16 [error] 4364#0: *11 readv() failed (104: Connection reset by peer) while reading upstream, client: 127.0.0.1, server: localhost, request: "POST /myApp/myapp/ HTTP/1.1", upstream: "uwsgi://127.0.0.1:8080", host: "localhost" 

무엇을 할 수있는

를 수신 요청을 보낼 때 어떤 무한 간다?

답변

6

응용 프로그램에서 클라이언트의 데이터를 읽지 않고 클라이언트에서 게시 할 수 없습니다. 이것은 uWSGI에서는 문제가되지 않지만 nginx는 실패합니다. uWSGI의 --post-buffering 옵션을 사용하여 (사용 가능한 경우) 소켓에서 데이터를 자동으로 읽을 수 있지만, 버그를 고려하지 않아도 "수정"하는 것이 좋습니다. 앱

+0

나는 이미 시도해 보았습니다 - 포스트 버퍼링 32768. 여전히 작동하지 않습니다 –

+2

앱의 게시물 데이터를 사용합니까? – RickyA

1

스레드를 사용하지 마십시오!

필자는 uwsgi의 파이썬에서 Global Interpretator Lock과 동일한 문제를 겪고 있습니다. 스레드를 사용하지 않을 때 연결 재설정이 필요하지 않습니다.

[[email protected] uwsgi]# cat myproj_config.yaml 
uwsgi: 
    print: Myproject Configuration Started 
    socket: /var/tmp/myproject_uwsgi.sock 
    pythonpath: /sites/myproject/myproj 
    env: DJANGO_SETTINGS_MODULE=settings 
    module: wsgi 
    chdir: /sites/myproject/myproj 
    daemonize: /sites/myproject/log/uwsgi.log 
    max-requests: 4000 
    buffer-size: 32768 
    harakiri: 30 
    harakiri-verbose: true 
    reload-mercy: 8 
    vacuum: true 
    master: 1 
    post-buffering: 8192 
    processes: 4 
    no-orphans: 1 
    touch-reload: /sites/myproject/log/uwsgi 
    post-buffering: 8192 
5

당신은 파이썬 애플리케이션

def my_view(request): 

    # ensure to read the post data, even if you don't need it 
    # without this you get a: failed (104: Connection reset by peer) 
    data = request.DATA 

    return HttpResponse("Hello World") 
+1

이것은 nginx-uwsgi-django 구현에 대한 저의 문제를 확실히 해결했습니다. 스텁 뷰를 작성하고 처음에는 인바운드 XML을 신경 쓰지 않았습니다. 작은 인바운드 XML은 작동하지만 더 큰 인바운드 XML은 피어에 의해 재설정됩니다. 일단 'body = request.body'를보기에 추가하면 모든 크기의 게시물이 작동하기 시작합니다. – bskinnersf

+2

이것은 Django/UWSGI/Nginx 스택에서 나에게도 문제가되었다. 나는 이것이 사실이라는 것을 몰랐다. 이에 대한 문서/리소스가 있습니까? POST 데이터를 소비해야하는 이유는 무엇입니까?편집 : 세부 사항 (매우 모호하지만) 여기 : http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html –

3

에게있는 경우 응용 프로그램, 예를 들어

에 게시물 데이터를 소비해야합니다 uwsgi 설정의

예 (서버의 1Gb RAM) 이 문제는 uwsgi가 어느 시점에서 여전히 필요할지 여부를 알 수 없으므로 요청 본문이 사용되지 않을 때 발생합니다. 따라서 uwsgi는 데이터가 소비 될 때까지 또는 nginx가 연결을 재설정 할 때까지 데이터를 계속 유지합니다 (업스트림 시간 초과).

uwsgi의 저자는 그것을 설명 here : 그것은 필요하지 않은

08:21 < unbit> plaes: does your DELETE request (not-response) have a body ? 
08:40 < unbit> and do you read that body in your app ? 
08:41 < unbit> from the nginx logs it looks like it has a body and you are not reading it in the app 
08:43 < plaes> so DELETE request shouldn't have the body? 
08:43 < unbit> no i mean if a request has a body you have to read/consume it 
08:44 < unbit> otherwise the socket will be clobbered 

은 그래서를 위해 (몸을 보내 당신은 항상 하나 전체 요청 본문을 읽을 수 있는지 확인해야이 문제를 해결하거나하지 삭제 예).

+0

이것은 많은 도움이되었습니다! 고맙습니다! – vincent