2012-10-25 17 views
7

Próbuję hostować Aplikację butelki na NGINX przy użyciu interfejsu usWSGI.NGINX + uWSGI Resetowanie połączenia przez Peer

Oto mój nginx.conf

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; 
    } 

biegnę uwsgi jak ten

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

Używam POST Request. Do tego przy pomocy klienta dev Http. Wykraczającym nieskończony kiedy wysłać żądanie

http://localhost/myapp 

serwer uWSGI odbiera żądanie i wydruki

[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) 

ale w dzienniku błędów 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" 

Co robić?

Odpowiedz

6

Nie można publikować danych od klienta bez czytania go w aplikacji. podczas gdy nie stanowi to problemu w usłudze uWSGI, nginx zawiedzie. Możesz to "sfałszować" używając opcji --post-buffering z uWSGI, aby automatycznie odczytywać dane z gniazda (jeśli są dostępne), ale lepiej "napraw" (nawet jeśli nie uważam tego za błąd) app

+0

Próbowałem już -post-buffering 32768. Nadal nie działa –

+2

czy zużywasz dane posta w swojej aplikacji? – RickyA

1

Nie używaj nici!

Mam ten sam problem z Global Interpretator Lock w Pythonie pod uwsgi. Kiedy nie używam wątków - nie resetuje połączenia.

Przykład uwsgi config (1GB RAM na serwerze)

[[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

upewnić spożywać swoich danych post w aplikacji

na przykład, jeśli masz aplikację Python

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

To ostatecznie rozwiązało problem dla mnie w implementacji nginx-uwsgi-django. Budowałem widok kodu pośredniczącego i początkowo nie dbałem o przychodzący xml. Mały xml przychodzący działałby, ale większe byłyby resetowane przez peer. Kiedy dodałem do widoku 'body = request.body', zaczęły działać posty o dowolnym rozmiarze. – bskinnersf

+2

To był również problem dla mnie na stosie Django/UWSGI/Nginx. Nie wiedziałem, że to jest rzecz. Czy jest w tym dokumentacja/zasoby? Dlaczego muszę spożywać dane POST?Edycja: Niektóre szczegóły (choć bardzo niejasne) tutaj: http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html –

3

Ten problem występuje, gdy treść żądania nie jest zużywana, ponieważ uwsgi nie może wiedzieć, czy będzie ono nadal potrzebne w pewnym momencie. Tak więc uwsgi będzie przechowywać dane aż do ich zużycia lub do momentu, gdy nginx zresetuje połączenie (ponieważ upłynął limit czasu wyprzedzenia).

Autor uwsgi Wyjaśnia 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 

Więc to naprawić trzeba upewnić się zawsze albo czytać całe ciało zapytanie, czy nie wysłać ciało, jeśli nie jest to konieczne (dla DELETE np.).

+0

To bardzo pomogło! Dziękuję Ci! – vincent

Powiązane problemy