У нас очень динамичное приложение с высоким трафиком, и мы используем кеширование NGINX с динамическими URL-адресами. Мы хотим кэшировать эти URL-адреса для повторных запросов.
Мы несколько раз сталкивались с проблемой при масштабировании, когда мы достигаем максимального количества записей в keys_zone
а затем сервер начинает выдавать 500 ошибок и пустые ответы от сервера для новых URL-адресов / файлов, которые никогда не запрашивались ранее. Видеть Nginx: `` нет памяти в зоне ключей кеша '', несмотря на много места для справки
Примеры ошибок:
[crit] 30568#0: ngx_slab_alloc() failed: no memory in cache keys zone "PAGES"`
[alert] 27697#27697: could not allocate node in cache keys zone "PAGES"
Наш кеш:
proxy_cache_path /usr/share/nginx/cache levels=1:1:2 keys_zone=PAGES:50m inactive=7d max_size=900m;
Расширение keys_zone
размер или перезапуск временно решают проблему. Но мы стремимся поддерживать фиксированный кеш, который очищает старые неиспользуемые записи, а не расширяет keys_zone для поддержки каждого файла / URL, который мы могли бы обслуживать.
Вопросы, если у кого-то есть контекст того, как работает NGINX:
keys_zone
со временем. Если мы сделаем max_size
достаточно маленький, перестанет ли он создавать новые записи в keys_zone
, а вместо этого перезаписывать существующие?inactive
param тоже имеет что-то из-за keys_zone
? Поскольку наш неактивный набор довольно длинный, сохраняет ли это записи в keys_zone
?keys_zone
записи без перезапуска NGINX?Вся документация есть Вот
Ответы:
Специальный процесс «диспетчера кэша» отслеживает максимальный размер кеша, установленный параметром max_size. При превышении этого размера удаляются наименее использованные данные. Данные удаляются в итерациях, сконфигурированных параметрами manager_files, manager_threshold и manager_sleep (1.11.5). За одну итерацию удаляется не более элементов manager_files (по умолчанию 100). Продолжительность одной итерации ограничена параметром manager_threshold (по умолчанию 200 миллисекунд). Между итерациями делается пауза, настраиваемая параметром manager_sleep (по умолчанию 50 миллисекунд).
Кэшированные данные, к которым не осуществляется доступ в течение времени, указанного параметром inactive, удаляются из кеша независимо от их актуальности. По умолчанию неактивно установлено на 10 минут.
Вам следует немного поиграть с различными параметрами proxy_cache_path
директиву, пока она не почувствует ваши потребности.
Предложения:
inactive=7d
вероятно, слишком высокий и сохраняет ненужный кеш на очень долгое время. Возможно, это требуется для вашего варианта использования, но обратите внимание, что по умолчанию это 10 минут.
Если вы создадите более 100 новых ключей в период между запусками «диспетчера кеша», он не сможет поддерживать его, и вам следует изменить manager_files
и / или manager_threshold
и / или manager_sleep
параметры