Este é um erro nginx proxy_cache?

2

Eu tenho uma configuração de proxy muito simples:

http {
    proxy_cache_path /var/www/cache levels=1:2 keys_zone=s3-images-cache:50m inactive=1M max_size=1000m;
    proxy_temp_path /var/www/cache/tmp;

    server {
        listen 80;
        server_name images.example.com;

        location / {
            proxy_cache s3-images-cache;
            proxy_cache_key $scheme$proxy_host$uri$is_args$args;
            proxy_cache_bypass $http_purge_cache;
            proxy_cache_valid any 1y;
            proxy_pass http://images-example.s3.amazonaws.com;
            add_header X-Cache $upstream_cache_status;

            proxy_intercept_errors on;
            error_page 404 = @no_image;
        }

        location @no_image {
            return 403;
        }
    }
}

Agora me siga aqui:

  1. Vamos solicitar o /image.jpg.
  2. A solicitação é enviada ao proxy para /image.jpg (ainda não existe).
  3. Backend responde com 404.
  4. "proxy_intercept_errors em" entra em ação e "error_page 404 = @no_image" é chamado.
  5. Nginx retorna 403.
  6. Faça outra solicitação para a mesma imagem e veja que "X-Cache: HIT" está configurado. Estamos claramente atingindo o cache do proxy.

Mas, se verificarmos / var / www / cache / folder neste momento, veremos que não há nenhum item de cache criado para este pedido. Então isso significa que o Nginx mantém o cache para ele na memória e esqueceu de gravar no arquivo?

  1. Vamos enviar /image.jpg para o backend.
  2. Agora, solicite "PURGE-CACHE: 1" para essa imagem. Vemos que agora obtemos a imagem em vez de 403 com o cabeçalho "X-Cache: BYPASS" presente. Bom.

Se verificarmos / var / www / cache /, veremos que o arquivo de cache agora está finalmente criado para este pedido. Olhando dentro do arquivo em cache, vemos que é a nossa imagem.

  1. Agora, aqui está o problema: vamos solicitar / image.jpg novamente com uma solicitação GET normal. Devemos ter a imagem recém-enviada correta?
  2. O Nginx retorna 403 com "X-Cache: HIT". Por quê? Parece que está acertando o cache, mas retornando outra coisa, não o que está na pasta / var / www / cache? Como?

Minha única explicação para isso é que parece que o Nginx está armazenando em cache a resposta na memória e não escreve no arquivo quando estamos atingindo o erro com a nossa página de erro customizada nas respostas do proxy. Além disso, ao usar proxy_cache_bypass, ele não sobrescreve o cache na memória, de modo que as solicitações subseqüentes ao mesmo item usem o cache antigo que está armazenado na memória e não o novo criado na pasta cache.

Alguém poderia, por favor, me avisar se eu estou fazendo algo errado ou isso realmente é um bug. Passou 3 dias lutando contra isso.

UPDATE: Backend retorna um conjunto normal de cabeçalhos que você esperaria do S3 nas respostas 200 e 404:

404

Connection:close
Content-Type:application/xml
Date:Fri, 20 Nov 2015 07:41:39 GMT
Server:AmazonS3
Transfer-Encoding:chunked
x-amz-id-2:bH8L/1dOVGShsGJdZZ/zS/X6UkHS+KMAxDxnPvOkIalpPphFJXr9zZ1RiV6L2a13NXoZ3QdCOeE=
x-amz-request-id:D66FDBFAA9643252

200

Accept-Ranges:bytes
Connection:keep-alive
Content-Length:10533
Content-Type:image/jpeg
Date:Fri, 20 Nov 2015 07:47:12 GMT
ETag:"061b4dae0b2bbdf4a4fa212951f4ba79"
Last-Modified:Wed, 11 Nov 2015 14:29:09 GMT
Server:AmazonS3
x-amz-id-2:qsSmH/gkvql2jnj67p0vguZBXQJHfS+Yk70llBaDvbgH0xSCbvj9G9JlKn5WhWTdty0+JzApN7k=
x-amz-request-id:8CF04EA869190E63
    
por Denis Pshenov 09.11.2015 / 09:53

0 respostas