nginx - client_max_body_size не имеет никакого эффекта

205

Nginx продолжает говорить client intended to send too large body. Google и RTM указали на меня client_max_body_size. Я установил его как 200mв, nginx.confтак и в vhost conf, перезапустил Nginx пару раз, но я все еще получаю сообщение об ошибке.

Я что-то упустил? Бэкэнд есть php-fpm( max_post_sizeи max_upload_file_sizeустановлены соответственно).

q_no
источник
4
Существует проблема с client_max_body_size при включенном SSL. Я только что получил ту же проблему на прошлой версии nginx, и она игнорирует эту директиву в безопасных соединениях. Все еще ищу решение.
Neolo
14
В случае, если кто-то еще гуглит это: Nginx 1.1.19 (в Ubuntu 12.04), похоже, игнорирует client_max_body_size в директиве 'http', хотя в 'server' это нормально. Кажется, это было введено в обновление за последние 6 месяцев или около того, потому что для меня тот же файл конфигурации на том же сервере, который работал.
Дейв
1
@Dave, и если вы приехали сюда в 2018 году, это кажется исправленным - client_max_body_sizeв httpразделе есть ожидаемый эффект с версией nginx
1.14.1
При этом проверяется заголовок длины содержимого (по крайней мере, в 1.4.6), поэтому, если большой файл загружен с неопределенной длиной содержимого или если для длины содержимого установлено значение, меньшее максимального размера тела, он не будет запускать HTTP 413
Charles Л.

Ответы:

131

Следуя документации nginx , вы можете установить client_max_body_size 20 м (или любое нужное вам значение) в следующем контексте:

context: http, server, location
nembleton
источник
20
Это не сработало у меня на месте, сработало в контексте сервера. Не уверен, что это было переопределено, не могу сказать.
Дипен
@Dipen: интересно. Какая у вас версия NGinx?
Нэмблтон
7
То же самое сказал Дипен, за исключением того, что я не могу получить его в блоках сервера {} или location {} ... это работает только в контексте http {}. Странно
Робби
4
Я могу подтвердить, что он работает только на nginx / 1.4.1, работающем на Debian GNU / Linux 7.1 (wheezy) в разделе http {}.
Фернандо Кош
Подтверждение настройки не выполняется при установке httpили locationнастройках. Работает, когда установлен на serverуровне. nginx / 1.4.4
AlbertEngelB
104

Наконец, крупные загрузки 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. В моем случае я изменил настройки в разделе File_Uploads в php.ini, чтобы они выглядели так:

upload_max_filesize = 200M

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

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

Мой файл php.ini был расположен здесь:

/etc/php.ini

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

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
jadik
источник
24
Я бы предложил вам использовать /etc/init.d/nginx reloadвместо этого. Это добавило такие преимущества, как «если конфигурация неверна», NginX не перестанет работать.
Hengjie
Спасибо, это было очень полезно для меня! Решил мою проблему после взлома с большим количеством различных настроек файла php.ini и т. Д.
Yos
Строчные м работали для нас. client_max_body_size 100 м;
so_mv
13
@Hengjie Я бы порекомендовал использовать nginx -t(тестирует синтаксис файла конфигурации), а затем nginx -s reload(выполняет реальную перезагрузку).
Анойз
Просто нужно указать, что в моем бродячем ящике было два ini-файла - /etc/php5/cli/php.ini и /etc/php5/fpm/php.ini, а загруженная конфигурация Symfony была fpm. Так что не забудьте отредактировать этот.
Джалал
65

По состоянию на март 2016 года года я столкнулся с этой проблемой, пытаясь POST JSON через https (из запросов Python, не то, что это имеет значение).

Хитрость заключается в том, чтобы поставить "client_max_body_size 200M;" по крайней мере в двух местах http {}иserver {} :

1.http каталог

  • Обычно в /etc/nginx/nginx.conf

2.server каталог в виртуальном хосте.

  • Для пользователей Debian / Ubuntu, которые установили через apt-get (и другие менеджеры пакетов дистрибутивов, которые по умолчанию устанавливают nginx с vhosts) /etc/nginx/sites-available/mysite.com, для тех, у кого нет vhosts, это, вероятно, ваш nginx.conf или в том же каталоге, что и он.

3.location / каталога в том же месте , как 2.

  • Вы можете быть более конкретным, чем /, но если он вообще не работает, я бы порекомендовал применить это к, /а затем, когда его работа будет более конкретной.

Помните - если у вас есть SSL, это потребует от вас установки вышеуказанного для SSL serverи locationтоже, где бы это ни было (в идеале, то же самое, что и 2. ). Я обнаружил, что если ваш клиент пытается загрузить по http, и вы ожидаете, что он получит 301-е на https, nginx фактически прервет соединение перед перенаправлением из-за того, что файл слишком велик для http-сервера, поэтому он должен быть в обоих .

Последние комментарии предполагают, что с SSL это связано с новыми версиями nginx, но я на 1.4.6 и все хорошо :)

JJ
источник
3
В документации указано, что по умолчанию используется значение «1 м», что составляет 1 мегабайт, а не 1 мегабит. Я думаю - хотя я еще не проверял это - это всегда мегабайт.
Томас,
2
@ Томас, да, это всегда было не М, так что это определенно мегабайт, потому что я сам провел тест.
CppLearner
1
Спасибо вам обоим - я удалил бит / байт.
JJ
2
Начиная с 2018 года и версии nginx 1.14.1, это кажется исправленным - client_max_body_sizeэто приветствуется в разделе, httpбез необходимости добавлять его где-либо еще.
DomQ
27

Вам необходимо применить следующие изменения:

  1. Update php.ini(Найти правильный INI файл phpinfo();) и увеличения post_max_sizeи upload_max_filesizeразмера вы хотите:

    sed -i "s/post_max_size =.*/post_max_size = 200M/g" /etc/php5/fpm/php.ini
    sed -i "s/upload_max_filesize =.*/upload_max_filesize = 200M/g" /etc/php5/fpm/php.ini```
    
  2. Обновление Nginx настройки для вашего веб - сайта и добавить client_max_body_sizeценность в вашей location, httpилиserver контекста.

    location / {
        client_max_body_size 200m;
        ...
    }
    
  3. Перезапустите NginX и PHP-FPM:

    service nginx restart
    service php5-fpm restart
    

ПРИМЕЧАНИЕ. Иногда (в моем случае почти каждый раз) вам нужно завершать php-fpmпроцесс, если он не обновлялся командой service должным образом. Для этого вы можете получить список процессов ( ps -elf | grep php-fpm) и убить по одному ( kill -9 12345) или использовать следующую команду, чтобы сделать это за вас:

ps -elf | grep php-fpm | grep -v grep | awk '{ print $4 }' | xargs kill -9
Qorbani
источник
12

Посмотрите, устанавливаете ли вы директиву client_max_body_size внутри блока http {}, а не внутри блока location {}. Я установил его внутри блока http {}, и он работает

rjha94
источник
11

Кто-то исправит меня, если это плохо, но я хотел бы максимально заблокировать все, и если у вас есть только одна цель для загрузки (как это обычно бывает), то просто нацелите ваши изменения на этот один файл. Это работает для меня в пакете Ubuntu nginx-extras mainline 1.7+:

location = /upload.php {
    client_max_body_size 102M;
    fastcgi_param PHP_VALUE "upload_max_filesize=102M \n post_max_size=102M";
    (...)
}
digitaltoast
источник
Мне тоже нравится эта идея, но для меня это не работает. Все, что я могу сделать, это уменьшить значение и не увеличивать его на уровне местоположения.
Геза Тури
4

У меня недавно была похожая проблема, и я узнал, что client_max_body_size 0;могу решить эту проблему. Это установит client_max_body_size без ограничений. Но лучшая практика заключается в улучшении вашего кода, поэтому нет необходимости увеличивать этот лимит.

Адриан Молчан
источник
3

Предполагая, что вы уже установили client_max_body_size и различные настройки PHP (upload_max_filesize / post_max_size и т. Д.) В других ответах, затем перезапустили или перезагрузили NGINX и PHP без какого-либо результата, запустите это ...

nginx -T

Это даст вам любые неразрешенные ошибки в ваших конфигах NGINX. В моем случае я боролся с ошибкой 413 в течение всего дня, прежде чем понял, что в конфигурации NGINX есть некоторые другие неразрешенные ошибки SSL (неправильный путь для сертификатов), которые необходимо исправить. Как только я исправил нерешенные проблемы, которые я получил от 'nginx -T', перезагрузил NGINX и EUREKA !! Это исправило это.

Р-Didz
источник
3

Я настраиваю dev-сервер для игры с тем, что отражает наш устаревший живой, я использовал The Perfect Server - Ubuntu 14.04 (nginx, BIND, MySQL, PHP, Postfix, Dovecot и ISPConfig 3)

После того, как возникла та же проблема, я наткнулся на этот пост, и ничего не работает. Я изменил значение в каждом рекомендуемом файле (nginx.conf, ispconfig.vhost, / sites-available / default и т. Д.)

Наконец, изменение client_max_body_sizeв моем /etc/nginx/sites-available/apps.vhostи перезапуске nginx - вот что сработало. Надеюсь, это поможет кому-то еще.

Джерамия Харланд
источник
3

Я столкнулся с той же проблемой, но не нашел ничего общего с nginx. Я использую nodejs в качестве внутреннего сервера, использую nginx в качестве обратного прокси-сервера, код 413 запускается сервером узла. Узел использования коа разбирает тело. коа ограничивают длину urlencoded.

formLimit: предел urlencoded тела. Если тело оказывается больше этого предела, возвращается код ошибки 413. По умолчанию 56 КБ.

установить formLimit на большее может решить эту проблему.

pangpang
источник
0

Была та же проблема, что client_max_body_size директива была проигнорирована.

Моя глупая ошибка заключалась в том, что я положил внутрь файл, /etc/nginx/conf.dкоторый не заканчивался .conf. Nginx не будет загружать их по умолчанию.

Филипп Гербер
источник
-2

Если вы используете версию Windows nginx, вы можете попытаться убить весь процесс nginx и перезапустить его, чтобы увидеть. Я столкнулся с той же проблемой в моей среде, но решил ее с помощью этого решения.

nathan.xu
источник
Это была моя проблема, спасибо! Я думаю, что один экземпляр Nginx не был завершен должным образом. tasklist /fi "imagename eq nginx.exe"
Валерий Баранов