
Настройка кэширования для статичных файлов в Apache2. Пошаговая инструкция в картинках.
Меня тут в очередной раз спросили о настройке кэширования статики в Apache2 и предложили использовать связку nginx + apache. Однако я, например, не любитель такого решения и считаю, что на ненагруженных серверах это совершенно излишнее телодвижение, которое усложняет жизнь. Вместо того, чтобы ставить два и настраивать два сервера, куда проще просто передать правильные заголовки кэширования статики и избежать лишних запросов на сервер от пользователя. В этой заметке я расскажу как это сделать. Поскольку я сам далеко не эксперт в Linux и пишу для таких же не-экспертов, то я попросил бы экспертов относиться снисходительно к стилю повествования, а хабра-ыкспертов — пойти делать домашку по математике, а не лезть со своими заумными комментариями.
Итак, приступим. Для начала мы установим Midnight Commander — это что-то типа олдскульного Нортона, легендарного Norton Commander, если вы помните такой. Подключимся в консоль и пробуем набрать команду:
mc
Если ничего не получилось, набираем команду (предполагается, что у нас Ubuntu):
[shell]
sudo apt-get install mc
[/shell]
Соглашаемся и через минуту у нас установлен mc. Запускаем его первой командой.
Находим папку с Apache, как правило /etc/apache2, и открываем в панелях MC папки
mod-available
mod-enabled

Нам нужно проверить в правой панели (mod-enabled) наличие ссылок (файлики с символом @ в правой панели) на нужные модули и при необходимости их добавить. Переходим в левую панель с помощью [Tab]. Итак, нужны следующие файлы (модули):
- deflate.conf
- deflate.load
- expires.load
- headers.load
Если каких-то файлов нет, то находим и отмечаем их в левой панели с помощью кнопочки [Ins] и далее нажимаем сначала [Ctrl] + [X] а потом [S]. Это приведет к созданию ссылки на отмеченные файлы в другой, правой панели.
Должно получится как на рисунке выше.
Далее идем в папку conf-avialiable (или если ее нет, то в папку conf.d) и создаем там пустой файл с именем caching.conf. Это можно сделать с помощью копки [Shift] + [F4] и вводим в него следующее содержимое
[shell]
Сжатие статики
<IfModule mod_mime.c>
AddType application/javascript js
</Ifmodule>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml
</Ifmodule>
Кэширование статики
<IfModule mod_expires.c>
ExpiresActive On
A0 = Access + 0 seconds
ExpiresDefault A0
1 YEAR — doesn’t change often
<FilesMatch «.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$»>
ExpiresDefault A29030400
Header set Cache-Control «max-age=29030400, public»
</FilesMatch>
1 WEEK — possible to be changed, unlikely
<FilesMatch «.(jpg|jpeg|png|gif|swf)$»>
ExpiresDefault A604800
Header set Cache-Control «max-age=604800, public»
</FilesMatch>
3 HOUR — core content, changes quickly
<FilesMatch «.(txt|xml|js|css)$»>
ExpiresDefault A10800
Header set Cache-Control «max-age=10800, public»
</FilesMatch>
</IfModule>
[/shell]
Лучше, конечно же, не набирать, а скачать готовый файл и положить его к себе на сервер.
После этого нужно также добавить ссылку на caching.conf в папочку conf-enabled. Если у вас таких папок нет и вы создали caching.conf прямо в conf.d — уже все сделано. Грубо говоря, этот файл должен читаться при старте Apache.
Теперь перестартуем сервер:
[shell]
service apache2 restart
[/shell]
Всё! Можно проверять. Откройте любую страницу с этого сервера в браузере и откройте консоль браузера [F12]. Перегрузите страницу и посмотрите в панели Network на передачу любого статичного файла (картинка, js, css). Вы должны увидеть следующие заголовки:

Собственно, всё. Этими самым вы резко снизите нагрузку с сервера, поскольку статика будет отдаваться пользователю только один раз. В этом легко убедиться — нажмите [F5] в браузере и посмотрите на коды ответа сервера — 304 файл не менялся. Эти файлы уже не передавались повторно:

Удачи вам!