NGINX + UWSGI Сброс соединения по пиру

Я пытаюсь разместить приложение Bottle на NGINX, используя uWSGI.

Вот мой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;
    }

Я бегу UWSGI, как это

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

Я использую POST запрос. Для этого используется Dev Http Client. Который бесконечен, когда я отправляю запрос

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"

Что делать?

Ответы на вопрос(4)

Не использовать темы!

У меня такая же проблема с Global Interpretator Lock в Python под UWSGI. Когда я не использую темы - не сброс соединения.

Пример конфигурации uwsgi (1 Гб ОЗУ на сервере)

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

не читая их в своем приложении. хотя это не проблема в uWSGI, nginx завершится ошибкой. Вы можете «подделать» эту вещь, используя опцию --post-buffering uWSGI для автоматического чтения данных из сокета (если доступно), но вам лучше «исправить» (даже если я не считаю это ошибкой) ваш приложение

 RickyA14 нояб. 2012 г., 14:39
вы используете данные поста в вашем приложении?
 Kartik Rokde25 окт. 2012 г., 09:49
Я уже пробовал - post-buffering 32768. Все еще не работает

когда тело запроса не используется, так как uwsgi не может знать, будет ли он все еще необходим в какой-то момент. Таким образом, uwsgi будет продолжать удерживать данные либо до тех пор, пока они не будут использованы, либо до тех пор, пока nginx не сбросит соединение (поскольку истекло время ожидания восходящего потока).

Автор uwsgi объясняет этоВот:

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

Таким образом, чтобы исправить это, вы должны всегда либо читать все тело запроса, либо не отправлять тело, если в этом нет необходимости (например, для УДАЛЕНИЯ).

 vincent09 мар. 2017 г., 04:47
Это очень помогло! Спасибо!

например, если у вас есть приложение Django / 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")
 bskinnersf31 июл. 2015 г., 17:16
Это окончательно решило проблему для меня в реализации nginx-uwsgi-django. Я строил представление заглушки и изначально не заботился о входящем xml. Небольшой входящий xml будет работать, но большие получат сброс по пиру. Как только я добавилbody = request.body к мнению, посты любого размера начали работать.
 Jamie Counsell22 февр. 2016 г., 18:41
Это было также проблемой для меня в стеке Django / UWSGI / Nginx. Я не знал, что это вещь. Есть ли какая-либо документация / ресурсы по этому вопросу? Почему я должен использовать данные POST? Изменить: Некоторые детали (хотя и очень расплывчатые) здесь:uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html

Ваш ответ на вопрос