Это похоже на хорошо известную проблему с тайм-аутами Nginx + uWSGI, но моя настройка отличается, и я не смог найти информацию об этом.
Я запускаю приложение Flask на uWSGI по протоколу http (не сокетам). Когда я запрашиваю свой API, я иногда получаю сообщение об ошибке:
uwsgi_response_write_body_do() TIMEOUT !!!
IOError: : write error
Чаще получаю в «рабочее время», т.е. не так часто ночью. Я запрашиваю длинные данные JSON (географические координаты, до 50 МБ), и иногда я вообще не получаю ответа, а иногда получаю часть ответа. Это ошибки Python requests
запрос:
requests.exceptions.ConnectionError: ('Connection aborted.', error(104, 'Connection reset by peer'))
requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
ValueError: Expecting object: line 1 column 5590371 (char 5590370)
ValueError: Unterminated string starting at: line 1 column 20998536 (char 20998535)
ValueError: end is out of bounds
# when I set `timeout=None` in Python
requests.exceptions.ReadTimeout: HTTPConnectionPool(host='mydomain.com', port=80): Read timed out. (read timeout=None)
Соединение осуществляется по обычному протоколу HTTP (без S). Моя конфигурация uWSGI ниже:
[uwsgi]
module = run:app
pidfile = /tmp/app.pid
logto = /var/log/uwsgi/%n.log
master = true
processes = 2
http-socket = 0.0.0.0:someport
http-timeout = 300
die-on-term = true
И я запускаю это, используя uwsgi /path/to/inifile
. Нет Nginx, но на самом деле раньше, с Nginx, я получал те же проблемы. Так что я исключил это.
Как я могу избежать этих тайм-аутов?
Я также использую nginx + uwsgi для создания большого файла и сталкиваюсь с той же проблемой. Я решил эту проблему, отключив буфер временного файла uwsgi в директиве nginx use uwsgi_max_temp_file_size 0;
.
Я думаю, что скорость передачи от nginx к клиенту намного ниже скорости от uwsgi к nginx. Буфер nginx заполнен, поэтому uwsgi ждет много времени, прежде чем появится место для nginx для приема новых данных, и это приведет к тайм-ауту запроса записи uwsgi.
Я публикую блог, чтобы проанализировать эту проблему в своем блоге.