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-адреса других пограничных серверов.