104: Сброс соединения по пиру: nginx + радуга + загрузка более 1 мб

Я использую ThreadPool rainbows + nginx (сокет unix)

При загрузке больших файлов я получаю следующее в журнале ошибок nginx (ничего в журнале приложений):

readv() failed (104: Connection reset by peer) while reading upstream

Браузер получает ответ:

413 Request Entity Too Large

Почему это происходит?

  • "client_max_body_size 80M;" устанавливается как на http, так и на уровне сервера (на всякий случай) в nginx
  • nginx общается с радугами через сокет unix (восходящий сокет + location @ proxy_pass)
  • Я не вижу ничего в других журналах. Я проверил:
    • журнал радуги
    • журнал бригадира
    • журнал приложений
    • dmesg и /var/log/messages
  • Это происходит при загрузке файла размером ~> 1 МБ

3 ответа

Решение

Оказывается, у Rainbows была опция конфигурации под названием client_max_body_size по умолчанию 1 МБ. Опция описана здесь

Если эта опция включена, Rainbows будет 413 на большие запросы молча. Вы можете не знать, что он ломается, если не запускаете что-то перед ним.

Rainbows! do
  # let nginx handle max body size
  client_max_body_size nil 
end

ECONNRESET Ошибка (сброс соединения по одноранговой сети) означает, что соединение было нечисто закрыто бэкэнд-приложением. Это обычно происходит, если внутреннее приложение умирает, например, из-за ошибки сегментации, или уничтожается убийцей OOM. Чтобы выяснить точную причину, вы должны проверить свои журналы бэкэнда (если есть) и / или системные журналы.

Может быть, у вас есть client_max_body_size установить в свой nginx.conf который ограничивает размер тела до 1 Мб, например

client_max_body_size 1M;

В этом случае вам необходимо удалить его, чтобы разрешить загрузку файлов размером более 1 млн.

Другие вопросы по тегам