@artinnok
бекенд-программист

Проблемна ли инвалидация кэша в Nginx?

Встал вопрос кэширования сайта - предлагается три варианта:
  1. Memcached
  2. Nginx HTML cache
  3. Varnish

Про Memcached и Varnish что-то слышали, материал нашли, но вот про Nginx говорят, что у него проблемная инвалидация HTML кэша - это правда? Если да, то почему она является проблемной и можно ли это решить?
  • Вопрос задан
  • 734 просмотра
Пригласить эксперта
Ответы на вопрос 2
neatsoft
@neatsoft
Life is too short for bad software
Только что закончил систему кэширования для высоконагруженного проекта на django + nginx, никаких проблем с инвалидацией не испытал. memcached + nginx microcaching. Принцип работы следующий:
  • nginx проверяет наличие данных в memcached с помощью memcached_pass, если нашел - возвращает;
  • django при рендеринге страницы помещает результат в memcached, при изменении - удаляет.

В исходном виде у этой связки есть только одна проблема - обработка конкурирующих запросов. Если несколько клиентов одновременно попытаются запросить одну и ту же "непрогретую" страницу, то все запросы уйдут в бэкенд (ab -n 1000 -c 100). К счастью, nginx легко позволяет это предотвратить с помощью микрокэширования (uwsgi_cache_valid any 1s; uwsgi_cache_use_stale updating;). В бэкенд при этом уходит только самый первый запрос, параллельные получают результат из файлового кэша, последующие - из memcached. Не слишком элегантно, появляется дополнительный слой кэширования (файловый), но работает отлично. На реальных данных удалось получить ускорение в 1200 раз и неограниченную возможность масштабирования (с помощью дополнительных серверов с nginx в режиме микрокэширования между клиентом и основным сервером).
Ответ написан
Комментировать
JusTsar
@JusTsar
Spoiler
В NGINX есть fastcgi_cache_purge который доступен на коммерческой подписке. В остальных случаях писать скрипт или использовать плагин для cms, которые будут дергать NGINX, чтобы он очистил кеш, когда у вас меняется страница на сайте. Обязательно исключить этот скрипт из кэширования, а также не забудьте ограничить доступ к нему!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы