nginx usa cache de proxy se o back-end estiver inativo

11

Eu preciso do proxy nginx usar cache se o servidor de back-end estiver inativo:

esta é a minha configuração. mas parece que o nginx usa cache sem verificar o servidor back-end.

http {

  # ...

  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_cache_path /tmp/nginx levels=1:2 keys_zone=tmpzone:10m inactive=60m;
  proxy_cache_key "$scheme$request_method$host$request_uri";


  server {
    server_name _;

    location / {
      proxy_connect_timeout 5s;
      proxy_read_timeout 5s;
      proxy_cache tmpzone;
      proxy_cache_valid      200 304 1d;
      proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host 'www.example.com';
      proxy_pass http://www.example.com;
    }
  }
}

A pergunta é como posso ignorar o cache do proxy se o servidor back-up estiver ativo? E quando o servidor back-up está ativo, meu servidor proxy não usa cache.

sweb
fonte
Qual é exatamente a pergunta?
Jenny D
A pergunta é como posso ignorar o cache do proxy se o servidor back-up estiver ativo?
SWEB
Uma solução pronta para uso pode ser ter 2 "servidores" em execução, um com cache, outro sem cache e usar o módulo upstream nginx.org/en/docs/http/ngx_http_upstream_module.html ? A melhor solução provavelmente seria capaz de usar proxy_cache_bypass com uma verificação se o back-end está lá ou não ... embora eu não tenha idéia de como fazê-lo funcionar ... caso interessante.
SvennD
As soluções para esta instância de um problema XY podem ser encontradas no SO
Dayo

Respostas:

8

Parece uma duplicata disso:

/programming/16756271/how-to-configure-nginx-to-serve-cached-content-only-when-backend-is-down-5xx-re

Em resumo, use proxy_cache_use_stale

Como uma atualização, eu testei isso e funciona bem. Fiz o teste na minha estação de trabalho, onde tenho (por completo):

Fedora 23 nginx 1.8.1 configurado como terminador ssl + cache + proxy reverso Apache 2.4.18 configurado para escutar na porta 80

Com o apache atuando como upstream, servindo apenas um arquivo estático, fiz este teste:

  1. Apache up, nginx up, apontando o navegador para a URL em proxy reverso servida por nginx. Eu vejo o conteúdo em proxy do Apache. Nesse ponto, o nginx mantém isso no cache.
  2. Apache parado
  3. conectando ao nginx, vejo o arquivo em cache como servido anteriormente pelo Apache.

A configuração do nginx que usei é (apenas as partes interessantes):

nginx.conf:

http {
[...]
location
    proxy_cache_path        /var/lib/nginx/tmp/proxy/ levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/local.conf:

upstream localhost {
    server 127.0.0.1:80;
[...]
}


server {
    listen       127.0.0.1:443 ssl;

[...]

    location /be/ {
        proxy_pass              http://localhost;
        proxy_cache             STATIC;
        proxy_cache_valid       200 1d;
        proxy_cache_use_stale   error;
}
Fredi
fonte
Não funciona, tente.
sweb 9/02/16
Caso você deva relatar um bug para a equipe nginx. O que você tentou btw? No caso vou tentar reproduzi-lo
Fredi
Ok, eu fiz um teste e funcionou bem. Atualizei minha resposta com os detalhes do teste.
Fredi
Portanto, minha leitura da pergunta original de sweb foi a de que, no estado do Apache e do nginx up, todas as solicitações deveriam passar para o backend do Apache. Os pedidos só deve ser servido a partir do cache Nginx sse Apache é baixo
abhishekmukherg
@abhishekmukherg, você pode fazer o que diz, mas por quê? Quando ambos estão ativos e os arquivos estão estáticos (pense em jpg / css / html), por que ir para o back-end usando mais recursos de rede / cpu / ecc quando você tem um front-end real? BTW esta é uma questão para outra pergunta embora
Fredi
0

Use proxy_intercept_errors e proxy 500s para um servidor com o cache ativado.

chugadie
fonte