Вопрос или проблема
У меня есть веб-сервер, работающий на Apache. Кэширование включено через cache_disk_module
.
CacheRoot "/var/cache/httpd/mod_cache"
CacheDirLevels 1
CacheDirLength 1
Я хотел бы перечислить URL-адреса объектов в кэше. Если я использую встроенную команду htcacheclean
с флагом -A
для запроса кэша, она возвращает только 64 объекта:
htcacheclean -A -p/var/cache/httpd/mod_cache
Вывод: 64 строки, каждая из которых выглядит как этот пример:
http://<ACTUAL-URL-HERE> 823 102014 200 0 1603846099818215 1603849699818215 1603846099807137 1603846099818215 1 0
Те записи, которые действительно выводятся, выглядят корректно и содержат ожидаемые URL-адреса.
Однако, если я запускаю команду “find”, чтобы подсчитать количество файлов .header
, я получаю намного больше, чем 64:
# find /var/cache/httpd/mod_cache -name '*.header' | wc -l
30440
#
Версия Apache – та, что в данный момент предоставляется с дистрибутивом CentOS 7.8: версия 2.4.6 с различными патчами, портированными назад.
Из руководства:
-A List the URLs currently stored in the cache, along with their
attributes in the following order: url, header size, body size, status,
entity version, date, expiry, request time, response time, body
present, head request.
…
LISTING URLS IN THE CACHE
By passing the -a or -A options to htcacheclean, the URLs within the
cache will be listed as they are found, one URL per line. The -A option
dumps the full cache entry after the URL, with fields in the following
order:
…
Кто-нибудь может подсказать, что происходит? Как я могу выгрузить полный список URL-адресов кэшированных объектов, используя htcacheclean
?
Хеш-репрезентация, с которой htcacheclean кодирует URL-адреса, включает алфавитно-цифровые символы плюс @ и _, или 64 возможных символа. Установка CacheDirLength 1
с CacheDirLevels 1
даст вам 64 директории, в которые будет разделено кэширование всех URL-адресов вашего сайта.
В конце имени подкаталога, образованного остатком хеша (символы хеша, которые не использовались в имени директории), за которым следует .header, вы также можете увидеть .vary. В большинстве случаев ваша конфигурация сервера разрешит
Header set Vary "Accept-Encoding"
и, возможно, другой или более заголовков, которые могут вызвать кэширование разных версий данных для данного URL. Один из распространенных, который может быть незаметным – это User-Agent, для которого существует множество возможных значений. Если это так, у вас может быть большое количество файлов с заголовками, кэшированных в любой из этих директорий, если множество различных браузеров посетило один и тот же URL.
Если вам не нужны все детали, которые возвращает htcacheclean -A
, попробуйте использовать htcacheclean -a
вместо этого. URL-адреса одинаковы, но формат проще для разбора.
Наконец, вы упоминаете, что ваша директория кэширования находится в /var/cache/httpd/mod_cache
, а не по умолчанию в /var/cache/[httpd или apache2]/mod_cache_disk
. Нет никакой проблемы в её перемещении, но убедитесь, что эта директория соответствует тому, что указано в конфигурационном файле /etc/default/apache-htcacheclean
.
.
Ответ или решение
Теория
Команда htcacheclean
предназначена для управления кешем Apache, когда используется модуль cache_disk_module
для кэширования. Параметр -A
должен выводить список всех URL-адресов вместе с атрибутами каждого элемента, что позволяет администратору сервера анализировать данные в кэше более детально. Однако не всегда это работает, как ожидается, особенно когда данные кэша структурированы в сложной иерархии.
Пример
Опираясь на вашу конфигурацию: кеш структурирован с параметрами CacheDirLevels 1
и CacheDirLength 1
. Это означает, что кэш распределяется между 64 директориями (каждый символ имени директории может принимать одно из 64-х значений), что объясняет, почему htcacheclean -A
может возвращать именно 64 записи, так как он, вероятно, обрабатывает только по одному элементу из каждого каталога.
Применение
-
Проверка конфигурации: Убедитесь, что путь к кэшу, указанный в Apache, соответствует тому, что указан в конфигурационном файле
/etc/default/apache-htcacheclean
. Это ключевое место, где могут возникнуть расхождения, если пути не совпадают. -
Изменение настроек кеша: Рассмотрите возможность изменения параметров
CacheDirLevels
иCacheDirLength
для более равномерного распределения и обработки файлов в кэше. Это позволитhtcacheclean
более эффективно обходить кэш. -
Альтернативные команды: Попробуйте использовать
htcacheclean -a
, чтобы получить упрощенный список URL-адресов, если только URL важны, а не расширенные атрибуты. Это, возможно, даст более полный список. -
Диагностика каварианции: Проверьте использование заголовков
Vary
. Если кэширование зависит от заголовков, таких какUser-Agent
, это может приводить к множественным версиям одного и того же URL и значительному увеличению числа.header
файлов. -
Анализ структуры кэша: Поскольку вы обнаружили 30440
.header
файлов, это может свидетельствовать о значительном объеме кэшированных данных, появившихся вследствие кавариационных факторов. Распределите нагрузку на кэширование, временно отключая некоторые вариационные заголовки (например,User-Agent
), для диагностики или используя специальные инструменты анализа.
Следуя этим шагам, вы сможете лучше управлять кэшированием Apache и диагностировать проблемы, связанные с отображением кэша при помощи команды htcacheclean
.