Nginx error 413: Request entity too large

Através desse post rápido hoje abordaremos um erro bastante comum com Nginx: o infame 413 Request entity too large. Eu tive o problema agora pouco quando estava fazendo um mini-sistema de upload de arquivos na minha máquina de desenvolvimento, então eu pensei que eu iria fazer um post no blog sobre isso para me certificar de que não se esqueça disso na próxima vez.

Error 413: O que isso significa?

Esse erro aparece quando um visitante envia muitos dados na solicitação HTTP, no meu caso o tamanho do arquivo que eu estava fazendo upload era grande demais.
Isso normalmente é causada por:
• um arquivo muito grande sendo carregado pelo visitante.
• dados POST grandes demais sendo enviado pelo cliente.
A correção é tão simples como a criação de uma directiva na sua configuração Nginx, leia abaixo.

Como corrigí-lo? client_max_body_size

Para corrigir isso, você precisa aumentar o valor da diretiva client_max_body_size. Esta diretiva define a quantidade máxima de dados que o Nginx aceita em uma solicitação HTTP. Por padrão, esse valor é definido como 1 megabyte, ou seja, se você tentar carregar um arquivo maior do que 1 megabyte você estará recebendo um erro 413: Request entity too large. Você pode inserir esta diretiva em três níveis:

No bloco http: isto irá definir o valor diretiva para todos os servidores e os locais na sua configuration.
No bloco de server: isto irá definir o valor directiva para todos os locais de um determinado servidor .
No bloco location: isto irá definir o valor directiva para um local específico em um determinado servidor .

Neste exemplo, etaremos utilizando a diretiva no bloco http e vamos configurá-lo para 250 megabytes:

http {  
    client_max_body_size 250M; # permite o upload de arquivos de até 500 megabytes
    [...]
}

É necessário fazer mais alguma coisa?

Depois de alterar a configuração do servidor, não se esqueça de recarregar Nginx para que a configuração seja aplicada. Há também algumas definições de configuração que você deverá mudar, caso você esteja usando PHP. Caso não esteja utilizando PHP, apenas ignore o resto deste post. Você vai precisar para abrir seu arquivo de configuração php.ini e procurar dois valores:

  • upload_max_filesize: Tamanho máximo permitido para arquivos carregados (padrão: 2 megabytes). Você precisa aumentar esse valor se você espera por arquivos com mais de 2 megabytes de tamanho.
  • post_max_size: tamanho máximo dos dados POST que o PHP irá aceitar (padrão: 8 megabytes). Os arquivos são enviados através de dados POST, então você precisa aumentar esse valor se você está esperando por arquivos com mais de 8 megabytes.

Após fazer as alterações, não se esqueça de recarregar PHP-FPM, para que as alterações sejam aplicadas corretamente. Isso é tudo! Você não deve estar mais recebendo erros de upload depois disso.

Redirecionamento 301 NGINX

Nginx é um grande servidor web, é também o servidor utilizado por este blog. Eu já utilizava o Nginx no meu ambiente de desenvolvimento e agora que eu resolvi mudar de vez da kinghost para a DigitalOcean, foi a chance que eu precisava para utilizá-lo também por aqui, para tal, eu tive que criar uma série de redirecionamentos tanto para melhorar a experiência do usuário evitando que os usuários fossem direcionados para páginas 404 quanto para indexação do motor de busca. Este post vai mostrar como criar alguns redirecionamentos 301 permanentes em seu arquivo de configuração Nginx.

Sempre que possível evite redirecionar páginas, mantendo as mesmas url’s quando você refaz um site. Mas se ainda assim você precisar redirecionar domínios, diretŕoios ou páginas em um servidor Nginx esse post vai te ajudar.

NGINX – Redirecionando Domínios

Para os sites novos, ter o www antes de seu domínio não é realmente necessário. Aqui está como redirecionar a versão www do seu site para a versão limpa, ou seja, a versão sem www.

Redirecionamento WWW para sem WWW


server   {
   server_name www.seudominio.eti.br;
   rewrite  ^/(.*)$  http://seudominio.eti.br/$1 permanent;
}

Redirecionamento sem WWW para WWW

Da mesma maneira, se o seu site já está publicado há bastante tempo, e utilizando a versão www, você pode ter certeza que os usuários serão redirecionados para a versão www.


server   {
   server_name seudominio.eti.br;
   rewrite  ^/(.*)$  http://www.seudominio.eti.br/$1 permanent;
}

NGINX Redirecionamento de Diretório

Pode ser necessário redirecionar todo um diretório de páginas para outro se você renomeá-lo. Caso você tenha que alterar a estrutura do site, possivelmente, você terá um conjunto desses em seu arquivo de configuração.

Essa diretiva vai dentro do bloco do servidor principal de seus sites de configuração NGINX.


if ( $request_filename ~ diretorio-antigo/.+ ) {
       rewrite ^(.*) http://seudominio.com/diretorio-novo/$1 permanent;
   }

if ( $request_filename ~ diretorio-antigo/.+ ) {
       rewrite ^(.*) http://seudominio.com/diretorio-novo/$1 permanent;
   }

Caso seja necessário, você pode simplesmente remover o diretório, dessa maneira:


if ( $request_filename ~ diretorio-antigo/.+ ) {
       rewrite ^(.*) http://seudominio.com/$1 permanent;
   }

Você pode reescrever a mesma regra acima, utilizando apenas uma linha, dessa forma:


location / {
    rewrite ^/diretorio-antigo/(.*) /$1 permanent;
}

NGINX Redirecionamento de Página

Quando você reconstruir um site, é comum para remover as páginas, ou renomeá-los. Se a página não tem links de outros sites, você não quer que os usuários que clicarem no link para terra em uma página de erro 404. A melhor coisa a fazer neste caso é enviar o usuário para a página seguinte mais útil.

Utilize essa diretriz no bloco de servidor para redireccionar páginas únicas.


if ( $request_filename ~ pagina-antiga/ ) {
      rewrite ^ http://seudominio.com/proxima-pagina/? permanent;
}

Você também pode utilizar o redirecionamento de página, para disponibilizar o arquivo robots.txt e o sitemap.xml.


location ~ ^/(sitemap.xml) {
    root /var/www/blog.adlerdias.eti.br/public;
}

location ~ ^/(robots.txt) {
    root /var/www/blog.adlerdias.eti.br/public;
}

abraço,
até a próxima