Рейтинг:1

uWSGI прерывает ответы, теряет соединение с nginx

флаг gb

Я запускаю небольшое веб-приложение, написанное на Python, работающее в uWSGI и обслуживаемое через nginx. Есть компонент, который создает ZIP-файлы для загрузки, которые иногда могут быть довольно большими (несколько ГБ). Часто бывает так, что связь между nginx и uWSGI обрывается и запрос прерывается; nginx игнорирует усеченный ответ, пока браузер работает по тайм-ауту, потому что он держит соединение открытым, ожидая дополнительных данных ответа. Приложение генерирует правильный заголовок Content-Length.

Из журнала uWSGI:

uwsgi_response_write_body_do(): Сломан канал [core/writer.c строка 429] во время GET [...]
OSError: ошибка записи
SIGPIPE: запись в закрытый pipe/socket/fd (возможно клиент отключился) по запросу [...] !!!

я уже поставил время ожидания сокета, тайм-аут отправки сокета и время ожидания записи сокета к 180 в конфигурации uWSGI, безрезультатно. Конфигурация nginx включает uwsgi_read_timeout 180 с; и uwsgi_buffering выключен;

Эффект в основном воспроизводим, поскольку он происходит большую часть времени, особенно при больших откликах, но никогда с одинаковым смещением. Повторение запроса снова и снова может в конечном итоге привести к завершению.

Michael Hampton avatar
флаг cz
Это больше похоже на проблему дизайна приложения. Веб-запросы на самом деле не предназначены для ожидания ответа в течение нескольких минут. Вам следует запустить фоновое задание для создания ZIP-файла, а затем предоставить пользователю URL-адрес, по которому он может проверить его статус или забрать файл, когда он будет завершен.
Felix avatar
флаг gb
@MichaelHampton Файл создается на лету. Задержка ответа обычно составляет менее 10 секунд, но доставка тела ответа требует времени. Соединение разрывается, когда ответ уже отправляется клиенту. Пользовательский агент сообщает о ходе загрузки иногда на 20%, иногда на 80%, что сильно варьируется, затем данные перестают передаваться, и в какой-то момент пользовательский агент сообщает о тайм-ауте при загрузке.
Michael Hampton avatar
флаг cz
Хм. Вы должны проверить журнал ошибок nginx.
Felix avatar
флаг gb
В журнале ошибок nginx ничего нет; журнал доступа сообщает только о запросах с усеченной длиной, игнорируя тот факт, что Content-Length предполагает, что соединение было преждевременно прервано.
Michael Hampton avatar
флаг cz
Итак, вот интересный вопрос. Как вы можете узнать длину сжатого файла до того, как вы его сжали?
Felix avatar
флаг gb
Я не сжимаю файлы, так как они обычно уже сжаты (в основном файлы JPEG), поэтому DEFLATE все равно не займет много места. Файлы хранятся без сжатия. Я получаю список файлов для отправки и, исходя из размеров их файлов, рассчитываю, насколько большим будет zip-файл. Об этом сообщается как Content-Length, после чего ZIP-файл создается при отправке клиенту. Я много раз проверял это, и вычисление длины не проблема.
Рейтинг:0
флаг gb

Оказалось, что проблема была не в моем приложении и не в nginx, а в неисправном фильтре пакетов перед ними обоими.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.