Подтвердить что ты не робот

Nginx загрузить client_max_body_size

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

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

Я пробовал практически все варианты, что 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

4b9b3361

Ответ 1

nginx "не быстро", когда клиент сообщает ему, что он отправит тело, большее, чем client_max_body_size, отправив ответ 413 и закрыв соединение.

Большинство клиентов не читают ответы до тех пор, пока не будет отправлен весь орган запроса. Поскольку nginx закрывает соединение, клиент отправляет данные в закрытый сокет, вызывая TCP RST.

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

Ответ 2

Сохраняется ли ваша загрузка в самом конце? 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;

Ответ 3

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

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

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