Содержание
Настройка кеширования
Настройка кеширования в Apache и gZip-сжатия
В процессе передачи информации по сети может использоваться кэширование элементов интернет-страниц — процесс сохранения часто запрашиваемых документов на (промежуточных) прокси-серверах или машине пользователя, с целью предотвращения их постоянной загрузки с сервера-источника и уменьшения трафика. Таким образом, информация перемещается ближе к пользователю. Управление кэшированием осуществляется при помощи HTTP-заголовков.
Кеширование это своеобразный обмен заголовками, благодаря которому сервер сообщает клиенту1) что определенный элемент сайта можно закешировать на некоторое время. После чего, при последующих запросах этого элемента, браузер будет считывать данные из кеша.
Сжатие это технология архивации2), которая позволяет сжимать данные на сервере и распаковывать их после получения на клиенте3). С помощью сжатия, осуществляется уменьшается трафик и, соответственно, время загрузки контента. Но, при этом, незначительно возрастает нагрузка на центральный процессор при распаковке данных.
Настройка Apache
Для включения кеширования и gzip-сжатие необходим модуль mod_deflate, для кеширования - mod_headers или mod_expires. Для включения этих модулей в консоли из под root-доступа выполните команды:
a2enmod deflate headers expires /etc/init.d/apache2 restart
Следующие команды необходимы для отключения модулей:
a2dismod deflate /etc/init.d/apache2 restart
Директивы для файлов apache2.conf или .htaccess
Важно! Для редактирования файлов httpd.conf и apache2.conf - необходим root-доступ.
Данные директивы, могут быть записаны в .htaccess4) или в конфигурационный файл apache2.conf5):
<ifModule mod_deflate.c> # Включение GZIP-сжатия для различных типов файлов: TXT, SVG, RSS, javascript AddOutputFilterByType DEFLATE text/html text/xml text/css text/plain AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript application/json AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-otf x-font/eot x-font/ashx AddOutputFilterByType DEFLATE font/truetype font/opentype BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html </ifModule> <ifModule mod_expires.c> #включение заголовка Expires, указывающего время устаревания файла ExpiresActive On ExpiresDefault "access plus 3600 seconds" # по умолчанию время устаревания составляет час, но для некоторых типов файлов мы его переопределим ExpiresByType image/x-icon "access plus 2592000 seconds" # 30 дней ExpiresByType image/jpeg "access plus 2592000 seconds" # 30 дней ExpiresByType image/png "access plus 2592000 seconds" # 30 дней ExpiresByType image/gif "access plus 2592000 seconds" # 30 дней ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds" # 30 дней ExpiresByType text/css "access plus 604800 seconds" # 7 дней ExpiresByType text/javascript "access plus 604800 seconds" # 7 дней ExpiresByType application/javascript "access plus 604800 seconds" # 7 дней ExpiresByType application/x-javascript "access plus 604800 seconds" # 7 дней ExpiresByType text/html "access plus 600 seconds" # 10 минут ExpiresByType application/xhtml+xml "access plus 600 seconds" # 10 минут </ifModule> <ifModule mod_headers.c> # Самая главная часть: выдача заголовка, разрешающего кеш определенных типов файлов <filesMatch "\.(ico|jpe?g|png|gif|swf)$"> Header set Cache-Control "max-age=2592000, public" </filesMatch> <filesMatch "\.(css)$"> Header set Cache-Control "max-age=604800, public" </filesMatch> <filesMatch "\.(js)$"> Header set Cache-Control "max-age=604800, public" </filesMatch> </ifModule>
Расположение конфигурационного файла apache2.conf или httpd.conf зависит используемой операционной системы и версии Apache:
- CentOS, Fedora (Redhat-системы) /etc/httpd/conf/httpd.conf
- Debian, Ubuntu (apache 2.2) /etc/apache2/apache2.conf
Настройка кэширования с помощью nginx
Для ускорения выдачи статического контента сайта используется кэширование с помощью nginx. Как правило, кеширование необходимо для сайта контент которого не меняется в зависимости от пользователя (авторизован или гость) и нет активно меняющихся данных (например голосований). Это важно, т.к. активно изменяющийся контент требует индивидуального подхода и зачастую сложных схем кеширования.
В конфигурационном файле nginx.conf6), в секции server необходимо добавить следующий location7):
#!Статический контент! location ~* \.(jpg|jpeg|gif|png|swf|tiff|swf|flv)$ root /var/www/site.com; # Путь к корню вашего сайта expires 3M; #Кеширум картинки 3 месяца add_header Cache-Control public; #Кешируем везде (и на прокси и на клиентах) access_log off; # не пишем логи }
Далее, для браузеров которые поддерживают сжатие при получении несжатого контента - css, js, ico, , имеет смысл добавить8) следующую запись:
location ~* \.(css|js|ico) { gzip_static on; # разрешаем отдавать вместо несжатого файла предварительно сжатый с постфиксом ".gz", если такой есть gzip_disable Firefox/([0-2]\.|3\.0); #запрещаем сжатие файлов CSS и JS для проблемных браузеров gzip_disable Chrome/2; gzip_disable Safari; expires 1M; #Кешируем на один месяц add_header Cache-Control private; #Кешируем только на клиентах (ибо сжатое) }
Работать эта конструкция будет только при наличии установленного модуля gzip_static в nginx.
Далее, чтобы не закешировать лишнее у всего остального контента необходимо запретить кеширование, для этого в начале секции server вставляем:
expires epoch; #Просрочиваем кеш
Теперь даже если данные закешируются, браузер все равно будет их запрашивать т.к. дата просрочена.