upload module: error 413

Valery Kholodkov valery+nginxru at grid.net.ru
Wed Aug 27 02:25:41 MSD 2008


Здравствуйте, Дмитрий!

Ваше письмо почему-то попало в спам, сейчас добавил весь домен в вайтлист.

1) Вы наступаете на лимит директивы client_max_body_size, а не 
upload_buffer_size. upload_buffer_size вообще ни каких лимитов не 
задает. Из лога очевидно, что тело запроса составляет ~800 мегабайт, а в 
файле конфигурации ограничение -- 100 мегабайт. Размер загружаемого 
файла при этом непосредственной роли не играет;
2) upload_buffer_size 1m -- это много. При каждом запросе на аплоад 
будет выделяться 1 мегабайт памяти. Рекомендуемые значения -- до 256k. В 
будущем этой директивы вообще не будет, а будут использоваться 
клиентские буферы;
3) location  /_upload1 надо объявить internal, иначе в него можно будет 
делать фэйковые запросы извне;
4) upload_pass_form_field ".*" -- это большая дыра. Клиенты смогут 
постить фэйковые поля. Нужно тщательно перечислить все необходимые поля 
формы;
5) Конструкция, при которой в первом аргументе директив 
upload_set_form_field и upload_aggregate_form_field нет переменных, 
редко применима (хотя и возможна в версии 2.0.5), поскольку нет 
возможности определить в каком выходном файле какой файл формы записан.

 > Точнее, во временную дирректорию они все-таки попадают в нормальном
 > виде, но браузеру возвращается ошибка 413.

Здесь Вы что-то путаете. При выдаче 413 тело запроса отбрасывается.

Dmitry Dedukhin wrote:
> worker_processes  1;
> events {
>     worker_connections  1024;
> }
> http {
>     include       mime.types;
>     default_type  application/octet-stream;
>     sendfile        on;
>     keepalive_timeout  65;
>     server {
>         listen       _aaaaaa.bbbb_.ru:8801;
>         server_name  _aaaaaa.bbbb_.ru;
>         proxy_set_header X-Real-IP $remote_addr;
>         proxy_set_header Host      $Host;
>         location / {
>             proxy_pass 
> http://aaaaaa.bbbb.ru:80;                                                                                                                                      
> 
>         }
>         client_max_body_size    100m;
>         client_body_buffer_size 5m;
>         location /_upload/ {
>             upload_buffer_size     1m;
>             upload_pass /_upload1;
>             upload_store /var/tmp/upload;
>             upload_set_form_field nginx_upload_filename "$upload_file_name";
>             upload_set_form_field nginx_upload_tmpfilename 
> "$upload_tmp_path";
>             upload_aggregate_form_field nginx_upload_filesize 
> "$upload_file_size";
>             upload_pass_form_field ".*";
>         }
>         location /_upload1 {
>             proxy_pass http://aaaaaa.bbbb.ru:80/cgi-bin/upload;
>         }
>     }
> }
>  
> OS: GNU/Linux, upload module v 2.0.5
> Проблема: не получается загружать файлы размером больше, чем выставлено 
> значение upload_buffer_size.
> Точнее, во временную дирректорию они все-таки попадают в нормальном 
> виде, но браузеру возвращается ошибка 413.
> Если загружать файл размером меньшим чем значение upload_buffer_size - 
> то все нормально.
>  
> При возникновении ошибки в логе nginx видим запись
>  
> 2008/08/26 14:05:55 [error] 26012#0: *1 client intended to send too 
> large body: 808793012 bytes, client: xxx.xxx.xxx.x, server: 
> _aaaaaa.bbbb_.ru, request: "POST /_upload/ HTTP/1.1", host: 
> "_aaaaaa.bbbb_.ru:8801"
>  
> Хотя файл загружали размером несколько сотен килобайт...
> Где грабли?


-- 
Regards,
Valery Kholodkov





More information about the nginx-ru mailing list