problema de cache nginx com vários upstreams

1

Eu tenho um problema estranho com proxy nginx + proxy de configuração de cache para dois upstreams idênticos. Eu tenho dois servidores upstream idênticos configurados em uma configuração ativa / de backup. O cache está funcionando bem para um dos servidores, mas assim que eu alterno a configuração ativa / backup e recarrego o nginx, não obtenho nenhuma ocorrência de cache, e o log de erros é preenchido com os seguintes:

2017/06/15 10:14:21 [warn] 19048#19048: *2562 an upstream response is buffered to a temporary file /mnt/cache/temp/0000000504 while reading upstream, client: <CLIENT IP>, server: , request: "GET /secure/assets/file.ts?id=456 HTTP/1.1", upstream: "http://<UPSTREAM IP>:80/assets/file.ts", host: "server-host"

Agora, não consigo descobrir por que o nginx precisa armazenar em buffer as respostas de um dos upstreams e não do outro, já que os servidores upstream têm exatamente os mesmos arquivos e estão na mesma rede.

Agora, as partes relevantes da configuração:

http {

    tcp_nodelay on;

    proxy_cache_path /mnt/cache/cache keys_zone=one:20m inactive=24h loader_threshold=300 loader_files=200 max_size=180g;
    proxy_cache_key $uri;

    upstream master-cdn {
        server cdn1 backup max_fails=10 fail_timeout=60s;
        server cdn0 max_fails=10 fail_timeout=60s;
        keepalive 10;
    }

    proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_403 http_404;

        server {

                listen 80;
                if_modified_since off;
                add_header          Cache-Control no-cache;
                add_header          Pragma "no-cache";
                root                /var/www/html;

                location /assets {
                        sendfile on;
                        tcp_nopush on;
                        internal;
                        proxy_pass http://master-cdn;
                        proxy_cache             one;
                        proxy_cache_min_uses    1;
                        proxy_cache_lock        on;
                        proxy_cache_valid       200 24h;
                        proxy_temp_path /mnt/cache/temp;
                }
}

Observação: os clientes estão acessando a /secure url, que é enviada para um servidor de aplicativos, que usará o cabeçalho X-Accel-Redirect para informar ao nginx para veicular o arquivo estático a partir do local interno.

Toda a configuração funciona bem, mas apenas com o servidor upstream cdn0 . Assim que eu movo a instrução backup para o servidor cdn0 e recarrego o nginx, eu recebo o buffer do upstream e os erros do cache.

Alguém tem alguma idéia sobre como depurar isso ainda mais?

Obrigado antecipadamente.

    
por kralewitz 15.06.2017 / 10:35

1 resposta

1

Eu consegui resolvê-lo. Com a ajuda do log de depuração, descobri que um dos servidores upstream está incorretamente (o conteúdo é estático e não expira) enviando Cache-Control e Expires cabeçalhos com a resposta, que então bagunça o cache nginx ( os servidores upstream não estão sob meu controle, infelizmente).

Eu adicionei essas duas instruções ao local com proxy:

proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;

E o armazenamento em cache funciona bem agora em ambos os servidores upstream.

    
por 15.06.2017 / 11:38