Client max body size


NGINX large uploads are successfully working on hosted WordPress sites, finally (as per suggestions from nembleton & rjha94)

I thought it might be helpful for someone, if I added a little clarification to their suggestions. For starters, please be certain you have included your increased upload directive in ALL THREE separate definition blocks (server, location & http). Each should have a separate line entry. The result will like something like this (where the … reflects other lines in the definition block):

http {  ...  client_max_body_size 200M; }  

(in my ISPconfig 3 setup, this block is in the /etc/nginx/nginx.conf file)

server {  ...  client_max_body_size 200M; }  location / {  ...  client_max_body_size 200M; }  

(in my ISPconfig 3 setup, these blocks are in the /etc/nginx/conf.d/default.conf file)

Also, make certain that your server’s php.ini file is consistent with these NGINX settings. In my case, I changed the setting in php.ini’s File_Uploads section to read:

upload_max_filesize = 200M   

Note: if you are managing an ISPconfig 3 setup (my setup is on CentOS 6.3, as per The Perfect Server), you will need to manage these entries in several separate files. If your configuration is similar to one in the step-by-step setup, the NGINX conf files you need to modify are located here:

/etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf  

My php.ini file was located here:

/etc/php.ini 

I continued to overlook the http {} block in the nginx.conf file. Apparently, overlooking this had the effect of limiting uploading to the 1M default limit. After making the associated changes, you will also want to be sure to restart your NGINX and PHP FastCGI Process Manager (PHP-FPM) services. On the above configuration, I use the following commands:

/etc/init.d/nginx restart /etc/init.d/php-fpm restart 

stackoverflow.com

Why do we have to care?

One would be just fine putting the large client_max_body_size in server {} context and be happy that things work. However, this exposes some risk to the DDoS. Many large file uploads will consume disk space on your server. They will consume network bandwidth as well as TCP sockets.

So what is the rule of thumb here? It depends on your use case.

First, if you are certain that your website will not accept large file uploads exceeding the default 1MB, do not specify any extra configuration. Let the default value apply.

If you only accept large uploads directly at PHP URLs which don’t involve any internal rewriting by nginx, you can put the client_max_body_size


in the ~ .php$ location only and this would be most safe.

Finally, if you accept uploads exceeding 1MB at SEO friendly URLs (e.g. /user/upload), then you can put client_max_body_size 64M; in server {} context. But to address security concerns you might want to take a different approach, which we are going to detail next.

Increase file upload limit in nginx for SEO-friendly upload endpoints.

So your upload must be taken at a SEO friendly location, e.g. /user/upload and you want to increase the upload limit just there. This would be quite better in terms of security, since other locations will be less prone to large uploads DDoS.

You can achieve this by specifying a separate location for your “pretty upload handler”, like the following:

server {   location / {  try_files $uri $uri/ /index.php$is_args$args;  }  location = /user/upload {  client_max_body_size 64M;  fastcgi_pass ...  fastcgi_param SCRIPT_FILENAME $document_root/index.php;  include fastcgi_params;  fastcgi_param SCRIPT_NAME /index.php;  }  location ~ .php$ {  fastcgi_pass ...  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;   } }   

What we did there is relaxed the upload limit just for our upload handler. Note that we have to adjust fastcgi_param SCRIPT_FILENAME and point it directly to /index.php script as there is no longer any rewrite to it. We have essentially converted an indirect match (our initial configuration) into direct match to our upload handler with the pretty URL.

Note how we put fastcgi_param SCRIPT_NAME /index.php at the end of /user/upload location. This is so it overrides the one which is set in fastcgi_params file.

www.getpagespeed.com

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

Неплохой начальной точкой для настройки nginx является конфиг, который идёт в комплекте с дистрибутивом, но очень многие возможности этого сервера в нём даже не упоминаются. Значительно более подробный пример есть на сайте Игоря Сысоева: sysoev.ru/nginx/docs/example.html. Однако, давайте лучше попробуем собрать с нуля свой конфиг, с бриджем и поэтессами. 🙂

Начнём с общих настроек. Сначала укажем пользователя, от имени которого будет работать nginx (от рута работать плохо, все знают 🙂 )

user nobody;



Теперь скажем nginx-у, какое количество рабочих процессов породить. Обычно, хорошим выбором бывает число процессов, равное числу процессорных ядер в вашем сервере, но с этой настройкой имеет смысл поэкспериментировать. Если ожидается высокая нагрузка на жёсткий диск, можно сделать по процессу на каждый физический жёсткий диск, поскольку вся работа будет всё-равно ограничена его производительностью.

worker_processes 2;

Уточним, куда писать логи ошибок. Потом, для отдельных виртуальных серверов, этот параметр можно переопределить, так что в этот лог будут сыпаться только «глобальные» ошибки, например, связанные со стартом сервера.

error_log /spool/logs/nginx/nginx.error_log notice; # уровень уведомлений "notice", конечно, можно менять

Теперь идёт очень интересная секция «events». В ней можно задать максимальное количество соединений, которые одновременно будет обрабатывать один процесс-воркер, и метод, который будет использоваться для получения асинхронных уведомлений о событиях в ОС. Конечно же, можно выбрать только те методы, которые доступны на вашей ОС и были включены при компиляции.


Эти параметры могут оказать значительное влияние на производительность вашего сервера. Их надо подбирать индивидуально, в зависимости от ОС и железа. Я могу привести только несколько общих правил.

Модули работы с событиями:
— select и poll обычно медленнее и довольно сильно нагружают процессор, зато доступны практически везде, и работают практически всегда;
— kqueue и epoll — более эффективны, но доступны только во FreeBSD и Linux 2.6, соответственно;
— rtsig — довольно эффективный метод, и поддерживается даже очень старыми линуксами, но может вызывать проблемы при большом числе подключений;
— /dev/poll — насколько мне известно, работает в несколько более экзотических системах, типа соляриса, и в нём довольно эффективен;

Параметр worker_connections:
— Общее максимальное количество обслуживаемых клиентов будет равно worker_processes * worker_connections;
— Иногда могут сработать в положительную сторону даже самые экстремальные значения, вроде 128 процессов, по 128 коннектов на процесс, или 1 процесса, но с параметром worker_connections=16384. В последнем случае, впрочем, скорее всего понадобится тюнить ОС.

events {
worker_connections 2048;
use kqueue; # У нас BSD :)
}

Следующая секция — самая большая, и содержит самое интересное. Это описание виртуальных серверов, и некоторых параметров, общих для них всех. Я опущу стандартные настройки, которые есть в каждом конфиге, типа путей к логам.

http {
# Весь код ниже будет внутри этой секции %)
# ...
}



Внутри этой секции могут находиться несколько довольно интересных параметров.

Системный вызов sendfile появился в Linux относительно недавно. Он позволяет отправить данные в сеть, минуя этап их копирования в адресное пространство приложения. Во многих случаях это существенно повышает производительность сервера, так что параметр sendfile лучше всегда включать.

sendfile on;

Параметр keepalive_timeout отвечает за максимальное время поддержания keepalive-соединения, в случае, если пользователь по нему ничего не запрашивает. Обдумайте, как именно на вашем сайте посылаются запросы, и исправьте этот параметр. Для сайтов, активно использующих AJAX, соединение лучше держать подольше, для статических страничек, которые пользователи будут долго читать, соединение лучше разрывать пораньше. Учтите, что поддерживая неактивное keepalive-соединение, вы занимаете коннекшн, который мог бы использоваться по-другому. 🙂

keepalive_timeout 15;

Отдельно стоит выделить настройки проксирования nginx. Чаще всего, nginx используется именно как сервер-прокси, соответственно они имеют довольно большое значение. В частности, размер буфера для проксируемых запросов имеет смысл устанавливать не менее, чем ожидаемый размер ответа от сервера-бэкенда. При медленных (или, наоборот, очень быстрых) бэкендах, имеет смысл изменить таймауты ожидания ответа от бэкенда. Помните, чем больше эти таймауты, тем дольше будут ждать ответа ваши пользователе, при тормозах бэкенда.

proxy_buffers 8 64k;
proxy_intercept_errors on;
proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;



Небольшой трюк. В случае, если nginx обслуживает более чем один виртуальный хост, имеет смысл создать «виртуальный хост по-умолчанию», который будет обрабатывать запросы в тех случаях, когда сервер не сможет найти другой альтернативы по заголовку Host в запросе клиента.

# default virtual host
server {
listen 80 default;
server_name localhost;
deny all;
}

Далее может следовать одна (или несколько) секций «server». В каждой из них описывается виртуальный хост (чаще всего, name-based). Для владельцев множества сайтов на одном хостинге, или для хостеров здесь может быть что-то, типа директивы

include /spool/users/nginx/*.conf;

Остальные, скорее всего опишут свой виртуальный хост прямо в основном конфиге.

server {
listen 80;

# Обратите внимание, в директиве server_name можно указать несколько имён одновременно.
server_name myserver.ru myserver.com;
access_log /spool/logs/nginx/myserver.access_log timed;
error_log /spool/logs/nginx/myserver.error_log warn;
# ...



Установим кодировку для отдачи по-умолчанию.

charset utf-8;

И скажем, что мы не хотим принимать от клиентов запросы, длиной более чем 1 мегабайт.

client_max_body_size 1m;

Включим для сервера SSI и попросим для SSI-переменных резервировать не более 1 килобайта.

ssi on;
ssi_value_length 1024;

И, наконец, опишем два локейшна, один из которых будет вести на бэкенд, к апачу, запущенному на порту 9999, а второй отдавать статические картинки с локальной файловой системы. Для двух локейшнов это малоосмысленно, но для большего их числа имеет смысл также сразу определить переменную, в которой будет храниться корневой каталог сервера, и потом использовать её в описаниях локаций.

set $www_root "/data/myserver/root";

location / {
proxy_pass 127.0.0.1:9999;
proxy_set_header X-Real-IP $remote_addr;
proxy_intercept_errors off;
proxy_read_timeout 5s; # Обратите внимание, здесь мы переопределили глобальную настройку, заданную выше
proxy_send_timeout 3s;
# ...

Отдельный блок в корневом локейшне посвящён компрессии получаемого результата в gzip. Это позволит вам, и вашим пользователям сэкономить на трафике. Nginx можно указать, какие типы файлов (или, в нашем случае, ответов от бэкенда) стоит сжимать, и каким должен быть минимальный размер файла для того, чтобы использовать сжатие.

# ...
gzip on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml;
}

location /i/ {
root $www_root/static/;
}
}



Всем спасибо за внимание. И, сорри, что пост получился довольно длинным.

habr.com

Крупные загрузки NGINX успешно работают на размещенных сайтах WordPress, наконец (согласно предложениям от nembleton и rjha94)

Я подумал, что это может быть полезно для кого-то, если я добавлю небольшое пояснение к их предложениям. Для начала, пожалуйста, убедитесь, что вы включили свою увеличенную директиву загрузки во ВСЕХ ТРЕХ отдельных блоков определения (сервер, местоположение и http). Каждый из них должен иметь отдельную строку. Результат понравится примерно так (где… отражает другие строки в блоке определения):

http {  ...  client_max_body_size 200M; }  

(в моей настройке ISPconfig 3 этот блок находится в файле /etc/nginx/nginx.conf)

server {  ...  client_max_body_size 200M; }  location / {  ...  client_max_body_size 200M; }    

(в моей установке ISPconfig 3 эти блоки находятся в файле /etc/nginx/conf.d/default.conf)

Кроме того, убедитесь, что ваш файл php.ini сервера соответствует этим настройкам NGINX. В моем случае я изменил настройку в разделе php.ini File_Uploads, чтобы прочитать:

upload_max_filesize = 200M 

Примечание. Если вы управляете установкой ISPconfig 3 (моя настройка находится на CentOS 6.3, как Perfect Server), вам необходимо будет управлять этими записями в несколько отдельных файлов. Если ваша конфигурация похожа на одну в пошаговой настройке, файлы конфигурации NGINX, которые необходимо изменить, расположены здесь:

/etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf  

Здесь был найден файл php.ini:

/etc/php.ini 

Я продолжал игнорировать http {} блок в файле nginx.conf. По-видимому, упускать из виду это привело к ограничению загрузки до предела по умолчанию 1M. После внесения связанных изменений вы также захотите перезапустить службы NGINX и PHP FastCGI Process Manager (PHP-FPM). В приведенной выше конфигурации я использую следующие команды:

/etc/init.d/nginx restart /etc/init.d/php-fpm restart 

qaru.site

nginx не пропускает больше одного мегабайта файлы, при этом везде в php.ini установил параметры размера, в апаче нет ограничения. Так как nginx проксирует на апач на 8080 порт, то в качестве проверки открывал сайт по айпи с указанным портом — файлы успешно загружаются, что показывает отсутствие проблем со стороны php — apache. Когда как через nginx файлы не проходят — 413 Request Entity Too Large. Ошибок в логах апача и нжинкса нет. Вот пример файла нжинкса, подскажите, куда ещё можно смотреть.

user nginx; worker_processes 1; worker_rlimit_nofile 100000;  error_log /var/log/nginx/error.log; #error_log /var/log/nginx/error.log notice; #error_log /var/log/nginx/error.log info;  pid /var/run/nginx.pid;   events {  worker_connections 1024;  use epoll; }   http {  include /etc/nginx/mime.types;  default_type application/octet-stream;   log_format main '$remote_addr - $remote_user [$time_local] "$request" '  '$status $body_bytes_sent "$http_referer" '  '"$http_user_agent" "$http_x_forwarded_for"';   access_log /var/log/nginx/access.log main;   sendfile on;  client_max_body_size 12m;  tcp_nopush on;  tcp_nodelay on;  server_tokens off;  gzip on;  gzip_static on;  gzip_comp_level 5;  gzip_min_length 1024;  keepalive_timeout 65;  limit_zone myzone $binary_remote_addr 10m;    # Load config files from the /etc/nginx/conf.d directory  #include /etc/nginx/conf.d/*.conf;    log_format isp '$bytes_sent $request_length';      server {  listen 80;  server_name ______;  client_max_body_size 12m;   rewrite ^(/manager/.*)$ https://$host$1 permanent;  error_page 404 = @fallback;   location ~* ^.+.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {  root /var/www/mastermind/data/www/____.ru;  access_log /var/www/httpd-logs/____.ru.access.log;  access_log /var/www/nginx-logs/mastermind isp;  }    location / {   client_max_body_size 12m;  client_body_buffer_size 128k;  proxy_connect_timeout 90;  proxy_send_timeout 6000;  proxy_read_timeout 6000;  proxy_buffer_size 4k;  proxy_buffers 4 32k;  proxy_busy_buffers_size 64k;  proxy_temp_file_write_size 12m;    proxy_pass http://IP:8080/;  proxy_redirect off;  proxy_buffering off;  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   }   location @fallback {  proxy_pass http://IP:8080;  proxy_set_header Host $host;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header X-Real-IP $remote_addr;  }   }  }

rsdn.org

Описание ошибки

413 Request Entity Too Large

Данная ошибка может появиться в том случае, если вы загружаете какой-либо файл на сервер и размер этого файла превышает максимально разрешенный в конфиге в веб-сервера (например, в nginx по умолчанию установлено ограничение в 1 МБ).  Для того, чтобы это исправить, необходимо внести определенные правки в файл конфигурации, который может быть разным, в зависимости от используемого веб-сервера. Ниже будут приведены примеры для самых популярных веб-серверов:

nginx

Максимальный размер файла указывается параметром client_max_body_size. Поэтому, достаточно прописать параметр и новое значение в любой конфиг, который использует nginx для сайта, на котором у вас появилась эта проблема. Получится должно что-то примерно следующее:

  server {   ...   client_max_body_size 4m;   ...  }  

Где 4m — это 4 Мб. Для установки лимита в 32 Мб, надо соответственно написать client_max_body_size 32m, и т. д.

После изменения настроек нужно обязательно перезагрузить конфиг в nginx.

Apache

Размер файла, допустимого для заливки, можно отрегулировать в главном конфиге Apache, который можно найти по адресу /etc/httpd/conf/httpd.conf (в CentOS) или /etc/apache2/apache2.conf (в Debian/Ubuntu). Задается он параметром LimitRequestBody, и ему можно прописать любое нужное значение в байтах. Например, так выглядит ограничение в 32 МБ:

LimitRequestBody 33554432

Для применения настроек нужно перезагрузить веб-сервер Apache.

PHP

Если при заливке файла используется PHP скрипт, то для PHP имеются отдельные настройки максимального размера файла. Для их изменений потребуется внести правку в файл php.ini, который расположен по адресу /etc/<версия php>/fpm. Открываем его любым текстовым редактором и находим следующие строки:

upload_max_filesize
post_max_size

И выставляем им нужные значения, например 4M (т. е. 4 МБ).

После внесения правок просто перезагружаем php, и проверяем работу.

sysadmin.ru

I am building a Rails 5 app that is deployed to AWS elastic beanstalk.The app is running into the error 413 (Request Entity Too Large). I have been looking around Google, Stackoverflow, and Serverfault. All of these resources point me to using client_max_body_size to increase the upload capacity of the app. There are supposedly 2 ways of doing this, both involving using .ebextensions. The first is writing a simple script with:

files:  /etc/nginx/conf.d/proxy.conf:  content: |  client_max_body_size 2G; 

The second option is to override the nginx.conf. I have done both of the options, but I still keep getting the error 413 (Request Entity Too Large). I’ve tried all the configurations out there for option 1. For both options I manually reloaded nginx with:

sudo service nginx reload 

This is was on my last attempt. I’ve been working with option 2 to override nginx.conf, so here is my own nginx.conf:

# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/  user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid;  # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf;  events {  worker_connections 1024; }  http {  client_max_body_size 2G;   log_format main '$remote_addr - $remote_user [$time_local] "$request" '  '$status $body_bytes_sent "$http_referer" '  '"$http_user_agent" "$http_x_forwarded_for"';   access_log /var/log/nginx/access.log main;   sendfile on;  tcp_nopush on;  tcp_nodelay on;  keepalive_timeout 65;  types_hash_max_size 2048;   include /etc/nginx/mime.types;  default_type application/octet-stream;   # Load modular configuration files from the /etc/nginx/conf.d directory.  # See http://nginx.org/en/docs/ngx_core_module.html#include  # for more information.  include /etc/nginx/conf.d/*.conf;  index index.html index.htm;   server {  client_max_body_size 2G;   listen 80 default_server;  listen [::]:80 default_server;  server_name localhost;  root /usr/share/nginx/html;   # Load configuration files for the default server block.  include /etc/nginx/default.d/*.conf;   location /movies {  client_max_body_size 2G;  }   # redirect server error pages to the static page /40x.html  #  error_page 404 /404.html;  location = /40x.html {  }   # redirect server error pages to the static page /50x.html  #  error_page 500 502 503 504 /50x.html;  location = /50x.html {  }   # proxy the PHP scripts to Apache listening on 127.0.0.1:80  #  #location ~ .php$ {  # proxy_pass http://127.0.0.1;  #}   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  #  #location ~ .php$ {  # root html;  # fastcgi_pass 127.0.0.1:9000;  # fastcgi_index index.php;  # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;  # include fastcgi_params;  #}   # deny access to .htaccess files, if Apache's document root  # concurs with nginx's one  #  #location ~ /.ht {  # deny all;  #}  }   # Settings for a TLS enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # # It is *strongly* recommended to generate unique DH parameters # # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 # #ssl_dhparam "/etc/pki/nginx/dhparams.pem"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # }  } 

I need some help. Any help. I am lost as to what I should do next. Everything i have tried is not working at all. Help would be greatly appreciated.

serverfault.com

Буферы Nginx задают возможность использования оперативной памяти для сохранения представляющей ценность информации. Их размер задается в конфигурационном файле и определяет будет ли использоваться оперативная память или все будет записываться на диск.

Размер буферов задается в зависимости от количества доступных серверу ресурсов. Если их много значения можно можно увеличивать.

 

 

 

Размер буферов определяется четырьмя директивами в конфигурационном файле, в секции server либо в http:

 

client_body_buffer_size

client_header_buffer_size

client_max_body_size

large_client_header_buffers

 

Первая директива определяет размер буфера под основное содержимое поступившего от клиента запроса, вторая — размер буфера под заголовок запроса. client_max_body_size — максимальный размер основного содержимого клиентского запроса.

 

large_client_header_buffers принимает два значения, разделенных пробелами: максимальное числом и размер буферов для чтения большого заголовка запроса клиента.

Значение размера буфера всегда должно быть меньше client_body_buffer_size, иначе возникнет ошибка 414 (Request-URI Too Large).

Также оно должно быть меньше client_header_buffer_size. В противном случае вернется ошибка 400 (Bad Request).

По умолчанию размер одного буфера равен 8K байт.

 

 

В конфигурационном файле для не самого мощного сервера значения буферов могут быть такими:

client_body_buffer_size 20K;
client_header_buffer_size 4k;
client_max_body_size 12m;
large_client_header_buffers 2 12k;

 

Менять их стоит если имеют место проблемы с производительностью или возникает одна из упомянутых выше ошибок.

Задать их можно для каждого виртуального хоста — для каждого сайта (в секции server) или для всего сервера (в секции http).

 

Читайте про настройку Nginx для работы при высоких нагрузках.

server-gu.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.