Defina os cabeçalhos "Expires" e "Cache-Control" no Nginx

1

Eu tenho um site php em execução em um droplet DigitalOcean (nginx server) e também uso o Cloudflare. Recentemente, meu site foi atingido por algo que eu ainda não entendi .. como o meu uso da CPU foi geralmente 1-2% e foi para 100% por algumas horas, resultando em meu servidor falhando.

Minha análise do Cloudflare mostrou um número extremamente alto de visitantes, dos quais eu tenho certeza que não era o tráfego humano.

A Cloudflare pediu para ver meus logs de erro e logs de acesso do nginx. A seguir, a resposta deles -

You have 2 caching headers that are going to expire your assets as soon as they get stored at our edge.

< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

e

< Expires:> Thu, 19 Nov 1981 08:52:00 GMT. 

Because the Expires header is set to sometime in the past, the cache is going to be expired the moment it hits our edge. Then you have your cache-control header basically saying do not store any of the assets at our edge, but you have a caching enabled, so our edge will continue to crawl your site. This can cause what looks like a DoS attack against your origin.

Alguém por favor pode me dizer como posso definir o cabeçalho e o cabeçalho de controle de Expires no meu servidor Nginx?

Sua resposta é bem-vinda, obrigado!

    
por codemode 24.04.2016 / 02:08

2 respostas

4

Você tem uma configuração incorreta no arquivo php.ini :

O valor session.cache_limiter está definido como nocache no arquivo php.ini padrão e precisa ser alterado.

session.cache_limiter deve ser definido e definido como public , que insere cabeçalhos de controle de cache públicos, ou '' (em branco), que não insere cabeçalhos de controle de cache, e os cabeçalhos enviados por seu aplicativo será usado, se houver.

    
por 24.04.2016 / 02:19
3

Descobri que com o Wordpress (alguns temas) e outros aplicativos PHP às vezes é quase impossível obter os cabeçalhos configurados corretamente usando o PHP. Minha solução é que eu simplesmente ignoro os cabeçalhos que o aplicativo define e os substituo pelo que desejo no Nginx. Acho isso muito mais simples, muito mais rápido e muito mais confiável.

Se você puder descobrir como fazer isso a partir do seu aplicativo e do PHP, ótimo, mas dessa forma você tem muito controle e é fácil. Construir o nginx com o módulo requerido é mais fácil do que você imagina, isso provavelmente pode ser feito em 30 minutos, com base em um guia que eu ligo abaixo.

Eu tenho um guia sobre como configurar o Nginx e o Cloudflare.

Versão resumida do cabeçalho de armazenamento em cache:

  • Você quer o controle de cache
  • Você não quer pragma

Para imagens, use algo assim em sua localização - você precisa de um módulo headers-more compilado no nginx. Veja a parte 1 do meu tutorial para isso.

add_header Cache-Control "public, max-age=691200, s-maxage=691200";
more_clear_headers Server; more_clear_headers "Pragma"; more_clear_headers "Expires";

Para páginas eu não coloco em cache no CloudFlare, mas eu uso cache de páginas nginx fast_cgi, que está no meu tutorial.

Para CloudFlare, você pode precisar usar regras de páginas se precisar de algo complicado, mas, em geral, as configurações padrão armazenam as imagens em cache, mas não as páginas.

    
por 24.04.2016 / 03:17

Tags