проблема с максимальным размером тела клиента загрузки nginx



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



проблема это когда я загружаю файл 1.2 MB, вместо отображения страницы ошибки HTTP 413, браузер немного зависает, а затем умирает с сообщением "соединение было сброшено во время загрузки страницы".



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

751   3  

3 ответов:

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 превышает максимальный размер тела.

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

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

Set 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;

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

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

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

Comments

    Ничего не найдено.