htcacheclean с флагом “-A” отображает только 64 записи кеша, где остальные?

Вопрос или проблема

У меня есть веб-сервер, работающий на 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 записи, так как он, вероятно, обрабатывает только по одному элементу из каждого каталога.

Применение

  1. Проверка конфигурации: Убедитесь, что путь к кэшу, указанный в Apache, соответствует тому, что указан в конфигурационном файле /etc/default/apache-htcacheclean. Это ключевое место, где могут возникнуть расхождения, если пути не совпадают.

  2. Изменение настроек кеша: Рассмотрите возможность изменения параметров CacheDirLevels и CacheDirLength для более равномерного распределения и обработки файлов в кэше. Это позволит htcacheclean более эффективно обходить кэш.

  3. Альтернативные команды: Попробуйте использовать htcacheclean -a, чтобы получить упрощенный список URL-адресов, если только URL важны, а не расширенные атрибуты. Это, возможно, даст более полный список.

  4. Диагностика каварианции: Проверьте использование заголовков Vary. Если кэширование зависит от заголовков, таких как User-Agent, это может приводить к множественным версиям одного и того же URL и значительному увеличению числа .header файлов.

  5. Анализ структуры кэша: Поскольку вы обнаружили 30440 .header файлов, это может свидетельствовать о значительном объеме кэшированных данных, появившихся вследствие кавариационных факторов. Распределите нагрузку на кэширование, временно отключая некоторые вариационные заголовки (например, User-Agent), для диагностики или используя специальные инструменты анализа.

Следуя этим шагам, вы сможете лучше управлять кэшированием Apache и диагностировать проблемы, связанные с отображением кэша при помощи команды htcacheclean.

Оцените материал
Добавить комментарий

Капча загружается...