Раздел 2. Использование HTTP-сервера Apache RU EN Пункт 11. Кэширование контента Этот документ дополняет справочную документацию по ВведениеHTTP-сервер Apache предлагает ряд функций кэширования, предназначенных для повышения производительности сервера различными способами.
Чтобы получить максимальную отдачу от этого документа, вы должны быть знакомы с основами HTTP и прочитать Руководства пользователя по сопоставлению URL-адресов с файловой системой и согласованием содержимого. Кэширование HTTP RFC2616 с тремя состояниями
Протокол HTTP содержит встроенную поддержку встроенного механизма кэширования, описанного в разделе 13 RFC2616, и этот
В отличие от простого кэша ключей/значений с двумя состояниями, когда содержимое полностью исчезает, когда оно перестает быть свежим, кэш HTTP включает в себя механизм сохранения устаревшего контента и запроса исходного сервера, изменился ли этот устаревший контент, и если нет, снова сделать его свежим. . Запись в кэше HTTP существует в одном из трех состояний:
Полную информацию о том, как работает кэширование HTTP, можно найти в разделе 13 RFC2616. Взаимодействие с серверомМодуль
Если URL-адрес не найден в кеше, Если содержимое, найденное в кеше, устарело,
Улучшение попадания в кэшКогда виртуальный хост известен под одним из множества различных псевдонимов сервера, установка этого СвежестьПравильно сформированный контент, предназначенный для кэширования, должен явно объявлять время жизни с помощью заголовков В то же время время жизни свежести, определенное исходным сервером, может быть переопределено клиентом, когда клиент представляет свой собственный
Когда это время жизни отсутствует в запросе или ответе, применяется время жизни по умолчанию. Время жизни по умолчанию для кэшированных сущностей составляет один час, однако это можно легко переопределить с помощью директивы Если ответ не включает Для локального контента или для удаленного контента, который не определяет свой собственный
Максимальное время жизни свежести также можно контролировать с помощью файла
Краткое руководство по условным запросамКогда содержимое кэша истекает и становится устаревшим, вместо передачи исходного запроса httpd изменит запрос, сделав его условным. Когда Когда условный запрос получен исходным сервером, исходный сервер должен проверить, изменился ли параметр ETag или Last-Modified в соответствии с запросом. В противном случае источник должен ответить кратким ответом «304 Not Modified». Это сигнализирует кэшу, что устаревшее содержимое все еще является свежим и должно использоваться для последующих запросов до тех пор, пока новое время жизни содержимого не будет достигнуто снова. Если содержимое изменилось, то содержимое обслуживается так, как если бы запрос не был условным с самого начала. Условные запросы имеют два преимущества. Во-первых, при выполнении такого запроса к серверу-источнику, если контент из источника совпадает с контентом в кеше, это можно легко определить и без накладных расходов на передачу всего ресурса. Во-вторых, хорошо спроектированный исходный сервер будет спроектирован таким образом, что условные запросы будут значительно дешевле, чем полный ответ. Для статических файлов, как правило, все, что требуется, — это вызов Исходные серверы должны приложить все усилия для поддержки условных запросов, насколько это практически возможно, однако, если условные запросы не поддерживаются, источник будет отвечать, как если бы запрос не был условным, а кеш будет реагировать, как если бы содержимое изменилось, и сохранит новое содержимое. в кеш. В этом случае кеш будет вести себя как простой кеш с двумя состояниями, где содержимое фактически либо свежее, либо удалено. Что можно кэшировать?Полное определение того, какие ответы могут кэшироваться кешем HTTP, определено в RFC2616, раздел 13.4 «Кэширование ответов», и его можно резюмировать следующим образом:
Что не следует кэшировать?Клиенту, создающему запрос, или исходному серверу, создающему ответ, должно решать, следует ли кэшировать контент или нет, путем правильной настройки заголовка,
Содержимое, зависящее от времени или меняющееся в зависимости от особенностей запроса, не охваченного согласованием HTTP, не должно кэшироваться. Этот контент должен объявить себя некэшируемым с помощью Если контент часто меняется, что выражается временем жизни в минутах или секундах, контент все равно может кэшироваться, однако крайне желательно, чтобы исходный сервер правильно поддерживал условные запросы , чтобы гарантировать, что полные ответы не должны генерироваться на регулярной основе. . Контент, который варьируется в зависимости от предоставленных клиентом заголовков запроса, может быть кэширован за счет интеллектуального использования заголовка Переменный/согласованный контентКогда исходный сервер предназначен для ответа различным контентом в зависимости от значения заголовков в запросе, например, для обслуживания нескольких языков по одному и тому же URL-адресу, механизм кэширования HTTP позволяет кэшировать несколько вариантов одной и той же страницы по одному и тому же URL-адресу. . Это делается сервером-источником, добавляющим Если, например, ответ получен с другим заголовком, таким как; Несколько вариантов содержимого могут кэшироваться рядом друг с другом,
Примеры настройки кэша
Кэширование на дискМодуль Обычно модуль настраивается следующим образом; CacheRoot "/var/cache/apache/" КэшВключить диск / CacheDirLevels 2 CacheDirLength 1 Важно отметить, что поскольку кэшированные файлы хранятся локально, кэширование операционной системы в памяти обычно также применяется к доступу к ним. Таким образом, хотя файлы хранятся на диске, если к ним часто обращаются, скорее всего, операционная система обеспечит их фактическое обслуживание из памяти. Понимание кэш-хранилищаДля хранения элементов в кеше Каждый символ может быть любым из 64 различных символов, что означает, что всего существует 64^22 возможных хеша. Например, URL-адрес может быть хэширован в Общая цель этого метода состоит в том, чтобы уменьшить количество подкаталогов или файлов, которые могут находиться в конкретном каталоге, поскольку большинство файловых систем замедляются по мере увеличения этого числа. При настройке «1»
Настройка
Каждый URL-адрес использует как минимум два файла в хранилище кеша. Обычно существует файл «.header», который включает метаинформацию об URL-адресе, например, когда он должен истечь, и файл «.data», который является дословной копией контента, который будет обслуживаться. В случае согласования контента через заголовок «Vary» для рассматриваемого URL будет создан каталог «.vary». В этом каталоге будет несколько файлов «.data», соответствующих различным согласованным содержимым. Обслуживание дискового кэшаМодуль Вместо этого с httpd поставляется инструмент htcacheclean, который позволяет периодически очищать кеш. Определить, как часто запускать htcacheclean и какой целевой размер использовать для кэша, довольно сложно, и для выбора оптимальных значений могут потребоваться пробы и ошибки. htcacheclean имеет два режима работы. Его можно запускать как постоянный демон или периодически из cron. htcacheclean может занять до часа или больше для обработки очень больших (десятки гигабайт) кешей, и если вы запускаете его из cron, рекомендуется определить, сколько времени занимает типичный запуск, чтобы избежать одновременного запуска более одного экземпляра. . Также рекомендуется выбрать соответствующий «хороший» уровень для htcacheclean, чтобы инструмент не вызывал чрезмерного дискового ввода-вывода во время работы сервера.
Поскольку Кэширование в memcachedИспользуя Обычно модуль настраивается следующим образом: CacheEnable socache / CacheSocache memcache:memcd.example.com:11211 Дополнительные CacheEnable socache / CacheSocache memcache:mem1.example.com:11211,mem2.example.com:11212 Этот формат также используется с другими различными CacheEnable socache / CacheSocache shmcb:/path/to/datafile(512000) CacheEnable socache / CacheSocache dbm:/путь/к/файлу данных Общее кэширование объектов с общим ключом и значением с двумя состояниями
HTTP-сервер Apache предлагает низкоуровневый кэш общих объектов для кэширования информации, такой как сеансы SSL или учетные данные аутентификации, в интерфейсе socache. Для каждой реализации предусмотрены дополнительные модули, предлагающие следующие серверные части:
Кэширование учетных данных аутентификации
Модуль Кэширование сеансов SSL
Модуль Специализированное кэширование файлов
На платформах, где файловая система может быть медленной или где дескрипторы файлов дороги, существует возможность предварительной загрузки файлов в память при запуске. В системах, где открытие файлов происходит медленно, существует возможность открывать файл при запуске и кэшировать дескриптор файла. Эти параметры могут помочь в системах, где доступ к статическим файлам медленный. Кэширование дескриптора файлаСам акт открытия файла может быть источником задержки, особенно в сетевых файловых системах. Сохраняя кэш дескрипторов открытых файлов для часто обслуживаемых файлов, httpd может избежать этой задержки. В настоящее время httpd предоставляет одну реализацию кэширования файловых дескрипторов. КэшФайлНаиболее простой формой кэширования, присутствующей в httpd, является кэширование файловых дескрипторов, предоставляемое Директива
Кэш-файл /usr/local/apache2/htdocs/index.html Если вы намерены кэшировать таким образом большое количество файлов, вы должны убедиться, что ограничение вашей операционной системы на количество открытых файлов установлено соответствующим образом. Хотя использование Если файл будет удален во время работы httpd, он продолжит поддерживать открытый файловый дескриптор и будет обслуживать файл в том виде, в каком он был при запуске httpd. Обычно это также означает, что хотя файл будет удален и не будет отображаться в файловой системе, дополнительное свободное пространство не будет восстановлено до тех пор, пока не будет остановлен httpd и закрыт дескриптор файла. Кэширование в памятиОбслуживание напрямую из системной памяти — это самый быстрый способ доставки контента. Чтение файлов с контроллера диска или, что еще хуже, из удаленной сети происходит на порядки медленнее. Контроллеры дисков обычно включают физические процессы, а доступ к сети ограничен доступной пропускной способностью. С другой стороны, доступ к памяти может занимать всего наносекунды. Однако системная память недешева, байт за байтом — это, безусловно, самый дорогой тип хранилища, и важно обеспечить его эффективное использование. Кэшируя файлы в памяти, вы уменьшаете объем памяти, доступной в системе. Как мы увидим, в случае кэширования операционной системы это не такая большая проблема, но при использовании собственного кэширования в памяти httpd важно убедиться, что вы не выделяете слишком много памяти для кэша. В противном случае система будет вынуждена выгрузить память, что, вероятно, снизит производительность. Кэширование операционной системыПочти все современные операционные системы кэшируют файловые данные в памяти, управляемой непосредственно ядром. Это мощная функция, и по большей части операционные системы используют ее правильно. Например, в Linux давайте посмотрим на разницу во времени, которое требуется для чтения файла в первый раз и во второй раз; colm@coroebus:~$ тестовый файл time cat > /dev/null реальное 0м0.065с пользователь 0м0.000с система 0m0.001s colm@coroebus:~$ тестовый файл time cat > /dev/null реальное 0м0.003с пользователь 0м0.003с система 0m0.000s Даже для этого небольшого файла существует огромная разница во времени, необходимом для чтения файла. Это связано с тем, что ядро кэшировало содержимое файла в памяти. Убедившись, что в вашей системе есть «запасная» память, вы можете гарантировать, что все больше и больше содержимого файлов будет храниться в этом кеше. Это может быть очень эффективным средством кэширования в памяти и вообще не требует дополнительной настройки httpd. Кроме того, поскольку операционная система знает, когда файлы удаляются или изменяются, она может автоматически удалять содержимое файлов из кэша, когда это необходимо. Это большое преимущество по сравнению с кэшированием в памяти httpd, которое не может узнать, когда файл изменился. Несмотря на производительность и преимущества автоматического кэширования операционной системы, существуют некоторые обстоятельства, при которых кэширование в памяти может лучше выполняться с помощью httpd. Кэширование MMap-файлов MMapFile /usr/local/apache2/htdocs/index.html Как и в случае с
Директива Вопросы безопасностиАвторизация и контроль доступаИспользование Поскольку обход иерархии файловой системы для проверки потенциальных
Если, например, ваша конфигурация разрешает доступ к ресурсу по IP-адресу, вы должны убедиться, что этот контент не кэшируется. Вы можете сделать это с помощью Когда для Локальные эксплойтыПоскольку запросы к конечным пользователям могут обслуживаться из кеша, сам кеш может стать мишенью для тех, кто хочет исказить содержимое или вмешаться в него. Важно иметь в виду, что кеш всегда должен быть доступен для записи пользователю, от имени которого работает httpd. Это резко контрастирует с обычно рекомендуемой ситуацией сохранения всего содержимого недоступным для записи пользователем Apache. Если пользователь Apache скомпрометирован, например, из-за ошибки в процессе CGI, возможно, что кеш может быть атакован. При использовании Это представляет несколько повышенный риск по сравнению с другими типами атак, которые можно совершить как пользователь Apache. Если вы используете, Отравление кешаПри запуске httpd в качестве кеширующего прокси-сервера также существует вероятность так называемого отравления кеша. Отравление кеша — это общий термин для атак, при которых злоумышленник заставляет прокси-сервер получать неверный (и, как правило, нежелательный) контент с исходного сервера. Например, если DNS-серверы, используемые вашей системой, на которой работает httpd, уязвимы для отравления кэша DNS, злоумышленник может контролировать, куда подключается httpd при запросе контента с исходного сервера. Другим примером являются так называемые атаки контрабанды HTTP-запросов. Этот документ не является подходящим местом для подробного обсуждения контрабанды HTTP-запросов (вместо этого попробуйте свою любимую поисковую систему), однако важно знать, что можно сделать серию запросов и использовать уязвимость на исходный веб-сервер, чтобы злоумышленник мог полностью контролировать содержимое, полученное прокси-сервером. Отказ в обслуживании / CachebustingМеханизм Vary позволяет кэшировать несколько вариантов одного и того же URL рядом. В зависимости от значений заголовка, предоставленных клиентом, кеш выберет правильный вариант для возврата клиенту. Этот механизм может стать проблемой при попытке изменить заголовок, который, как известно, содержит широкий диапазон возможных значений при нормальном использовании, например заголовок В других случаях может возникнуть необходимость изменить URL-адрес определенного ресурса при каждом запросе, обычно путем добавления строки «кэшбустер» к URL-адресу. Если этот контент объявлен сервером кэшируемым в течение значительного времени жизни, эти записи могут вытеснить законные записи в кэше. Несмотря на то , что |