проблема с максимальным размером тела клиента загрузки nginx
я запускаю nginx / ruby-on-rails, и у меня есть простая составная форма для загрузки файлов.
Все работает нормально, пока я не решу ограничить максимальный размер файлов, которые я хочу загрузить.
Для этого я установил nginx client_max_body_size до 1м (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
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