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 

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

2 ответа

Я думаю, что было бы проще просто установить разумные 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), но, думаю, у вас его нет.

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

        location ~ /purge(/.*) {
            разрешить 1.2.3.4;
            отрицать все;
            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-адреса других пограничных серверов.

Другие вопросы по тегам