Ошибка: readv() не удалось (104: соединение сброшено узлом) при чтении вверх по течению

У меня есть приложения facebook с флягой с nginx и uwsgi. Когда он получает POST от facebook, он всегда имеет ошибку:

readv() failed (104: Connection reset by peer) while reading upstream

Но когда я обращаюсь к своим приложениям напрямую (методом GET), все работает гладко. Что я наделал:

  1. Ограничить @app.route только методом POST - не работает.
  2. Добавить ограничение в wsgi: uwsgi_buffer_size (если запрос от facebook большой) и uwsgi_harakiri (если uwsgi предоставляет тайм-аут перед завершением запроса) - не работает.

У меня есть обходной путь в django, но пока не могу понять, как реализовать в колбе. Кто-нибудь может помочь, пожалуйста?


person asofyan    schedule 01.05.2012    source источник
comment
ответ немного смешной для меня. Я должен обработать все данные поста, даже если мой процесс ничего не делает. если ничего нет в request.form: проход. Это работает. Кстати, facebook открывает приложение с запросом POST, поэтому я должен добавить это для каждого маршрута. Должен быть лучший способ сделать это.   -  person asofyan    schedule 01.05.2012
comment
Если в сокете есть данные, вы должны их прочитать (других вариантов нет). В вики flask вы можете найти промежуточное ПО для обхода этой распространенной проблемы при настройке прокси: flask.pocoo.org /snippets/47 uWSGI может помочь вам с параметром --post-buffering, но это всего лишь ярлык, в нем нет ничего волшебного.   -  person roberto    schedule 23.06.2012
comment
Спасибо за фрагмент @roberto   -  person asofyan    schedule 07.11.2012


Ответы (2)


Это ошибка uwsgi. Вы можете узнать больше из [uWSGI] Несколько ошибок .

Простое решение состоит в том, что вы должны прочитать тело POST с помощью wsgi.input, даже если тело POST имеет значение null или вам не нужны параметры POST.

person Yang Juven    schedule 20.06.2012
comment
это не имеет ничего общего с uWSGI (и уж точно не ошибка). Закрытие сокета без чтения данных в нем является неправильным программным поведением. uWSGI может помочь вам (если вы не хотите менять свой код) автоматически буферизовать почтовые данные с помощью параметра --post-buffering. - person roberto; 23.06.2012
comment
@Roberto Спасибо. При добавлении опции постбуферизации в настройках uwsgi она работает. Но в некоторых случаях, например, у почтового запроса нет параметров, нет необходимости читать тело сообщения из wsgi.input. Так что я не думаю, что это ошибка программистов. - person Yang Juven; 29.06.2012

Проблема в том, что «восходящий поток» (фактический процесс, который проксирует nginx) закрывает соединение.

В моем случае Django — это мой веб-сервер, и мне нужно было увеличить DATA_UPLOAD_MAX_NUMBER_FIELDS, потому что в POST-запросе было слишком много полей.

person Collin Anderson    schedule 10.07.2017