База знаний: Linux Server
Настройка gzip-сжатия и кеширования в Apache
Автор Алексей | HiTex.BY на 13 июля 2018 14:52

Необходимые модули Apache2

Для включения кеширования нам нужен модуль  mod_deflate, для кеширования - mod_headers или  mod_expires. Также  mod_headers вам пригодится чтобы удалять заголовок ETag, он лишний и могут быть проблемы с кешированием через  mod_header при включенном сжатии. Для включение выполните:

sudo a2enmod deflate headers expires
sudo /etc/init.d/apache2 restart

Для отключения модулей воспользуйтесь командой a2dismod:

sudo a2dismod deflate # пример отключения модуля mod_deflate
sudo /etc/init.d/apache2 restart

Итоговый .htaccess

Сразу приведу пример файла .htaccess, в котором настроено кеширование и сжатие. Файл будет содержать краткие примечания, а ниже разберем все директивы и правила более детально.

### Сжать ответ сервера для перечисленных MIME типов
<ifModule mod_deflate.c>
  <IfModule mod_filter.c>
      AddOutputFilterByType DEFLATE text/plain text/html
      AddOutputFilterByType DEFLATE text/css
      AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript
      AddOutputFilterByType DEFLATE text/xml application/xml application/xhtml+xml application/rss+xml
      AddOutputFilterByType DEFLATE application/json
      AddOutputFilterByType DEFLATE application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon
  </ifModule>
</ifModule>


### Способ #1
### Подсказать браузеру схему кеширования через заголовки в ответе сервера
<ifModule mod_headers.c>
    # 43200 - день, 604800 - неделя, 2592000 - месяц
    <FilesMatch "\.(html|js|css)$">
	Header set Cache-Control "max-age=2592000"
        #Header unset Last-Modified
    </FilesMatch>
    <Files *.txt>
	Header add Cache-Control "max-age=43200"
    </Files>
    <FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
	Header set Cache-Control "max-age=2592000"
    </FilesMatch>
    <FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
	# отключить кэширование
	Header unset Cache-Control
    </FilesMatch>
</IfModule>

### Способ #2
### Подсказать браузеру схему кеширования через заголовки в ответе сервера
<IfModule mod_expires.c>
    # Enable expires
    ExpiresActive On
    
    # Default a cache expiration
    ExpiresDefault "access plus 10 month"
    
    # Images
    ExpiresByType image/gif                 "access plus 1 month"
    ExpiresByType image/png                 "access plus 1 month"
    ExpiresByType image/jpg                 "access plus 1 month"
    ExpiresByType image/jpeg                "access plus 1 month"
    
    # CSS, JavaScript
    ExpiresByType text/css                  "access plus 1 year"
    ExpiresByType application/javascript    "access plus 1 year"
    ExpiresByType text/javascript           "access plus 1 year"
</IfModule>


### Удалить заголовок ETag (иначе есть проблемы с кешированием при включенном сжатии)
<IfModule mod_headers.c>
    Header unset ETag
</IfModule>
FileETag None
Примечание

FilesMatch и  Files ~ сопоставляют шаблон только с именем файла, поэтому вы не можете указывать пути к файлам в этих директивах.

Чтобы указать область видимости кеша, используйте следующие правила:

Header set Cache-Control "max-age=2592000"
Header append Cache-Control "public"
// то же самое в одну строку
Header set Cache-Control "max-age=2592000, public"

gzip-сжатие

Apache2 больше не поддерживает модуль mod_gzip, теперь основным модулем является mod_deflate, который мы включили ранее. Чтобы проверить что сжатие работает - убедитесь что ответ содержит заголовок Content-Encoding:

Content-Encoding  gzip

Сжатие может быть настроено для определенных MIME-типов файлов, за это отвечает правило AddOutputFilterByType

Внимание!

Модуль deflate при сжатии может удалять заголовок Content-Length, поскольку длина сжатого ответа неизвестна на момент передачи заголовков. Однако, при удалении из ответа заголовка ETag - ситуация нормализуется. Почему?

Примечание

Сжимать изображения и видео файлы особого смысла нет - толку это даст мало, поскольку jpeg или gif уже сами по себе являются сжатыми форматами.

Кеширование

Для кеширования мы активировали модули  mod_headers и  mod_expires. Эти модули позволяют устанавливать заголовки в ответе сервера и подсказать браузеру схему кеширования.

Внимание!

Я замечал не понятное для меня поведение при включении mod_deflate и настройке кеширования через  mod_headers. Пропадал заголовок Content-Length и кеширование переставало работать. Решение нашлось - удаление заголовка из ответа:

<IfModule mod_headers.c>
    Header unset ETag
</IfModule>
FileETag None

В случае с mod_expires сжатие и кеширование работало нормально даже с выключенным модулем mod_headers. Отпишитесь, если вы знаете почему происходит так.

(264 голос(а))
Эта статья полезна
Эта статья бесполезна

Комментарии (0)