Heroku sock = запрос внутреннего сервера прерван для приложения Flask SocketIO

У меня есть приложение flask-socketio, размещенное на heroku со следующим файлом Procfile:

web: gunicorn --worker-class eventlet hello:app

С тех пор, как я перешел на socketio, приложение ведет себя непоследовательно. Раньше приложение запускалось какое-то время, а затем истекал тайм-аут POST-запросов.

Со вчерашней ночи я получаю сообщение об ошибке

sock=backend at=error code=H18 desc="Server Request Interrupted" method=GET path="/static/js/third-party/browser.js" host=deard.herokuapp.com request_id=725da6af-aa29-4293-a411-2c89977f1d4d fwd="216.165.95.0" dyno=web.1 connect=1ms service=36ms status=503 bytes=13811

Я прочитал описание кода ошибки heroku, в котором говорится: «Внутренний сокет, принадлежащий веб-процессу вашего приложения, был закрыт до того, как серверная часть вернула HTTP-ответ».

Но я понятия не имею, почему это могло происходить.

Любая подсказка относительно того, на что мне следует обратить внимание, поможет мне отладить это.

Я мог бы поделиться кодом, но в нем 300 строк, и, поскольку я не знаю, откуда возникла ошибка, я не уверен, что это будет полезно.


person Denny George    schedule 10.01.2016    source источник
comment
у вас есть такая же проблема (или любая другая) при локальном запуске приложения? (с пулеметом)   -  person wgwz    schedule 11.01.2016
comment
Нет, он отлично работает локально с Gunicorn.   -  person Denny George    schedule 11.01.2016
comment
Вы можете попробовать изменить тег рабочего класса procfile как: --worker-class socketio.sgunicorn.GeventSocketIOWorker. Я следую этому здесь.   -  person wgwz    schedule 11.01.2016
comment
Я прочитал ваш блог, прежде чем использовать eventlet, поэтому я бы не стал переходить на gevent. Я попытался установить gevent, но изменение Procfile и gunicorn не запускалось. все еще выясняя, что не так.   -  person Denny George    schedule 11.01.2016
comment
@wgwz Нет, ваш совет к этому не относится. Класс GeventSocketIOWorker используется, когда вы используете gevent-socketio. Но Flask-SocketIO не использует этот пакет.   -  person Miguel    schedule 11.01.2016
comment
@DennyGeorge есть ли другие ошибки в вашем журнале heroku? Вы также можете запустить SocketIO с включенным ведением журнала. Для этого добавьте logger=True, engineio_logger=True в ваш SocketIO конструктор.   -  person Miguel    schedule 11.01.2016
comment
@Miguel Я преодолел эту проблему, добавив -no-sendfile в свой Procfile, после чего я начал получать ошибку, из-за которой мое соединение с веб-сокетом продолжало отключаться, что я позже узнал (читая что-то, что вы написали), что было вызвано gunicorn 19.x . Вчера вечером я перешел на Gunicorn 18.0, и все работало нормально. Теперь, начиная с этого утра, я получаю ту же ошибку «Прерван запрос сервера». Я попытался добавить предложенный вами код в конструктор. Не думаю, что есть новая ошибка. Я вставил журнал сюда - gist.github.com/dennyabrain/cc7fd78d51cf184d6572   -  person Denny George    schedule 12.01.2016
comment
То все еще только логирование героку, от Flask-SocketIO ничего нет.   -  person Miguel    schedule 12.01.2016
comment
@Miguel, я добавил то, о чем вы меня просили, в конструктор socketio. Знаете ли вы, нужно ли мне делать что-то еще, чтобы он попал в журналы heroku?   -  person Denny George    schedule 12.01.2016
comment
@DennyGeorge до тех пор, пока вы видите результат в своей консоли при локальном запуске (например, при использовании бригадира на босса), heroku должен забрать журналы и включить их в свои собственные журналы.   -  person Miguel    schedule 12.01.2016
comment
@miguel, извини. Я думаю, что использовал старый код на героку. Теперь журналы выглядят так: gist.github.com/dennyabrain/2ec31f551e3b6b087ccf Я новичок в websockets, и поэтому я мог бы быть здесь далеко, но возможно ли, что это происходит, потому что в журналах я вижу, что мое приложение прослушивает порт 45173, и я помню, как читал, что библиотека socketio будет читать через порт 80. Может ли это быть причиной?   -  person Denny George    schedule 12.01.2016
comment
а также я получаю ПОЛУЧИТЬ deard.herokuapp.com/static Ошибка /js/third-party/react.min.js net :: ERR_CONTENT_LENGTH_MISMATCH во внешнем интерфейсе (консоль Chrome)   -  person Denny George    schedule 12.01.2016
comment
У меня такая же проблема с приложением Heroku, использующим Flask-SockteIO. В консоли Chrome я вижу net :: ERR_CONTENT_LENGTH_MISMATCH, а в журналах сервера я вижу код ошибки H18 во время того, что выглядит как запрос на большой ресурс JavaScript.   -  person JWS    schedule 07.02.2017
comment
@DennyGeorge - ›Ребята, вы когда-нибудь решали эту проблему?   -  person Jesse G    schedule 05.02.2021
comment
@JWS - ›Ребята, вы когда-нибудь решали эту проблему?   -  person Jesse G    schedule 05.02.2021


Ответы (2)


Такая «ошибка потока сокета» возникает во Flask, когда вы отменяете или повторно отправляете тот же запрос, когда на стороне сервера (колба) вы все еще выполняете вычисления, чтобы отобразить макет, соответствующий начальному запросу.

Таким образом, это может быть связано с тайм-аутом или обработкой сетевых ошибок на обеих сторонах (сервер / клиент).

Какой-то вопрос :

Как долго выполняется вычисление запроса на стороне сервера? Как вы обрабатываете исключение сетевой ошибки на стороне сервера и клиента? Есть ли тайм-аут на стороне фляги или клиента?

Также возможно, что новый запрос будет отправлен до того, как закончится предыдущий.

Пожалуйста, поделитесь кодом, относящимся к обработке запроса.

person A STEFANI    schedule 09.02.2017

Это сработало для меня:

from waitress import serve
# app.run(host='0.0.0.0', port=port) # <---- REMOVE THIS
# serve your flask app with waitress, instead of running it directly.
serve(app, host='0.0.0.0', port=port) # <---- ADD THIS

person yaya    schedule 22.07.2020