• Записи 162
  • Теги 66
  • Комментарии 330

Компьютерное

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

Далеко не все знают, что по умолчанию в Apache кеширование отключено. Это означает, что каждый раз, когда пользователь просматривает страницу, ему приходится каждый раз скачивать все файлы сайта: и CSS, и JavaScript, и картинки. Это создает лишнюю нагрузку на сервер, расходует траффик пользователя и замедляет работу сайта. Что же сделать, чтобы этого не было? Очень просто: прописать в настройках Apache выдачу заголовков, которые позволят использовать кеширование на стороне пользователя. Делается это очень просто:

либо в файл apache2.conf, либо в .htaccess на каждом сайте прописываем следующие директивы:


<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-truetype application/x-font-opentype application/font-woff
   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"
   ExpiresByType image/jpeg "access plus 2592000 seconds"
   ExpiresByType image/png "access plus 2592000 seconds"
   ExpiresByType image/gif "access plus 2592000 seconds"
   ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
   ExpiresByType text/css "access plus 604800 seconds"
   ExpiresByType text/javascript "access plus 604800 seconds"
ExpiresByType image/svg+xml "access plus 2592000 seconds"
ExpiresByType application/x-font-ttf "access plus 2592000 seconds"
ExpiresByType application/x-font-truetype "access plus 2592000 seconds"
ExpiresByType application/x-font-opentype "access plus 2592000 seconds"
ExpiresByType application/font-woff "access plus 2592000 seconds"
ExpiresByType application/font-woff2 "access plus 2592000 seconds"
ExpiresByType application/vnd.ms-fontobject "access plus 2592000 seconds"
ExpiresByType application/font-sfnt "access plus 2592000 seconds"
   ExpiresByType application/javascript "access plus 604800 seconds"
   ExpiresByType application/x-javascript "access plus 604800 seconds"
   ExpiresByType text/html "access plus 600 seconds"
   ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>

<ifModule mod_headers.c>
# Самая главная часть: выдача заголовка, разрешающего кеш определенных типов файлов
   <filesMatch "\.(ico|jpe?g|png|gif|swf|svg|webp|ttf|otf|woff|woff2|eot|sfnt)$">
     Header set Cache-Control "max-age=25920000"
   </filesMatch>
   <filesMatch "\.(css)$">
     Header set Cache-Control "max-age=25920000"
   </filesMatch>
   <filesMatch "\.(js)$">
     Header set Cache-Control "max-age=25920000"
   </filesMatch>
</ifModule>


Если у вас свой VDS, необходимо проверить, что Apache запускается с модулями headers, expires, deflate. В Debian это можно сделать с помощью утилиты a2enmod:
# a2enmod headers expires deflate В других системах придется отредактировать файл apache2.conf и посмотреть, есть ли там директива LoadModule для соответствующих модулей.

10 комментариев:

Нет
Stanislav Tamat
0

> headres
> headREs
опечатка, исправьте пожалуйста.

4X_Pro
0

Исправлено!

Нет
Игорь Черноморец
0

При вставки кода в файл .htaccess сайт перестаёт быть работоспособным! Выдаёт ошибку сервера 500

4X_Pro
0

А версия Apache у вас какая? Попробуйте закомментировать сначала весь файл, а потом раскомментировать отдельные блоки (все,что есть между ifModule и /ifModule).
И по FTP файл .htaccess нужно грузить в ASCII-режиме, а не в binary.

Нет
Михаил
0

>При вставки кода в файл .htaccess сайт перестаёт быть работоспособным! Выдаёт ошибку сервера 500
Удалите русский комментарий вместе с символом # - все заработает

Нет
Дима
0

Спасибо большое, всё сразу заработало.
На VPS с Убунтой удобно вставить в /etc/apache2/conf-enabled/serve-cgi-bin.conf

Только все комментарии следует с новой строки начинать, иначе апач ошибки в конфиге находит.

4X_Pro
0

Обновил запись: добавил директивы для кеширования SVG и шрифтов.
Кроме того, в принципе, если есть Cache-Control и не актуальна поддержка совсем древних броузеров, то выдачу Expires можно убрать в целях уменьшения размера заголовков.

Нет
Andrey
0

Спасибо за конфиг поставил к себе на сайты...

Dima Zavada
0

Как можно настроить кэширование для отдельных файлов css?

4X_Pro
0

Если для сайтов, то директивы Files и FilesMatch вам в помощь. Т.е. нужно в .htaccess прописать что-то такое:
<Files myfile.css>
Expires "access plus 3600 seconds"
Header set Cache-Control "max-age=3600"
</Files>
В этом случае файл myfile.css будет кешироваться всего на час.
Для одностраничных Web-приложений можно управлять кешированием каждого файла через cache manifest, но это отдельная большая тема.

Написать комментарий


Задать вопрос