Инструменты пользователя

Инструменты сайта


sett_cache

Настройка кеширования


Настройка кеширования в 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; #Просрочиваем кеш

Теперь даже если данные закешируются, браузер все равно будет их запрашивать т.к. дата просрочена.

1)
браузеру
2)
gzip
3)
в браузере
4)
достаточно FTP доступа
5)
необходим root-доступ
6)
обычно в пакетных дистрибутивах Linux (Debian, Ubuntu, Fedora, SUSE etc) он вероятнее всего будет находиться в /etc/nginx/nginx.conf
7)
куда именно размещать значения не имеет, но лучше в конце чтобы не перекрывал другие правила
8)
размещать опять таки лучше в конце

Информация на данном сайте носит ознакомительный характер и может быть изменена. © 2005-2024 iPipe.ru