Настройка веб-серверов Apache, nginx и lighttpd. Apache. Обзор методов клиентской оптимизации
nginx
lighttpd
Для Apache 1.x существуют два модуля, осуществляющих сжатие контента: это mod_deflate и mod_gzip. Оба модуля разработаны сторонними разработчиками, первый представляет собой патч к исходному коду веб-сервера, что иногда бывает неудобно и не умеет отдавать статически сжатые файлы, второй обладает другими недостатками: сначала сохраняет ответ во временный файл, который потом сжимает и отда?т, что сказывается на производительности, помимо этого конфигурационные опции модуля довольно аскетичны.
В Apache 2.x «из коробки» входит модуль mod_deflate (которые не имеет ничего общего с модулем для Apache 1.x).
Если есть возможность, настоятельно рекомендуем использовать для Apache 1.x модуль mod_deflate, он позволяет более тонко обходить ошибки браузера, имеет настройки степени сжатия, плюс обладает лучшей производительностью. Ниже привед?н оптимальный, на наш взгляд, конфигурационный файл этого модуля.
Для эффективного управления модулем необходим также модуль mod_setenvif, он позволит отключать сжатие для проблемных браузеров.
# Apache 1.x mod_deflate (необходим mod_setenvif)
# включаем модуль DeflateEnable on
# включаем обход ошибки Internet Explorer 4.0, связанной с докачкой # сжатого контента DeflateDisableRange "MSIE 4."
# на данный момент все прокси корректно обрабатывают сжатый ответ, поэтому # мы включаем сжатие, даже если использован прокси DeflateHTTP 1.0
# сжиматься будут только ответы не кэшируемые прокси-серверами, это # позволяет избежать проблем с WinRoute, Kerio WinRoute и другими DeflateProxied poor_cachable
# эта директива включает заголовок Vary для всех ответов, # IE версий 4.0—6.0SP1 не кэшируют ответы, если сжатие выключено, # но получен заголовок Vary, но эти версии сейчас используются очень мало DeflateVary on
# уровень сжатия — максимальный DeflateCompLevel 9 DeflateHash 128 DeflateWindow 32
# включаем игнорирование вызова ap_bflush, это улучшает сжатие # ответов некоторых приложений (например, написанных с применением # Chili!Soft ASP). Если ваше приложение намеренно вызывает этот метод, # опцию лучше отключить DeflateIgnoreFlush on
# минимальный размер при котором ответ сервера будет сжиматься DeflateMinLength 100
# настраиваем что сжимать DeflateType text/html text/css text/xml application/xml image/x-icon DeflateType application/x-javascript text/plain application/x-javascript
# исключаем проблемные случаи # по умолчанию выключаем сжатие на CSS и JavaScript (оно будет разрешено # ниже для браузеров, не имеющих проблем, специальный флаг «no_gzip» # говорит модулю, что сжатие надо выключить SetEnvIf Content-Type text/css no_gzip SetEnvIf Content-Type application/x-javascript no_gzip SetEnvIf Content-Type application/x-javascript no_gzip SetEnvIf Content-Type image/x-icon no_gzip # выключаем сжатие для MSIE < 6SP1, исключаем притворяющуюся IE «Оперу» BrowserMatch "MSIE [456]" no_gzip BrowserMatch "SV1;" !no_gzip BrowserMatch "Opera" !no_gzip BrowserMatch "MSIE ([789]| [1-9][0-9])" !no_gzip
# не имеет проблем Firefox > 3 BrowserMatch "Firefox/(3\.[^0]|[4-9]|[1-9][0-9])" !no_gzip
Образец конфигурационного файла модуля mod_gzip взят из книги «Разгони свой сайт», в данной редакции комментарии были несколько расширены, а в настройку внесены правки.
Уровень эффективности сжатия не регулируется настройками модуля и может быть измен?н только правкой исходного кода (строка «gz1->level = 6» в функции «gz1_init»).
Упомянутый недостаток mod_gzip — недостаточно гибкие опции конфигурирования не дают выборочно включить сжатие CSS и JS только в тех браузерах, где это не созда?т проблем. По этой причине сжатие таких файлов отключено в данной конфигурации.
# Apache 1.x mod_gzip
<IfModule mod_gzip.c>
# включаем gzip
mod_gzip_on Yes
# если рядом с запрашиваемым файлом есть сжатая версия с расширением .gz, то
# будет отдана именно она, ресурсы CPU расходоваться не будут
mod_gzip_can_negotiate Yes
# используем при статическом архивировании расширение .gz
mod_gzip_static_suffix .gz
# выставляем для статически архивированных файлов
# заголовок Content-Encoding: gzip
AddEncoding gzip .gz
# не обновлять самостоятельно статически архивированные файлы,
# при включении этой опции вам не нужно самостоятельно проверять актуальность
# сжатых данных, но нужно позаботиться о том, что процесс веб-сервера
# имел доступ на запись к сжатым файлам
mod_gzip_update_static No
# выставляем минимальный размер для сжимаемого файла, файлы меньшего
# размера сжимать неэффективно:
mod_gzip_minimum_file_size 1000
# и максимальный размер файла, слишком большие файлы будут сжиматься
# очень долго, поскольку mod_gzip не умеет сжимать данные по мере их
# получения, то пользователь начн?т получать файл с задержкой, только
# после того как он будет полность сжат
mod_gzip_maximum_file_size 500000
# выставляем максимальный размер файла, сжимаемого прямо в памяти, чем
# больше эта величина, тем больше производительность и тем больше расход
# памяти каждый процессом, 60000 — максимальное значение для этой величины,
# поскольку авторы модуля столкнулись с проблемами при выделении более чем
# 64КБ в некоторых операционных системах
mod_gzip_maximum_inmem_size 60000
# устанавливаем версию протокола, с которой будут отдаваться gzip-файлы
# на клиент. Настройка появилась в те времена, когда некоторые прокси
# неверно обрабатывали сжатый ответ. В версии 1.1 протокола HTTP прокси
# обязан выставить заголовок «Via», что позволяет определить проходит ли
# запрос через прокси, в версии 1.0 такого заголовка нет, поэтому
# в те времена запросы версии 1.0 просто не сжимались
mod_gzip_min_http 1000
# исключаем известные проблемные случаи (IE до 6.0SP1)
# вообще-то старые версии Opera также содержат строку MSIE,
# но мы их отделять не будем, поскольку в Apache используется синтаксис
# POSIX Extended Regular Expression, а записать на этом языке два
# исключения в одном правиле невероятно трудно.
# Правило, которое записано ниже, может давать ложные срабатывания
# в некоторых ситуациях, но в реальности эти ситуации не встречаются
mod_gzip_item_exclude reqheader "User-agent: MSIE [456]([^S]V|[^S]V1|[^V]1|1[^;]|SV[^1]|[^SV1])+$"
# устанавливаем сжатие по умолчанию для файлов .html
mod_gzip_item_include file \.html$
# дополнительно сжимаем другие текстовые файлы с указанными MIME-типами
mod_gzip_item_include mime ^text/html$
mod_gzip_item_include mime ^text/plain$
mod_gzip_item_include mime ^httpd/unix-directory$
# отключаем сжатие для картинок (не дает никакого эффекта)
mod_gzip_item_exclude mime ^image/
# отключаем 'Transfer-encoding: chunked' для gzip-файлов, чтобы
# страница уходила на клиент одним куском
mod_gzip_dechunk Yes
# добавляем заголовок Vary для корректного распознавания браузеров,
# находящихся за локальными прокси-серверами
mod_gzip_send_vary On
</IfModule>
<IfModule mod_headers.c>
# запрещаем прокси-серверам кэшировать у себя сжатые версии файлов
<FilesMatch .*\.(html|txt)$>
Header set Cache-Control: private
</FilesMatch>
</IfModule>
Модуль для Apache 2.x, mod_deflate по настройкам схож со своим более ранним т?зкой. Отличия — нет некоторых опций, которые вряд ли могут быть названы сейчас актуальными и разделение сжатия HTML-файлов и файлов CSS/JS сделано удобнее.
Исходная версия конфигурационного файла этого модуля, опять же, взята из книги «Разгони свой сайт», здесь файл приводится с правками и расширенными комментариями.
Для управления этим модулем, как и в случае первого Apache, необходим mod_setenvif, следует учитывать, что часть настроек этого модуля mod_deflate нельзя использовать внутри файлов «.htaccess», только внутри virtual host или на уровне глобальных настроек.
# Apache 2.x mod_deflate (необходим mod_setenvif)
# с самого начала включаем gzip для текстовых файлов
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
# и для favicon.ico
AddOutputFilterByType DEFLATE image/x-icon
# также для CSS- и JavaScript-файлов
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/x-javascript
# далее устанавливаем максимальную степень сжатия (9)
# и максимальный размер окна (15). Если сервер не такой мощный,
# то уровень сжатия можно выставить в 1, размер файлов при этом
# увеличивается примерно на 20%.
DeflateCompressionLevel 9
DeflateWindowSize 15
DeflateBufferSize 32768
# отключаем сжатие для тех браузеров, у которых проблемы с
# его распознаванием
# выключаем сжатие для MSIE < 6SP1, исключаем притворяющуюся IE «Оперу» BrowserMatch "MSIE [456] " no_gzip dont-vary BrowserMatch "SV1;" !no_gzip !dont-vary BrowserMatch "Opera" !no_gzip !dont-vary
# Firefox < 3.5, проблемы с CSS/JS BrowserMatch "Firefox/[0-3]\." gzip-only-text/html
BrowserMatch "Firefox/3\.[1-9]" !gzip-only-text/html
# Chrome
BrowserMatch "Chrome/2" gzip-only-text/html
# все версии Safari
BrowserMatch "Safari" gzip-only-text/html
# Konqueror
BrowserMatch "Konqueror" gzip-only-text/html
# указываем прокси-серверам передавать заголовок User-Agent для
# корректного распознавания сжатия
Header append Vary User-Agent env=!dont-vary
# запрещаем кэширование на уровне прокси-сервера для всех файлов,
# для которых у нас выставлено сжатие,
<FilesMatch .*\.(css|js|php|phtml|shtml|html|xml)$>
Header append Cache-Control: private
</FilesMatch>