Прерывистая ошибка 502 на nginx + докер + gunicorn + колба - PullRequest
0 голосов
/ 05 июля 2019

У меня есть приложение Flask, которое работает внутри Docker. Внутри контейнера я запускаю сервер Gunicorn с 2 eventlet работниками. В качестве обратного прокси-сервера я использую nginx, который подключается к серверу gunicorn внутри контейнера.

При нагрузочном тестировании я заметил около 502 ошибок, выдаваемых сервером. Когда я посмотрел на /var/log/nginx/error.log, я увидел следующий результат:

2019/07/05 15:16:23 [error] 4233#0: *2569 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 6.6.6.6, server: , request: "POST /api/action HTTP/1.1", upstream: "http://6.6.0.6:5000/api/action", host: "api.abcweb.com"

Дополнительные наблюдения:

  • Когда я отправляю 8-10 запросов в секунду, первая ошибка 502 выдается, когда было сделано 800-900 запросов.
  • Когда я отправляю 20+ запросов в секунду, я вижу первую ошибку 502 после того, как было сделано около 100-200 запросов.

Однако , когда я убираю огнестрельное оружие из смеси. То есть Запустите сервер с python3 app.py из контейнера вместо запуска через Gunicorn. Я перестаю получать 502 ошибки даже при 40+ запросах в секунду. Так что проблема, скорее всего, связана с Gunicorn.

Кто-нибудь может подсказать мне, что может быть причиной частых ошибок 502, особенно при использовании Gunicorn под нагрузкой? Действительно ли мне нужно использовать gunicorn, когда у меня работает nginx ( Я полагал, что мое приложение получит выгоду от асинхронных рабочих )? Любая помощь по этому вопросу будет принята с благодарностью. Спасибо!

PS .: Я не вижу этих 502 запросов в журналах Gunicorn внутри контейнера.

ОБНОВЛЕНИЕ: проблема решается путем изменения типа работника на gthread, но я хотел бы использовать асинхронный работник, и gevent не очень хорошо работает с некоторыми библиотеками, которые я использую, поэтому я использовал eventlet. Как я могу решить эту проблему с помощью eventlet работника? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...