Tagnginx

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.

Gzip Requisições HTTP com NGINX

Se você utiliza já utiliza o Nginx, provavelmente você se importa com desempenho, e uma das maneiras mais fáceis de ganhar desempenho é compactar em Gzip as requisições HTTP. O Gzip pode não só aumentar o desempenho do seu site, como também economizar a banda.

Como o Gzip funciona

De uma forma bem simplificada, a compressão em gzip funciona, encontrando strings semelhantes dentro de um arquivo de texto, e substituindo aquelas strings temporariamente para fazer o tamanho total do arquivo menor. Esta forma de compressão é particularmente adequada para a web porque o HTML e CSS geralmente contém muitas strings repetidas, como espaços em branco, tags e definições de css.

Se você utiliza o Nginx no Linux, você, provavelmente já possui o gzip instalado.

Você pode adicionar essas diretivas no http, server ou ainda na location do seu arquivo de configuração do nginx, dependendo apenas das suas necessidades.

gzip on;  
gzip_proxied any;  
gzip_types text/plain text/css text/javascript text/xml application/xml application/xhtml+xml application/xml+rss;  
gzip_disable "MSIE [1-6].";  

Explicando as diretivas

gzip on; – Habilitamos a compressão Gzip.
gzipproxied any; – Aplica a compressão Gzip em todas as requisções. Você pode ver a lista com todos os parâmetros aqui – gzipproxied.
gziptypes text/plain text/css text/javascript text/xml application/xml application/xhtml+xml application/xml+rss; – Tipos de conteúdo que serão comprimidos com Gzip. Perceba que text/html já é habilitado por padrão, e irá gerar um aviso se você adicioná-lo aqui.
gzip*disable “MSIE [1-6].” – Serve para desabilitarmos a compressão com Gzip para as versões muito antigas do Internet Explorer.

Outras Configurações Gzip

Existem algumas outras configurações que podem ser utilizadas que não foram listadas acima. Ou seja, você pode personalizá-lo ainda mais. Eu não vejo qualquer razão para mudar estes dos valores padrão, mas acredito que valha a pena citá-los.

gzipcomplevel

Você pode aumentar o nível de compressão, pagando o preço do trabalho do servidor. O nível padrão é 1, que é o que a maioria das pessoas utilizam. É geralmente aceito que o aumento gzipcomplevel é um anti-pattern de desempenho, uma vez que leva mais tempo para comprimir do que a economia que será gerada por essa compressão extra.

gzipminlength

Com essa diretiva, você pode definir o tamanho mínimo do arquivo em bytes para que o mesmo seja comprimido utilizando Gzip. O valor padrão é de 20 bytes.

Se você quiser ler mais sobre Gzipping com o servidor nginx, recomendo a documentação oficial.

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

© 2017 Adler Dias

Theme by Anders NorénUp ↑