Кеширование в связке nginx + apache

gabeLima
На сайте с 19.04.2010
Offline
106
4538

Добрый день. На многих сайтах, в PageSpeed или GTmetrix выдается стандартное предупреждение:

Используйте кеш браузера

я думаю вы знаете. Через htaccess (типа ExpiresByType text/javascript "access plus 6 months") все создается легко, но это в случае с apache. На моем хостинге используется связка nginx + apache и вот, что мне ответили в службе поддержки:

"На наших серверах используется схема работы, при которой запросы к статичным файлам (в частности, pdf и zip) обрабатываются с помощью Nginx, а остальные запросы передаются Apache. Поэтому файл .htaccess не может использоваться для отключения доступа к статическим файлам, так как он обрабатывается только на уровне Apache.

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

- в скриптах сайта можно использовать ссылки на файлы, которые физически отсутствуют (например, для файлов на сервере использовать формат pdx);

- осуществлять перенаправления с таких файлов на существующие при помощи .htaccess.

При использовании описанного способа запрос будет обрабатываться Apache, и ограничения в .htaccess будут вступать в силу."

Вопрос, что мне нужно сделать, чтобы закешировать файлы (например js)?

lonelywoolf
На сайте с 23.12.2013
Offline
151
#1

gabeLima, Вообще, есть такая штука как IfModified - браузеры должны это дело и так кешировать. Скорее всего, заголовки там просто не указываются и тема отдается на усмотрение браузеру, ничего делать дополнительно не нужно.

Платный и бесплатный хостинг с защитой от DDoS (http://aquinas.su)
gabeLima
На сайте с 19.04.2010
Offline
106
#2

lonelywoolf, хм.. сервис проверки написал, что не найден. Добавил код

<?php
$LastModified_unix = 1294844676; // время последнего изменения страницы
$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
$IfModifiedSince = false;
if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
$IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
$IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
exit;
}
header('Last-Modified: '. $LastModified);
?>

Вроде теперь на сайт пишет Результат: отлично, Last-Modified найден!

Но упорный pagespeed все так же пишет

Используйте кеш браузера для следующих ресурсов:
https://w.uptolike.com/widgets/v1/zp.js?pid= (30 минут)
https://mc.yandex.ru/metrika/watch.js (60 минут)
http://www.google-analytics.com/analytics.js (2 часа)
lonelywoolf
На сайте с 23.12.2013
Offline
151
#3
gabeLima:
Добавил код

Зачем? Если файл не изменялся веб-сервер отдаст 304 браузеру и он возьмет его из кэша. Без всяких заголовков. А вот если у вашего провайдера веб-сервер так не делает - открывается огромный вопрос в его компетенции.

gabeLima:
упорный pagespeed все так же пишет

Это проблемы не сайта. Проверьте сами кэширование в вашем браузере?

MU
На сайте с 01.10.2013
Offline
43
#4

Если необходимо включить кэширование для статического контента в рамках веб-сервера Nginx, то ye;yj строку в каждый виртуалхост в location, где происходит выдача статического контента:

expires max;

в expires допускается указание значений вида:

expires    24h;
expires modified +24h;
expires @24h;
expires 0;
expires -1;
expires epoch;
expires $expires;

Окончательно должен получиться примерно следующий блок:
server {
listen 80;
server_name ваш_домен;

location / {
...
}

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
...
expires max;
}
}
Хостинг на SSD от 49 руб./мес. (http://mne.ru/services/virt_hosting.shtml) + бесплатный SSL VPS/VDS на SSD в России от 75 руб./мес. (http://mne.ru/services/vps.shtml) Скидка 10% на хостинг и VPS по промокоду — SEARCHENGINES
gabeLima
На сайте с 19.04.2010
Offline
106
#5

Спасибо за советы

MNERU:
строку в каждый виртуалхост в location

У меня нет доступа к конфигам, только папка /home или это можно сделать в директории с сайтом?

Зачем?

Ну я запустил через сайт проверки If-Modified-Since страницы и мне было выдано следующее

Last-Modified не найден!

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Tue, 26 Jul 2016 05:58:22 GMT
Content-Type: text/html; charset=utf-8
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.29
Set-Cookie: 213123231221312212312321231231232; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Cache-Control: no-cache, max-age=600
Pragma: no-cache
Expires: Tue, 26 Jul 2016 06:08:22 GMT
Vary: Accept-Encoding
Получено: 448 байт
Затрачено: 0,26 сек

И далее я нашел рекомендации по коду. Когда добавил этот код, то получил 2% в gtmetrix и +2 в pagespeed. Хотя Yslow все равно пишет

А что касабельно моего первого сообщения? Саппорт хостинга же сказал про кеширование

- в скриптах сайта можно использовать ссылки на файлы, которые физически отсутствуют (например, для файлов на сервере использовать формат pdx);
- осуществлять перенаправления с таких файлов на существующие при помощи .htaccess.

что это и как реализуется? Я так понимаю, что стандартные правила в htaccess, как многие делают, не прокатывает в связке nginx + apache.

lonelywoolf
На сайте с 23.12.2013
Offline
151
#6
gabeLima:
Когда добавил этот код, то получил 2% в gtmetrix и +2 в pagespeed.

видите в чем дело... У вас должно всё кэшироваться и без этого. Проверьте средствами браузера, не смотрите на всякие сторонние тулзы.

gabeLima:
Я так понимаю, что стандартные правила в htaccess, как многие делают, не прокатывает в связке nginx + apache.

Прокатывают, если сконфигурировано по-другому. У вашего хостера жеж какая-то шняга. Можете в качестве CSS и JS указать несуществующие файлы, а потом апачем реврайтить их на правильные. Но это всё бред и не надо так делать.

[umka]
На сайте с 25.05.2008
Offline
456
#7

На кэширование ответов сторонних сервисов (bs.yandex.ru, w.uptolike.com, www.google-analytics.com, mc.yandex.ru) могут повлиять только они сами. Вы на это не сможете повлиять никак.

Соответственно, если вас не устраивают сроки кэширования, которые предлагают эти сервисы, то скачивайте файлы к себе, отдавайте со своими заголовками, и периодически обновляйте.

Лог в помощь!
L
На сайте с 10.02.2015
Offline
220
#8

Мой прошлый хостер давал ностройки для статитики на nginx.

То, что у них нету кеширования статики - это дибилоидство.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий