CDN: Sincronizando o cache em máquinas de borda

1

Eu criei um CDN barato para meu website estático com base no cache HTTP do nginx.

Contexto. Veja algumas partes da minha configuração de cache:

proxy_cache_key "$scheme://$host$uri"; 
proxy_cache_valid 200 301 302 1200d; 

Eu tenho uma máquina de origem e cerca de 10 máquinas de ponta, todas voltando à origem em vários locais. A origem também se dobra como uma borda. O cache em todas essas máquinas está aquecido.

Agora, de vez em quando, o conteúdo em um URL específico será atualizado. Com uma sessão fixa em um ambiente balanceado de carga, isso significa que o cache em uma borda e a origem serão invalidadas usando a mecânica proxy_cache_bypass (atualizei o conteúdo da seção admin e visitei a URL. Nginx faz um proxy BYPASS atualizando o conteúdo porque eu tenho um conjunto cookie.)

O problema aqui é que, em todos os outros pontos de presença, a validade do cache para esse URL específico é de no máximo 1200 dias. O que significa que eles nunca buscarão a origem.

Em um cenário como este, como garantir que o cache seja atualizado em todos os meus servidores de borda ?

Uma abordagem sugerida aqui é fazer algo assim:

Faça um loop por todas as bordas e execute

curl -o /dev/null -k -I --resolve cdn.yourdomain.com:80:127.0.0.1 https://cdn.yourdomain.com/img/logo.png 

Existe uma abordagem correta para isso?

    
por Quintin Par 21.09.2018 / 03:17

2 respostas

4

Acho que seria mais fácil simplesmente definir cabeçalhos Cache-Control: max-age=... razoáveis nas respostas de origem do que forçar manualmente os caches a atualizar determinado conteúdo. Em seguida, nos caches nginx, se você tiver proxy_cache_revalidate on on, os caches somente verificarão a origem de determinado conteúdo uma vez a cada max-age período. Se o conteúdo da origem não for alterado, o nginx continuará a ser exibido a partir do cache. No entanto, se o conteúdo de origem for alterado, o nginx recuperará e armazenará a cópia nova e iniciará o processo novamente, verificando novamente quando max-age expira a seguir.

    
por 21.09.2018 / 06:27
1

1200 dias muito.

Eu não vejo realmente como esse comando curl ajuda a atualizar o cache (se o URL já existir no cache)

Você precisa limpar de alguma forma o cache nas bordas.

A assinatura comercial tem um método proxy_cache_purge ( link ), mas eu acho que você não tem isso.

Uma alternativa gratuita, um antigo módulo da Frickle, ngx_cache_purge ( link ), mas a verdade a ser dita, eu não t usado com versões recentes do Nginx. Uma rápida pesquisa no google sugere que ainda funciona. Você poderia ter algo assim em todas as configurações de borda:

        location ~ /purge(/.*) {
            allow              1.2.3.4;
            deny               all;
            proxy_cache_purge  tmpcache $1$is_args$args;
        }

Em seguida, a partir de 1.2.3.4 você poderia executar algo como curl -H "Host: yourdomain.com" http://5.6.7.8/purge/path/to/file.jpg" , onde 5.6.7.8 é o primeiro IP de borda (isso excluiria /path/to/file.jpg nessa borda). Então você deve percorrer todos os outros servidores de borda ip's

    
por 26.09.2018 / 23:13