Двадцать вещей, которые вы можете кешировать с помощью Apache и о которых вы не знаете.
Вы знаете ту часть своего сайта, которую вы никогда не обновляете? Конечно, она «динамическая» — контент хранится в базе данных и загружается с каждым запросом, но вы не обновляли его с последнего Рождества. Каждый раз, когда кто-то загружает эту страницу, происходит запрос к базе данных, и это медленно.
Одна вещь, которую вы могли не знать о своем сервере Apache — то, что он может исправить эту проблему для вас. Контент, который никогда не меняется, не должен запрашивать такты ЦПУ для генерации.
mod_cache используется повсеместно, но есть некоторые новые возможности в нем, которые могут вам помочь лучше использовать ресурсы вашего сервера. Также люди традиционно используют возможности кеширования mod_cache для контента, проходящего через прокси, но это не единственная его возможность. Вы также можете кешировать ваш динамический контент и использовать его так же быстро, как и файлы, хранящиеся на диске.
Модули и предварительные условия.
Показанные здесь примеры основываются на mod_cache, mod_disk_cache и mod_mem_cache. Убедитесь, что у вас установлены эти модули, прежде чем пытаться делать эти вещи.
Удостовериться в загрузке этих модулей можно с помощью запуска httpd с ключем -M:
$ /usr/local/apache2/bin/httpd -M
Как обычно, учтите, что путь до httpd может быть другим на вашей системе. Если вы устанавливали со стороннего пакета, имя бинарника может быть другим, например apache2.
Если это не покажет указанные модули, установите их.
Дающиеся здесь примеры должны быть прописаны в главном конфигурационном файле сервера, не в .htaccess. Если вы не администратор системы и имеете доступ только к .htaccess, это не будет у вас работать. Простите. Обратитесь к вашему системному администратору.
Наконец, модули и технологии, рассмотренные в этой статье, доступны в Apache 2.0 и 2.2. Они не доступны в Apache 1.3. Если вы до сих пор используете Apache 1.3 вы должны подумать об обновлении. На момент написания этой статьи, 2.2 последняя и наиболее рекомендуемая версия Apache. 1.3 находится исключительно в режиме поддержи, производится исправление ошибок, но не происходит новых разработок.
Примеры конфигурации
Вот что требуется прописать в файле конфигурации для первого примера:
CacheEnable disk /
CacheRoot /var/www/cache
CacheDefaultExpire 3600
CacheMinExpire 3600
Эта конфигурация будет кешировать весь контент вашего сайта, и кеш будет сохранятся в течение как минимум часа, независимо от своей «свежести».
Эта техника наиболее подходящая для динамического контента, который вы хотите кешировать и использовать как статический контент.
Вот что этот пример выполняет, построчно:
CacheEnable disk /
Первая строчка обозначает какой тип кеширования делать. Этот пример использует mod_disk_cache, чтобы кешировать контент на файловой системе.
Второй аргумент указывает, какую часть вашего сайта вы, возможно, не хотите кешировать. Сейчас я вам покажу, как это делать. Если имеется определенная часть сайта, которую вы хотите кешировать, вы можете указать это так:
CacheEnable disk /blog
Следующая строка указывает, где хранить кешируемый контент:
CacheRoot /var/www/cache
Директория /var/www/cache (или любая другая, установленная в CacheRoot) должна существовать, и пользователь Apache должен иметь права на запись в ней — то, как указана директива User в вашем файле конфигурации сервера.
CacheDefaultExpire 3600
CacheMinExpire 3600
Эти две директивы указывают, как долго хранить ресурсы в кеше, прежде чем запросить их опять из источника. Директива CacheDefaultExpire устанавливает время окончания для ресурсов, в которых не указана дата окончания или дата последней модификации. Более важная директива, CacheMinExpire, указывает минимальное время окончания для ресурсов, даже если ресурсы сами указывают более близкую дату окончания.
Вот как вы можете заставить динамический контент, который мог бы грузиться динамически каждый раз, кешироваться на некоторый период времени, прежде чем снова обращаться к базе данных.
Это время указывается в секундах, так что в этом случае делает как минимум час кеширования, независимо от того, насколько «свеж» контент.
Учтите, что это почти наверняка послужит причиной, что ваш сервер иногда будет использовать старый контент. Вам будут звонить люди и говорить: «Я обновляю свой сайт, но до сих пор вижу старую версию». Да, вот в чем смысл.
Контент, проходящий через прокси
Если вы используете обратный прокси-сервер, то есть если ваш сервер Apache находится впереди некоторого другого сервера на заднем плане, пропускающего через прокси запросы к нему — mod_cache будет кешировать контент, полученный от таких серверов так же хорошо, как и локальный контент.
Эта конфигурация, которая с которой люди наиболее знакомы. В самом деле, кеширование часто очень эффективно по этому сценарию. Когда у вас есть более медленный действующий сервер на заднем плане, предоставляющий некоторую часть вашего контента, эта установка полезна, чтобы придать ему немного больше скорости.
Опции конфигурации
Есть ещё несколько вещей, которые вы можете установить для вашего кеширования. Полный список вы можете просмотреть в документации по модулям, но вот несколько наиболее важных.
Так как вы, возможно, кешируете статический контент так же, как и динамический, вы можете захотеть наложить некоторые пределы на ваш кеш. Если файл слишком маленький, нет смысла кешировать его. Если же он слишком большой, вы заполните ваше пространство под кеш слишком быстро. Вы можете указать эти минимальный и максимальный размеры:
CacheMinFileSize 64
CacheMaxFileSize 64000
Эти настройки 1Б и 1ГБ соответственно, по умолчанию, так что установка их каким-либо другим образом даст определенный результат, если у вас есть большое число маленьких, или слишком больших, файлов на вашем сайте.
Если вам известны специфические особенности вашей файловой системы и как она работает наиболее эффективно, вы можете пожелать настроить директивы CacheDirLevels и CacheDirLength в порядке создания структуры директорий, которая работает лучше для вас.
Обслуживание директории кеша.
Используйте утилиту htcacheclean для того, чтобы держать вашу директорию кеша в определенных рамках. В противном случае, этого не произойдет, и ваша директория кела будет рости неконтролируемо. htcacheclean может быть запущена в режиме демона, или же вы можете запускать её периодически с помощью cron:
htcacheclean -d -n -t -p /var/www/cache -l 100M -i
С этим набором настроек, htcacheclean будет запускаться в режиме демона. Это будет дружелюбно по отношению к другим процессам и будет удерживать размер кеша в пределах 100 МБ.
Если вам нужно очистить кеш, следующим образом можно удалить все файлы в кеше:
rm -rf /var/www/cache/*
Как обычно, будьте предельно осторожны в использовании rm -rf, так как опечатка в аргументе может привести к удалению того, что вы удалять совсем не хотели.
Не кешируй это!
Существует некоторые вещи, которые вы просто не хотите кешировать и есть простой способ сообщить mod_cache об этом.
Наиболее важная вещь, которую вы должны держать в голове это то, что контент требуемый для аутентификации никогда не будет кешироваться. Речь идет о контенте, используемом стандартными методами HTTP аутентификации, а не контент, который используется ваш собственный доморощенный метод аутентификации, основанный на cookie. Так что, очень важно не кешировать «защищенный» контент, вы должны предпринять дополнительные действия, чтобы не делать этого, пока не будете использовать только стандартную аутентификацию.
CacheDisable /secure
Если вы используете контент вне вашей локальной файловой системы, нет пользы от его кеширования:
CacheDisable /images
Иногда имеются отдельные части запроса, которые вы хотите устранить от прокси. Обычно это один или несколько HTTP заголовков. Например, вы хотите устранить получение cookie в кеш:
CacheIgnoreHeaders Set-Cookie
Кеширование памяти.
До этого момента я рассказывал только о кешировании на файловую систему. Кеширование в память полезно, если у вас есть огромное количество памяти и высоконагруженный трафиком сайт, который использует несколько файлов много раз в секунду. Включите это с помощью указания директивы CacheEnable из раннего примера:
CacheEnable mem /
Вам не нужно указывать CacheRoot, так как документы не пойдут в файловую систему. Существует множество настроек конфигурации, которые вы можете найти в документации к mod_mem_cache.
Другое кеширование
Есть множество других способов, с помощью которых вы можете кешировать и спасать свой ЦПУ для лучших вещей. Не просмотрите их.
Существует множество кеширующих механизмов для использования с разными языками программирования. Наиболее примечательные из них включают в себя кеширование в память и APC. Это позволит вам кешировать результаты операций, таких как вычисления, запросы к базе данных и скомпилированный код. Вы должны изучить, имеет ли ваш язык выбор подобных кеширующих механизмов.
Много серверов баз данных имеют встроенный механизм кеширования для использования часто повторяющихся запросов прямо из кеша. Это позволяет вашему серверу обращаться к таблицам данных только когда данные меняются.
Кеширующий сервер Squid является высоко конфигурируемым и очень быстро кеширует HTTP контент; и может послужить лучшим выбором, чем Apache для прямого и обратного кеширования в некоторых ситуациях.
Чем больше ваш набор инструментов, тем выше ваши шансы знать, какой инструмент когда использовать.