Client_max_body_size Não Funciona no Nginx

Publicado 27 de agosto de 2024

Problema: Diretiva client_max_body_size do Nginx não surtindo efeito

Ao configurar o Nginx, você pode enfrentar um problema em que a diretiva client_max_body_size não funciona como esperado. Isso pode causar rejeições de solicitações ou limites de upload de arquivos. Entender por que isso acontece e como corrigir é fundamental para um servidor web funcionando bem.

Configurando client_max_body_size no Nginx

Localizando o Arquivo de Configuração

O arquivo de configuração do Nginx geralmente está em um destes locais:

  • /etc/nginx/nginx.conf
  • /usr/local/nginx/conf/nginx.conf
  • /usr/local/etc/nginx/nginx.conf

As configurações de bloco de servidor frequentemente estão em arquivos separados no diretório /etc/nginx/sites-available/, com links em /etc/nginx/sites-enabled/.

As configurações de bloco de localização estão em blocos de servidor, permitindo configurações específicas.

Definindo o Limite de Tamanho de Upload

A sintaxe para a diretiva client_max_body_size é:

client_max_body_size tamanho;

Alguns valores para diferentes usos:

  • Uploads de arquivos pequenos (fotos de perfil): 2-5 MB
  • Uploads de documentos: 10-20 MB
  • Uploads de arquivos grandes (vídeos): 100 MB - 1 GB

Para equilibrar segurança e funcionalidade:

  1. Defina um limite padrão no bloco http
  2. Ajuste os limites para blocos de servidor ou localização específicos conforme necessário
  3. Monitore os recursos do servidor e ajuste conforme necessário
  4. Use outras medidas de segurança, como limitação de taxa para uploads grandes

Teste sua configuração após fazer alterações para garantir que funcione corretamente.

Solucionando Problemas com client_max_body_size Não Funcionando

Verificando a Configuração do Nginx

Para verificar erros de sintaxe em sua configuração do Nginx, execute:

nginx -t

Este comando testa os arquivos de configuração e relata quaisquer problemas.

Após alterar a configuração do Nginx, recarregue-a com:

sudo systemctl reload nginx

ou

sudo nginx -s reload

Para verificar os logs de erro do Nginx, veja este arquivo:

/var/log/nginx/error.log

Procure por entradas sobre tamanho de solicitação ou erros 413.

Investigando Problemas de Aplicação do Lado do Servidor

Para configuração PHP, verifique estas configurações no php.ini:

upload_max_filesize = 20M
post_max_size = 20M

Defina esses valores para corresponder ou exceder seu client_max_body_size do Nginx.

Os limites de upload da aplicação podem estar nos arquivos de configuração ou código da aplicação. Verifique a documentação da sua aplicação para ajustar esses limites.

O Nginx e sua aplicação devem trabalhar juntos para uploads de arquivos. Certifique-se de que:

  1. O client_max_body_size do Nginx está definido maior ou igual ao limite da aplicação.
  2. Sua aplicação está configurada para lidar com os tamanhos de arquivo permitidos pelo Nginx.
  3. O usuário do servidor web pode escrever no diretório de upload.

Soluções Alternativas para Uploads de Arquivos Grandes

Implementando Divisão de Arquivos do Lado do Cliente

A divisão de arquivos do lado do cliente, também conhecida como uploads em partes, oferece benefícios para lidar com uploads de arquivos grandes:

  • Permite uploads retomáveis, reduzindo o impacto de problemas de rede
  • Melhora a experiência do usuário fornecendo feedback de progresso
  • Ajuda a contornar limites de tamanho de arquivo do lado do servidor

Bibliotecas JavaScript para divisão de arquivos incluem:

  • Resumable.js: Uma biblioteca para uploads de arquivos em partes e retomáveis
  • Plupload: Um uploader de arquivos com suporte a divisão em partes
  • Fine Uploader: Um uploader com capacidades de divisão em partes

Para o tratamento de uploads em partes do lado do servidor:

  1. Configure seu servidor para aceitar uploads de conteúdo parcial
  2. Implemente lógica para remontar as partes em arquivos completos
  3. Use armazenamento temporário para as partes durante o processo de upload
  4. Valide e processe o arquivo completo uma vez que todas as partes sejam recebidas

Usando Proxy Reverso para Uploads de Arquivos

Configurar um servidor de upload separado pode ajudar a gerenciar uploads de arquivos grandes:

  1. Configure um servidor ou contêiner dedicado para lidar com uploads de arquivos
  2. Configure este servidor com limites de recursos mais altos para processamento de arquivos
  3. Use o Nginx no servidor principal como um proxy reverso para rotear solicitações de upload

Considerações de balanceamento de carga para uploads de arquivos incluem:

  • Distribuir o tráfego de upload entre vários servidores backend
  • Usar hashing consistente para rotear partes do mesmo arquivo para o mesmo servidor
  • Implementar verificações de saúde para remover servidores de upload não responsivos do pool

Para usar o Nginx como um proxy reverso para arquivos grandes:

  1. Configure o Nginx para fazer proxy de solicitações para o servidor de upload:
location /upload {
    proxy_pass http://servidor_upload;
    proxy_request_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
}
  1. Ajuste as configurações de timeout para acomodar transferências de arquivos grandes:
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
  1. Considere usar o recurso X-Accel-Redirect do Nginx para servir arquivos enviados de forma eficiente