HTTP кэширование I небольшое исследование по теме

2.4K
.
╭∩╮ (`-`) ╭∩╮
Продолжу...
---
В итоге я нашел отличный конфиг для Expires (из проекта Mobile Boilerplate), кому нужно, сами можете заменить в своем .htaccess вместо того блока, что я дал выше

<IfModule mod_expires.c>

ExpiresActive on
ExpiresDefault "access plus 1 month"

# CSS
ExpiresByType text/css "access plus 1 year"

# Data interchange
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/ld+json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"

# Favicon (cannot be renamed!) and cursor images
ExpiresByType image/x-icon "access plus 1 week"

# HTML components (HTCs)
ExpiresByType text/x-component "access plus 1 month"

# HTML
ExpiresByType text/html "access plus 0 seconds"

# JavaScript
ExpiresByType application/javascript "access plus 1 year"

# Manifest files
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"

# Media
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"

# Web feeds
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"

# Web fonts
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"

</IfModule>
.
Сексуальность валенка
У мну так
<ifModule mod_headers.c>
    #кэшировать html и htm файлы на один день
    <FilesMatch "\.(html|htm)$">
        Header set Cache-Control "max-age=43200"
    </FilesMatch>
    #кэшировать css, javascript и текстовые файлы на одну неделю
    <FilesMatch "\.(js|css|txt)$">
        Header set Cache-Control "max-age=604800"
    </FilesMatch>
    #кэшировать флэш и изображения на месяц
    <FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
        Header set Cache-Control "max-age=2592000"
    </FilesMatch>
    #отключить кэширование
    <FilesMatch "\.(php)$">
        Header unset Cache-Control
    </FilesMatch>
</IfModule>

<ifModule mod_expires.c>
    ExpiresActive On
    #по умолчанию кеш в 2 секунд
    ExpiresDefault "access plus 2 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"
    #кэшировать css, javascript и текстовые файлы на одну неделю
    ExpiresByType text/css "access plus 604800 seconds"
    ExpiresByType text/javascript "access plus 604800 seconds"
    ExpiresByType application/javascript "access plus 604800 seconds"
    ExpiresByType application/x-javascript "access plus 604800 seconds"
    ExpiresByType text/html "access plus 43200 seconds"
    ExpiresByType application/xhtml+xml "access plus 6000 seconds"
</ifModule>
.
# BEGIN EXPIRES
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 days"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType text/plain "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType application/x-javascript "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType application/x-icon "access plus 1 year"
    ExpiresByType application/x-font-woff "access plus 1 year"
</IfModule>
# END EXPIRES
.
Ей 25
И что с этой фигнёй реально быстрее грузится сайт?
.
╭∩╮ (`-`) ╭∩╮
По идее, все должно было заработать, но тем не менее, проверка по PageSpeed опять показала, что кэширования на стороне клиента нет. Проверка заголовков по FireBug показала, что Expires все равно не работает и заголовки кэширования не отдаются.

Я начал искать причину и подозрение пало на наш сервер, а точнее на связку Apache + Nginx.
Это весьма распространенное решение, на большинстве хостингов все работает именно так.
И у меня возникло подозрение, что кэширующие заголовки режет Nginx, ведь выдает из Apache, который с клиентом общается не напрямую.
Дальнейшая проверка подтвердила мою догадку. Когда я отключил Nginx и пустил Апач напрямую, кэширование на стороне клиента сразу заработало.

Сразу возникла дилемма: а на кой тогда нужен Nginx, если он разгружает Апач, но замедляет работу сервера с клиентами, не давая нам управлять кэшированием?
Полез в Гугл на раскопки чужой мудрости, нашел некоторые варианты конфигов для Nginx, которые обеспечивают заголовки кэширования, но это все не то, нам надо, чтоб работал именно Expires у Апача, он очень хорошо делает свою работу и легко управляется через .htaccess
.
╭∩╮ (`-`) ╭∩╮
Не спешите каментить, щас напишу, как удалось решить проблему
.
╭∩╮ (`-`) ╭∩╮
# ValekS (08.01.2015 / 22:58)
И что с этой фигнёй реально быстрее грузится сайт?
Да, реально быстрее, если много графики и большие CSS, то НАМНОГО быстрее.
.
Сексуальность валенка
Так можно сразу в конфигах nginx кеширование прописать
.
╭∩╮ (`-`) ╭∩╮
В итоге проблема оказалась в конфигах Nginx, подробности ща опишу ниже...
===
Те, кто серьезно работают с настройками сервера и связками Apache + Nginx наверно знают, что есть такой трюк, как разгрузка Апача от всей статики.
Иными словами, все статические файлы типа картинок, стилей, джавы, видео, архивов и прочей ерунды, обрабатывает непосредственно Nginx, а запросы по РНР файлам передаются Апачу.

То есть, к примеру, если клиент запросил картинку logo.gif ее ему отдаст не Apache а непосредственно Nginx.
Вот тут и кроется несоответствие!!!
Ведь мы настраивали заголовки Expires именно на Апаче, а как он их выдаст, если картинку отдает сразу Nginx и запрос не доходит до Апача? Потому и не выдается заголовок на кэширование.
===
В итоге, проблему решил так:
Из настроек статики Nginx я убрал все картинки и стили (gif jpg png css), видео, архивы и все остальное оставил.
И после перезагрузки Nginx все заработало как надо.
З.Ы.
Если у Вас нет доступа к полным конфигам Nginx, просто выключите обработку статики и все.
.
╭∩╮ (`-`) ╭∩╮
# Swank (08.01.2015 / 23:05)
Так можно сразу в конфигах nginx кеширование прописать
Можно, но это хуже.
Конфигурировать Nginx тот еще геморой, там надо указывать каталог с картинками, а что делать, если они у тебя в разных местах?

Модуль Expires для Апача по функциям намного круче и удобнее управляется.
Посему, лучше картинки, джаву и стили не отдавать Nginx, а обрабатывать самим Апачем.
В итоге мы НАМНОГО выигрываем, у клиентов меньше трафика, страницы грузятся быстрее, да и сервер разгружается.
Всего: 87