У меня есть приложение 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
работника? Спасибо!