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

Я использую радуги ThreadPool + 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 (восходящий сокет + местоположение @ proxy_pass)
  • I don't see anything in the other logs. I have checked:
    • rainbows log
    • журнал бригадира
    • журнал приложений
    • dmesg и /var/log/messages
  • Это происходит при загрузке файла размером ~> 1 МБ

person glebm    schedule 29.10.2012    source источник


Ответы (3)


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

person Maxim Dounin    schedule 31.10.2012
comment
Обычно в этом помогает dmesg или даже dmesg | grep oom -i. - person Reactormonk; 31.10.2012
comment
Я ничего не вижу в журналах. Я проверил: журнал радуги (нет записи запроса), журнал бригадира (ничего) и журнал приложений (нет записи запроса). - person glebm; 01.11.2012
comment
Я могу воспроизвести эту проблему в 100% случаев (всегда при загрузке более 1 МБ). - person glebm; 01.11.2012
comment
Да. Я проверил как dmesg, так и /var/log/messages. Есть ли что-нибудь еще, на что я мог бы посмотреть? - person glebm; 02.11.2012
comment
Или, может быть, есть способ заставить nginx отображать больше деталей об ошибках? - person glebm; 02.11.2012
comment
Включение отладки в nginx возможно, но вряд ли поможет, так как сообщение об ошибке уже содержит всю имеющуюся у него информацию: nginx пытался прочитать ответ от вышестоящего сервера, но операция чтения не удалась, так как подключение было сброшено вышестоящим сервером. Вместо этого вы можете попробовать включить отладку на своем бэкэнде (если это возможно) или использовать strace/ktrace, или просто настроить его с помощью printf() или чего-то подобного. - person Maxim Dounin; 02.11.2012
comment
Обновил тикет новым открытием (надо было сначала проверить). браузер получает слишком большой объект запроса 413 - person glebm; 03.11.2012
comment
Это говорит о том, что бэкэнд в порядке, но он отклоняет запрос из-за того, что он слишком велик. Вы должны посмотреть на серверную часть, чтобы узнать, как настроить размер тела запроса, который он готов принять. - person Maxim Dounin; 03.11.2012
comment
Бэкэнд — это радуги, у которых не должно быть никаких ограничений. Возможно ли, что мне нужно установить некоторые настройки сокета unix? - person glebm; 03.11.2012
comment
давайте продолжим это обсуждение в чате - person glebm; 03.11.2012
comment
У меня есть еще один вопрос. Как установить страницу ошибки для таких ошибок? - person glebm; 08.11.2012
comment
Директива proxy_intercept_errors должна помочь. - person Maxim Dounin; 08.11.2012

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

client_max_body_size 1M;

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

person jtblin    schedule 02.11.2012
comment
Теперь вы отредактировали свой ответ. Ранее это был вопрос, и его следует опубликовать как комментарий, а не как ответ. - person Janak Nirmal; 02.11.2012
comment
Да, он у меня установлен, но я использую строчные буквы m (установлено на 80 м). Может ли это быть проблемой? Попробую позже сегодня с заглавными буквами - person glebm; 02.11.2012

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

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

Rainbows! do
  # let nginx handle max body size
  client_max_body_size nil 
end
person glebm    schedule 03.11.2012