Назад | Перейти на главную страницу

CDN: синхронизация кеша на пограничных машинах

Я построил дешевый CDN для своего статического веб-сайта на основе HTTP-кеширования nginx.

Контекст. Вот некоторые части моей конфигурации кеша:

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

У меня есть одна исходная машина и около 10 периферийных машин, которые проксируются обратно в исходную точку в разных местах. Начало также удваивается как одно ребро. Кэш на всех этих машинах прогрет.

Теперь время от времени содержимое определенного URL-адреса будет обновляться. С липким сеансом в среде с балансировкой нагрузки это означает, что кеш на одном краю и источник будут аннулированы с помощью механизма proxy_cache_bypass (я обновил контент из раздела администратора и перешел по URL-адресу. Nginx выполняет BYPASS прокси, обновляя контент, потому что у меня есть установить cookie.)

Проблема здесь в том, что во всех других периферийных местоположениях срок действия кеша для этого конкретного URL составляет не более 1200 дней. Это означает, что они никогда не получат исходную информацию.

В таком сценарии, как я обеспечиваю кеш обновлен на всех моих пограничных серверах?

Один подход, предложенный здесь сделать что-то вроде этого:

Перебери все края и беги

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

Есть ли к этому правильный подход?

Думаю, проще было бы просто установить разумные Cache-Control: max-age=... заголовки в ответах источника, чем заставлять кеши вручную обновлять определенный контент. Затем в кешах nginx, если у вас proxy_cache_revalidate on включен, кеши будут проверять источник для определенного контента только один раз в max-age период. Если контент в источнике не изменился, то nginx продолжит обслуживание из своего кеша. Однако, если исходный контент изменится, nginx получит и сохранит новую копию и запустит процесс заново, снова проверяя, когда max-age истекает следующий.

1200 дней - это много.

Я действительно не понимаю, как эта команда curl помогает обновить кеш (если URL-адрес уже существует в кеше)

Кэш по краям нужно как-то прочистить.

В коммерческой подписке есть метод proxy_cache_purge ( http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_purge ), но я думаю, у вас этого нет.

Бесплатная альтернатива, старый модуль от Frickle, ngx_cache_purge ( https://github.com/FRiCKLE/ngx_cache_purge ), но по правде говоря, я не использовал с последними версиями Nginx. Быстрый поиск в Google показывает, что это все еще работает. У вас может быть что-то подобное в каждой конфигурации ребра:

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

Затем с 1.2.3.4 вы можете выполнить что-то вроде curl -H "Host: yourdomain.com" http://5.6.7.8/purge/path/to/file.jpg" , где 5.6.7.8 - это IP-адрес первого края (это приведет к удалению /path/to/file.jpg на этом краю). Затем вы должны пройти через все остальные IP-адреса пограничных серверов