nginx загружает проблему client_max_body_size - PullRequest
113 голосов
/ 09 февраля 2011

Я использую nginx / ruby-on-rails и у меня есть простая многокомпонентная форма для загрузки файлов.Все работает нормально, пока я не решу ограничить максимальный размер загружаемых файлов.Для этого я устанавливаю nginx client_max_body_size на 1 м (1 МБ) и ожидаю, что HTTP 413 (запрос слишком большой) в ответ, когда это правило нарушается.

Проблема в том, что когда я загружаю файл размером 1,2 МБ, вместо отображения страницы ошибки HTTP 413, браузер немного зависает, а затем умирает с сообщением «Соединение было сброшено во время загрузки страницы»message.

Я пробовал почти все варианты, которые предлагает nginx, похоже, ничего не работает.У кого-нибудь есть идеи по этому поводу?

Вот мой nginx.conf:

worker_processes  1;
timer_resolution  1000ms;
events {
    worker_connections  1024;
}

http {
    passenger_root /the_passenger_root;
    passenger_ruby /the_ruby;

    include       mime.types;
    default_type  application/octet-stream;

    sendfile           on;
    keepalive_timeout  65;

    server {
      listen 80;
      server_name www.x.com;
      client_max_body_size 1M;
      passenger_use_global_queue on;
      root /the_root;
      passenger_enabled on;

      error_page 404 /404.html;
      error_page 413 /413.html;    
    }    
}

Спасибо.


**Edit**

Среда / UA: Windows XP / Firefox 3.6.13

Ответы [ 3 ]

123 голосов
/ 17 ноября 2012

nginx «быстро завершается с ошибкой», когда клиент сообщает ему, что собирается отправить тело больше, чем client_max_body_size, отправив ответ 413 и закрыв соединение.все тело запроса отправлено.Поскольку nginx закрывает соединение, клиент отправляет данные в закрытый сокет, вызывая TCP RST.

Если ваш HTTP-клиент поддерживает это, лучший способ справиться с этим - отправить заголовок Expect: 100-Continue.Начиная с версии 1.2.7 Nginx поддерживает это правильно и будет отвечать 413 Request Entity Too Large, а не 100 Continue, если Content-Length превышает максимальный размер тела.

48 голосов
/ 23 января 2013

Ваша загрузка умерла в самом конце?99% до сбоя?Тело клиента и буферы являются ключевыми, потому что nginx должен буферизовать входящие данные.Конфигурации тела (данные тела запроса) определяют, как nginx обрабатывает массовый поток двоичных данных от клиентов, состоящих из нескольких частей, в логику вашего приложения.

Параметр clean освобождает ограничения памяти и потребления науказание nginx сохранить входящий буфер в файле, а затем удалить его с диска, удалив его.

Установите body_in_file_only на clean и настройте буферы для client_max_body_size.В исходном конфиге вопроса уже был указан sendfile, также увеличьте время ожидания.Я использую настройки ниже, чтобы исправить это, в зависимости от вашей локальной конфигурации, сервера и http-контекста.

client_body_in_file_only clean;
client_body_buffer_size 32K;

client_max_body_size 300M;

sendfile on;
send_timeout 300s;
7 голосов
/ 09 февраля 2011

С документация :

Необходимо помнить, что браузеры не знают, как правильно отображать эту ошибку.

Я подозреваю, что это то, что происходит, если вы проверяете HTTP туда-сюда с помощью таких инструментов, как Firebug или Live HTTP Headers (оба расширения Firefox), вы будете возможность увидеть, что на самом деле происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...