A invalidação do cache Nginx só funciona se chamada a partir do mesmo domínio

1

Estou usando o módulo ngx_cache_purge do FRiCKLE para invalidar caches de proxy. Eu tive um problema de não poder limpar caches ao acessar o URL de invalidação com uma parte HOST diferente da URL do que aquela usada para acessar o conteúdo original. Por exemplo, se eu acessar o conteúdo assim:

curl -H 'Content-Type: application/json' -d '{ "token": "pts7v4nqf7stfq35qeb570v5n2" }' -X POST -D - http://api.example.com/news/article/cache-testing

O arquivo de cache é criado com uma chave propper e funciona, as solicitações subsequentes são exibidas corretamente. Quando o conteúdo é alterado, a fim de limpar os dados em cache, o backend faz o equivalente em todos os servidores da Web:

curl -D - http://10.200.100.101:8080/invalidate_cached_url/POST/news/article/cache-testing

E isso retorna 404, já que o arquivo de cache está sendo gerado de alguma forma com host parte do URL e, para eliminá-lo, preciso chamar o URL de invalidação com o mesmo host na linha. Isso é um problema, pois tenho um balanceador de carga na frente da webstack.

Para provar isso, salvei o arquivo de cache gerado com o método acima e limpei o cache, depois visitei o ponto de extremidade da API diretamente com o endereço IP:

curl -H 'Content-Type: application/json' -d '{ "token": "pts7v4nqf7stfq35qeb570v5n2" }' -X POST -D - http://10.200.100.101:8080/news/article/cache-testing

Agora, quando tento limpar o cache como acima, funciona. E é verdade que os arquivos de cache são diferentes, mas em um nível binário, mas as chaves são as mesmas.

Existe alguma maneira de contornar isso?

Aqui está minha configuração:

proxy_cache_path /tmp/nginx/example-api levels=1:2 keys_zone=example_api_zone:300m inactive=1h;

upstream origin_api {
    server localhost:8888;
}

server {
    listen 8080 default_server;
    server_name  api.example.com;

    proxy_buffering on;
    proxy_buffer_size 1k;
    proxy_buffers 24 4k;
    proxy_busy_buffers_size 8k;
    proxy_max_temp_file_size 2048m;
    proxy_temp_file_write_size 32k;

    proxy_cache_key $request_method$uri;

    access_log /var/log/nginx/example-api.access.log;
    error_log /var/log/nginx/example-api.error.log;

    error_page 500 502 /502.html;
    location = /502.html {
      internal;
      root /opt/errors;
    }

    location / {
      gzip on;
      include example_proxy_params.conf;
      proxy_cache_bypass $http_cache_control;
      proxy_cache_methods POST GET;
      proxy_pass http://origin_api;
    }

    location ~ ^/news/singlearticle/ {
      gzip on;
      proxy_hide_header Cache-Control;
      add_header Cache-Control 'max-age=10s, no-cache ,public';
      include example_proxy_params.conf;
      proxy_cache_bypass $http_cache_control;
      proxy_cache_methods POST GET;
      proxy_pass http://origin_api;
    }

    location ~ ^/news/subcategory/ {
      proxy_cache_key "$request_method$request_uri|$request_body";
      include example_proxy_params.conf;
      proxy_cache_bypass $http_cache_control;
      proxy_cache_methods POST GET;
      proxy_pass http://origin_api;
    }

    location ~ /invalidate_cached_url/(.*) {
      allow 127.0.0.1;
      allow 10.200.100.101;
      allow 10.200.100.102;
      deny all;
      proxy_cache_purge example_api_zone $1;
    }

}
    
por Athropos 02.02.2016 / 15:43

2 respostas

0

Acontece que a solução é adicionar um Origin header, já que o nginx realmente o usa para criar o arquivo hash, e também faz sentido se você pensar sobre isso. Isso é bem sucedido em qualquer IP permitido:

curl -H 'Origin: http://testing.bktvnews.com' -D - http://10.200.100.101:8080/invalidate_cached_url/POST/news/article/cache-testing
    
por 03.02.2016 / 08:51
0

Defina o nome do host no comando curl , por exemplo:

curl -H "Host: api.example.com" -D - http://192.168.255.230:8080/invalidate_cached_url/....
    
por 02.02.2016 / 17:32

Tags