nginx - client_max_body_size não tem efeito

205

nginx continua dizendo client intended to send too large body. Googling e RTM me apontaram client_max_body_size. Eu o configurei 200mno Nginx, nginx.confbem como no vhost conf, reiniciei o Nginx algumas vezes, mas ainda estou recebendo a mensagem de erro.

Eu esqueci alguma coisa? O back-end é php-fpm( max_post_sizee max_upload_file_sizeé definido de acordo).

q_no
fonte
4
Há um problema com o client_max_body_size no SSL ativado. Acabei de ter o mesmo problema na versão nginx durada e ignora essa diretiva em conexões seguras. Ainda à procura de solução.
Neolo
14
Caso outra pessoa pesquise no Google: o Nginx 1.1.19 (no Ubuntu 12.04) parece ignorar o client_max_body_size na diretiva 'http', embora seja bom em 'server'. Parece que isso foi introduzido em uma atualização nos últimos 6 meses, porque para mim o mesmo arquivo de configuração no mesmo servidor costumava funcionar.
Dave
1
@ Dave e se você vir aqui em 2018, este parece fixo - client_max_body_sizena httpseção tem o efeito esperado com versão nginx 1.14.1
DomQ
Isso verifica o cabeçalho do comprimento do conteúdo (pelo menos na versão 1.4.6); portanto, se um arquivo grande for carregado com comprimento de conteúdo não definido ou comprimento de conteúdo definido com um valor menor que o tamanho máximo do corpo, ele não acionará o HTTP 413
Charles L.

Respostas:

131

Após a documentação do nginx , você pode definir client_max_body_size 20m (ou qualquer valor necessário) no seguinte contexto:

context: http, server, location
Nembleton
fonte
20
Não funcionou para mim no local, funcionou no contexto do servidor. Não tenho certeza se estava sendo substituído, não posso dizer.
Dipen
@ Dipen: Interessante. Qual versão do NGinx você possui?
Nembleton
7
Idem o que Dipen disse, exceto que não posso obtê-lo nos blocos de servidor {} ou local {} ... ele só funciona no contexto http {}. Odd
Robbie
4
Posso confirmar que ele só funciona no nginx / 1.4.1 em execução no Debian GNU / Linux 7.1 (wheezy) na seção http {}.
Fernando Kosh
A confirmação da configuração falha ao definir httpou locationconfigurações. Funciona quando definido no servernível. nginx / 1.4.4
AlbertEngelB
104

Os uploads grandes do NGINX estão trabalhando com êxito em sites hospedados do WordPress, finalmente (conforme sugestões de nembleton & rjha94)

Eu pensei que poderia ser útil para alguém, se eu adicionasse um pouco de esclarecimento às sugestões deles. Para iniciantes, verifique se você incluiu sua diretiva de upload aumentada em TODOS OS TRÊS blocos de definição separados (servidor, local e http). Cada um deve ter uma entrada de linha separada. O resultado será algo assim (onde o ... reflete outras linhas no bloco de definição):

http {
    ...
    client_max_body_size 200M;
}    

(na minha configuração do ISPconfig 3, este bloco está no arquivo /etc/nginx/nginx.conf)

server {
    ...
    client_max_body_size 200M;
}

location / {
    ...
    client_max_body_size 200M;
} 

(na minha configuração do ISPconfig 3, esses blocos estão no arquivo /etc/nginx/conf.d/default.conf)

Além disso, verifique se o arquivo php.ini do seu servidor é consistente com essas configurações do NGINX. No meu caso, alterei a configuração na seção File_Uploads do php.ini para ler:

upload_max_filesize = 200M

Nota: se você estiver gerenciando uma instalação do ISPconfig 3 (minha instalação é no CentOS 6.3, conforme The Perfect Server ), será necessário gerenciar essas entradas em vários arquivos separados. Se sua configuração for semelhante à configuração passo a passo, os arquivos conf NGINX que você precisa modificar estão localizados aqui:

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

Meu arquivo php.ini estava localizado aqui:

/etc/php.ini

Continuei a ignorar o bloco http {} no arquivo nginx.conf. Aparentemente, ignorar isso teve o efeito de limitar o upload ao limite padrão de 1 milhão. Após fazer as alterações associadas, você também deve reiniciar os serviços NGINX e PHP FastCGI Process Manager (PHP-FPM). Na configuração acima, eu uso os seguintes comandos:

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
jadik
fonte
24
Eu sugiro que você use /etc/init.d/nginx reload. Isso adicionou benefícios como 'se a configuração estiver errada' o NginX não para de funcionar.
Hengjie
Obrigado, isso foi realmente útil para mim! Resolveu o meu problema depois de hackers ao redor com lotes de diferentes configurações de arquivo php.ini etc.
Yos
M minúsculo trabalhou para nós. client_max_body_size 100m;
so_mv
13
@ Hengjie Eu recomendaria usar nginx -t(testa a sintaxe do arquivo de configuração) e depois nginx -s reload(faz a recarga real).
Anoyz
Só preciso salientar que na minha caixa vagrant havia dois arquivos ini - /etc/php5/cli/php.ini e /etc/php5/fpm/php.ini e a configuração carregada do Symfony era a do fpm. Portanto, não se esqueça de editar este.
Jalal
65

Em março de 2016 , deparei-me com este problema ao tentar POST o json por https (a partir de solicitações python, não que isso importe).

O truque é colocar "client_max_body_size 200M;" em pelo menos dois lugares http {}eserver {} :

1. o httpdiretório

  • Normalmente em /etc/nginx/nginx.conf

2. o serverdiretório em seu vhost.

  • Para usuários do Debian / Ubuntu que instalaram via apt-get (e outros gerenciadores de pacotes de distribuição que instalam o nginx com vhosts por padrão), isso é /etc/nginx/sites-available/mysite.com, para aqueles que não têm vhosts, provavelmente é o seu nginx.conf ou no mesmo diretório.

3. o location /diretório no mesmo local que 2.

  • Você pode ser mais específico do que /, mas, se não estiver funcionando, recomendo aplicar isso /e, depois que o trabalho for mais específico.

Lembre -se - se você tiver SSL, isso exigirá que você defina o acima para o SSL servere locationtambém, onde quer que seja (idealmente o mesmo que 2. ). Descobri que se o seu cliente tenta fazer o upload no http e você espera que ele seja enviado 301 para https, o nginx eliminará a conexão antes do redirecionamento, devido ao arquivo ser muito grande para o servidor http, portanto, ele deve ser em ambos .

Comentários recentes sugerem que há um problema com isso no SSL nas versões mais recentes do nginx, mas eu estou no 1.4.6 e está tudo bem :)

JJ
fonte
3
A documentação indica o padrão como "1m", que acabou por ser 1 megabyte - não 1 megabit. Eu acho que - embora ainda não o tenha testado - é sempre megabyte.
Thomas
2
@ Thomas, sim, sempre foi m não M, então definitivamente é megabyte, porque eu mesmo fiz um teste.
CppLearner
1
Obrigado a ambos - eu apaguei o bit bit / byte.
JJ
2
A partir de 2018 e da versão 1.14.1 do nginx, isso parece corrigido - client_max_body_sizeé respeitado na seção httpsem a necessidade de adicioná-lo em qualquer outro lugar.
DomQ
27

Você precisa aplicar as seguintes alterações:

  1. Atualize php.ini(encontre o arquivo ini correto phpinfo();) e aumente post_max_sizee upload_max_filesizedimensione o tamanho desejado:

    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. Atualização Nginx configurações para o seu site e adicionar client_max_body_sizevalor no seu location, httpou servercontexto.

    location / {
        client_max_body_size 200m;
        ...
    }
    
  3. Reinicie o NginX e o PHP-FPM:

    service nginx restart
    service php5-fpm restart
    

NOTA: Em algum momento (no meu caso quase sempre), você precisará interromper o php-fpmprocesso se ele não for atualizado corretamente pelo comando de serviço. Para fazer isso, você pode obter a lista de processos ( ps -elf | grep php-fpm) e matar um por um ( kill -9 12345) ou usar o seguinte comando para fazer isso por você:

ps -elf | grep php-fpm | grep -v grep | awk '{ print $4 }' | xargs kill -9
Qorbani
fonte
12

Por favor, veja se você está definindo a diretiva client_max_body_size dentro do bloco http {} e não no local {}. Eu configurei dentro do bloco http {} e funciona

rjha94
fonte
11

Alguém me corrija se isso for ruim, mas eu gosto de bloquear tudo o máximo possível e, se você tiver apenas um destino para uploads (como geralmente é o caso), basta direcionar suas alterações para esse arquivo. Isso funciona para mim no pacote 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
fonte
Eu também gosto dessa idéia, no entanto, para mim, não funciona dessa maneira. Tudo o que posso fazer é reduzir o valor e não aumentá-lo no nível do local.
precisa
4

Eu tive um problema semelhante recentemente e descobri que isso client_max_body_size 0;pode resolver esse problema. Isso definirá client_max_body_size como sem limite. Mas a melhor prática é melhorar seu código, portanto, não há necessidade de aumentar esse limite.

Adrián Molčan
fonte
3

Supondo que você já tenha definido o client_max_body_size e várias configurações do PHP (upload_max_filesize / post_max_size, etc) nas outras respostas, reiniciado ou recarregado o NGINX e o PHP sem nenhum resultado, execute isso ...

nginx -T

Isso fornecerá erros não resolvidos nas configurações do NGINX. No meu caso, lutei com o erro 413 por um dia inteiro antes de perceber que havia outros erros SSL não resolvidos na configuração do NGINX (caminho incorreto para certs) que precisavam ser corrigidos. Depois de corrigir os problemas não resolvidos que recebi do 'nginx -T', recarreguei o NGINX e o EUREKA !! Isso consertou.

P-Didz
fonte
3

Estou configurando um servidor dev para brincar com esse que reflete nosso servidor desatualizado, usei o servidor perfeito - Ubuntu 14.04 (nginx, BIND, MySQL, PHP, Postfix, Dovecot e ISPConfig 3)

Depois de enfrentar o mesmo problema, me deparei com este post e nada estava funcionando. Alterei o valor em todos os arquivos recomendados (nginx.conf, ispconfig.vhost, / sites-available / default, etc.)

Finalmente, mudar o client_max_body_sizemeu /etc/nginx/sites-available/apps.vhoste reiniciar o nginx foi o que fez o truque. Espero que ajude alguém.

Jeramiah Harland
fonte
3

Encontro o mesmo problema, mas não achei nada a ver com o nginx. Estou usando o nodejs como servidor back-end, use o nginx como um proxy reverso, o código 413 é acionado pelo servidor do nó. nó use koa analisar o corpo. koa limita o comprimento do código de URL.

formLimit: limite do corpo codificado em url. Se o corpo acabar sendo maior que esse limite, um código de erro 413 será retornado. O padrão é 56kb.

definir formLimit para maior pode resolver esse problema.

pangpang
fonte
0

Teve o mesmo problema que o client_max_body_size diretiva foi ignorada.

Meu erro bobo foi que eu coloquei um arquivo dentro do /etc/nginx/conf.dqual não terminava .conf. O Nginx não os carregará por padrão.

Philippe Gerber
fonte
-2

Se você estiver usando a versão nginx do Windows, poderá tentar matar todo o processo nginx e reiniciá-lo para ver. Encontrei o mesmo problema no meu ambiente, mas resolvi-o com esta solução.

nathan.xu
fonte
Esse foi o meu problema, obrigado! Uma instância do Nginx não foi encerrada corretamente, eu acho. Nunca é ruim para verificar se ele é encerrado em janelastasklist /fi "imagename eq nginx.exe"
Valery Baranov