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:
- Defina um limite padrão no bloco http
- Ajuste os limites para blocos de servidor ou localização específicos conforme necessário
- Monitore os recursos do servidor e ajuste conforme necessário
- 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:
- O client_max_body_size do Nginx está definido maior ou igual ao limite da aplicação.
- Sua aplicação está configurada para lidar com os tamanhos de arquivo permitidos pelo Nginx.
- 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:
- Configure seu servidor para aceitar uploads de conteúdo parcial
- Implemente lógica para remontar as partes em arquivos completos
- Use armazenamento temporário para as partes durante o processo de upload
- 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:
- Configure um servidor ou contêiner dedicado para lidar com uploads de arquivos
- Configure este servidor com limites de recursos mais altos para processamento de arquivos
- 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:
- 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 "";
}
- 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;
- Considere usar o recurso X-Accel-Redirect do Nginx para servir arquivos enviados de forma eficiente