Nginx proxy_cache_key e solicitação HEAD-GET

2

Eu tenho a seguinte configuração do Nginx:

http {
    ...    
    proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=3000m inactive=600m;
    proxy_temp_path /var/tmp;
    ...

    upstream webhook_staging {
        server 127.0.0.1:4001;
        keepalive 64;
    }    

    location /webhooks/incoming_mails {
        client_max_body_size 60m;
        proxy_set_header     X-Real-IP $remote_addr;
        proxy_set_header     X-Forwarded-For $remote_addr;
        proxy_set_header     X-Forwarded-Proto $scheme;
        proxy_set_header     Host $http_host;
        proxy_set_header     Connection "";
        proxy_http_version   1.1;

        # Does not work for HEAD requests
        #>> proxy_cache one;
        #>> proxy_cache_key      $scheme$host$request_uri;

        proxy_pass           http://webhook_staging;
    }
}

O servidor upstream é um processo normal do Node.js. Se eu ativar as diretivas proxy_cache_* acima, uma solicitação HEAD será passada em uma solicitação GET para o servidor upstream. Se eu desativar as diretivas, a solicitação HEAD será passada como uma solicitação HEAD e tudo ficará bem.

Alguma sugestão?

Obrigado!

    
por Alexander 13.08.2013 / 23:32

2 respostas

0

Para desativar o cache em solicitações HEAD, é necessário usar alguma lógica extra, por exemplo:

server {
  ...

  resolver 127.0.0.1;

  location / {

    error_page 420 = @skip_cache;
    error_page 421 = @use_cache;

    if ( $request_method = 'GET' )
    {
      return 421;
    }

    return 420;
  }

  location @use_cache {
    internal;

    proxy_cache cache;
    proxy_cache_key "...";
    proxy_cache_valid 200 1h;
    proxy_buffering off;
    proxy_pass ...;
  }

  location @skip_cache {
    internal;
    proxy_buffering off;
    proxy_pass ...;
  }
}

Não encontrei uma maneira de impedir que o nginx altere o HEAD para GET quando o cache estiver ativado: - (.

    
por 04.09.2014 / 21:00
0

Essa pergunta é muito antiga, mas ainda é relevante e não é respondida. Eu passei várias horas tentando encontrar uma solução para isso, o Nginx do v.1.9.7 inclui um novo recurso que faz exatamente o que você quer.

Adicione isto à sua configuração:

proxy_cache_convert_head off;
proxy_cache_methods GET HEAD;
proxy_cache_key $scheme$request_method$proxy_host$request_uri;

A primeira linha desativa a conversão da solicitação http e a segunda linha permite o armazenamento em cache das solicitações HEAD além de GET. Terceira linha adicione $ request_method ao proxy_cache_key, assim pedidos de cabeça serão armazenados em cache como um arquivo separado.

    
por 18.01.2016 / 12:45