2012-05-01 2 views
8

У меня есть приложения для facebook с флягой с nginx и uwsgi. Когда он получит POST от Facebook, она всегда ошибка:Ошибка: readv() не удалось (104: Соединение сброшено сверстником) при чтении вверх по течению

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

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

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

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

+0

Ответ для меня нелепо. Мне нужно обработать все данные, даже если мой процесс ничего не делает. если «ничего» не в request.form: pass. Его работа ... Btw, facebook откройте приложение с запросом POST, поэтому я должен добавить это для каждого маршрута. Должен быть лучший способ сделать это. – asofyan

+0

Если есть данные в сокете, вы должны их прочитать (нет других вариантов). В викторине фляг вы можете найти промежуточное ПО, чтобы обойти эту общую проблему при прокси-настройке: http://flask.pocoo.org/snippets/47/ uWSGI может помочь вам с опцией -post-buffering, но это только ярлык, ничего волшебного в нем. – roberto

+0

Спасибо за фрагмент @roberto – asofyan

ответ

2

Это ошибка uwsgi. Вы можете получить больше от [uWSGI] Several bugs.

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

+0

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

+0

@roberto спасибо. Когда вы добавляете опцию post-buffering в настройках uwsgi, она работает. Но в некоторых случаях, например, post request не имеет параметров, нет необходимости читать тело сообщения из wsgi.input. Поэтому я не думаю, что это ошибка программистов. –

0

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

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