Как отключить кэш на сервере

Обновлено: 07.07.2024

NGINX позволяет значительно ускорить процесс загрузки страницы, не обращаясь к бэкэнду, а выдавая готовый html из кэша. Для работы данной функции необходимо, чтобы веб-сервер был версии 0.7.44 и выше (проверить можно командой nginx -v).

Для FastCGI кэш задается с помощью опций fastcgi_cache_*. Для запросов к бэкэнду с помощью proxy_pass — proxy_cache_*.

Рекомендации и противопоказания

Кэш — это данные не первой свежести. Это важно учитывать, если мы хотим настроить эффективное кэширование средствами nginx. Мы можем столкнуться с различными проблемами, например, неспособность сервера продлить сессию авторизованного пользователя или отображение старой информации на портале с динамично меняющимся контентом. Чтобы избежать данных проблем, настройка nginx должна быть тесно сопряжена с разработкой сайта. Идеальная работа кэша возможна только при полном понимании внутренних механизмах работы портала, такие как, отправка запросов на авторизацию, продление сессии, обновлении контента — программист может написать для этого запрос по определенным URL, для которого администратор NGINX может отключить кэширование.

Кэширование динамики будет полезно для сайтов с высокой посещаемостью, из-за которой создается высокая нагрузка на сервер и он не может успеть выполнить обработку запросов. Также оно будет полезно для отдельных страниц, содержимое которых меняется очень редко, но отработка скриптов выполняется долго.

Настройка кэширования для proxy_pass

Как было сказано выше, для разных методов обращения к серверу, который обрабатывает запрос, нужно использовать разные методы кэширования.

Включение кэширования

Открываем конфигурационный файл nginx:

* в данном примере мы задали глобальную настройку для кэширования:

  • /var/cache/nginx — путь хранения кэша.
  • levels — уровень вложенности каталогов. В данном примере мы задаем настройку, при которой в каталог с кэшем будет создан каталог, а в ней — еще один каталог.
  • keys_zone — имя зоны в разделяемой памяти, где будет храниться кэш, а также ее размер.
  • inactive — задает время, после которого кэш будет автоматически чиститься.
  • max_size — максимальный размер данных под кэш. Когда место заканчивается, nginx сам удаляет устаревшие данные.

Создаем каталог для хранения кэша и задаем владельца:

chown nginx:nginx /var/cache/nginx

Настройка хостов

Чтобы определенный сайт или отдельная страница кешировала запрос, открываем конфигурационный файл с настройками виртуального домена или хоста, например:

. и добавим к proxy_pass кэширование — мы получим что-то на подобие:

Применение настроек

NGINX настроен. Проверим корректность настроек:

Если ошибок нет, применяем их:

systemctl restart nginx

Теперь заходим на сайт и смотрим в каталог с кэшем — в нем должны появиться каталоги и файлы:

Мы должны увидеть что-то на подобие:

drwx------. 3 nginx nginx 4096 Jan 25 16:09 0
drwx------. 5 nginx nginx 4096 Jan 25 16:09 2
drwx------. 5 nginx nginx 4096 Jan 25 16:15 3
drwx------. 3 nginx nginx 4096 Jan 25 16:09 4
drwx------. 4 nginx nginx 4096 Jan 26 05:08 5
drwx------. 3 nginx nginx 4096 Jan 25 16:09 6
drwx------. 3 nginx nginx 4096 Jan 26 04:18 7
drwx------. 3 nginx nginx 4096 Jan 25 16:10 8
drwx------. 5 nginx nginx 4096 Jan 25 16:15 a
drwx------. 3 nginx nginx 4096 Jan 25 16:09 b
drwx------. 5 nginx nginx 4096 Jan 26 04:19 e
drwx------. 3 nginx nginx 4096 Jan 25 19:55 f

Настройка кэширования для fastcgi_pass

Настройка fastcgi_cache аналогична proxy_cache и настройки можно сделать по подобию последнего, заменив proxy_ на fastcgi_. Мы разберем основные настройки без подробностей и комментариев.

Открываем конфиг nginx:

* обратите внимание, что мы задали другой каталог и keys_zone.

Создаем каталог для кэша:

chown nginx:nginx /var/cache/fastcgi

Проверяем настройки и применяем их:

systemctl restart nginx

Кэширование статики

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

Настройка выполняется для каждого виртуального хоста (секция server):

* ^.+\.(css|js)$ root /var/www/site
expires modified +1w;
>
location

* в данном примере мы задаем для файлов изображений (jpg, jpeg, gif, png) кэш до 31 декабря 2037 23:55:55 (max), для файлов css и js — 1 неделя с момента их модификации. Данные настройки мы задаем при помощи параметра expires, который, в свою очередь, задает заголовок cache-control. NGINX будет искать статические файлы в корневом каталоге /var/www/site.

После применяем настройки:

systemctl restart nginx

Отключение кэширования

Как говорилось выше, в некоторых случаях, кэширование может навредить и на некоторых страницах его стоит отключить. В настройках виртуального хоста, мы можем создать отдельный location, для которого отключиться кэш, например:

* обратите внимание, что в данном примере мы отключаем кэширование как для запросов proxy_pass, так и fastcgi_pass.

При отключении кэширования для статики используем следующую конфигурацию:

* ^.+\.(jpg|jpeg|gif|png|css|js)$ root /var/www/site
expires epoch;
>
>

* expires epoch задаст заголовок сache-control с временем окончания кэша "1 января 1970 00:00:01".

Сброс кэша

Удалить кэш на стороне сервера nginx мы можем только для бэкэнда. Для статики нужно удалять кэш в самом браузере (например, в настройках или с помощью дополнений).

Для сброса кэша мы просто должны удалить содержимое каталога, который прописан в опции proxy_cache_path или fastcgi_cache_path — в нашем случае, это /var/cache/nginx и /var/cache/fastcgi соответственно.

а) для proxy_cache_path:

б) для fastcgi_cache_path:

Хранение кэша в оперативной памяти

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

Создаем обычный каталог, в который будем монтировать часть оперативной памяти:

. и дадим на него полные права:

chmod 777 /var/ramdisk

Монтируем часть оперативной памяти как обычный каталог:

mount -t tmpfs -o size=2G ramdisk /var/ramdisk

* в данном примере мы монтируем 2 Гб оперативной памяти как папку /var/ramdisk. Возможно, правильнее будет заранее убедиться в наличие свободной памяти командой free.

Для автоматического монтирования открываем на редактирование fstab:

ramdisk /var/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=2G 0 0

Теперь, когда у нас есть каталог, данные которого хранятся в оперативной памяти, редактируем параметр proxy_cache_path или fastcgi_cache_path в NGINX:

proxy_cache_path /var/ramdisk levels=1:2 keys_zone=all:64m inactive=2h max_size=2g;

fastcgi_cache_path /var/ramdisk levels=1:2 keys_zone=fastcgi:64m inactive=2h max_size=2g;

Современные браузеры достаточно часто используют в своей работе локальный кэш. Что это означает? Это означает что браузер, получив от сервера html-документ, картинку или другой ресурс, размещает его в своем локальном кэше (проще говоря, записывает полученный ресурс на жесткий диск машины пользователя) и при последующих запросах к такому ресурсу не обращается на сервер, а получает ресурс из локального кеша.

Данная алгоритм работы браузеров резко повышает скорость загрузки html-документов. Так как если ресурс уже загружался, и как следствие расположен в локальном кэше, то время доступа определяется не пропускной способностью канала связи (например, модемного подключения) а скоростью работы жесткого диска.

Однако наряду с достоинствами данный метод так же порождает ряд проблем. В частности большинство начинающих web-программистов, при разработке динамических сайтов, сталкивается с одной и той же проблемой. Суть этой проблемы заключается в том, что вместо повторного обращения на сервер за страницей, запускающей на сервере скрипт, модифицирующий некую информацию, браузер обращается в локальный кэш. И в результате, например трех обращений, происходит не три модификации информации, расположенной на сервере, а только одна.

Для того, что бы заставить браузер каждый раз обращаться за страницей на сервер необходимо запретить браузеру заносить данный ресурс в кэш. Ниже приведены наиболее распространенные методы, запрещающие кэширование или позволяющие его обойти.

Генерация нового URL

Каждый раз результат такого запроса будет кэшироваться, но так как кэширование производится по всему url, то каждый раз будет получаться новый url и браузер будет вынужден запрашивать с сервера ресурс, так как url двух запросов не будут совпадать в точности.
Поля заголовков

Поле заголовка Expires

Значением данного заголовка является дата, после которой содержимое ресурса устареет. Если пользователь после этой даты обратиться к ресурсу, браузер должен запросить ресурс у сервера, а не из локального кэша.

Поле заголовка Last-Modified

Значением данного заголовка является дата последнего обновления ресурса. Большинство современных браузеров используют следующий алгоритм, если ресурс уже находится в локальном кэше:

Если ресурс, расположенный на сервере, содержит в данном поле текущую дату, то браузер будет каждый раз запрашивать ресурс с сервера, а не из локального кэша. Следующий листинг демонстрирует использование поля заголовка Last-Modified:

Поля заголовка Cache-Control и Pragma

Windows содержит кэш DNS на стороне клиента. функция кэширования dns на стороне клиента может создать ложное впечатление, что балансировка нагрузки dns с циклическим перебором не происходит с dns-сервера на клиентский компьютер Windows. При использовании команды ping для поиска того же имени домена A-записи клиент может использовать тот же IP-адрес.

Как отключить кэширование на стороне клиента

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

чтобы полностью отключить кэш DNS в Windows, используйте средство контроллера служб или средство "службы", чтобы задать для параметра "тип запуска службы DNS-клиента значение" отключено". обратите внимание, что имя Windows службы DNS-клиента также может отображаться как "днскаче".

Если кэш сопоставителя DNS деактивируется, Общая производительность клиентского компьютера снижается, а сетевой трафик для запросов DNS увеличивается.

Служба DNS-клиента оптимизирует производительность разрешения имен DNS за счет хранения ранее разрешенных имен в памяти. Если служба DNS-клиента отключена, компьютер может по-прежнему разрешать DNS-имена с помощью DNS-серверов сети.

когда сопоставитель Windows получает ответ (положительный или отрицательный) на запрос, он добавляет этот ответ в свой кэш и тем самым создает запись ресурса DNS. Сопоставитель всегда проверяет кэш перед запросом DNS-сервера. Если запись ресурса DNS находится в кэше, сопоставитель использует запись из кэша вместо запроса к серверу. Такое поведение ускоряет запросы и уменьшает сетевой трафик для запросов DNS.

Для просмотра и очистки кэша сопоставителя DNS можно использовать средство ipconfig. Чтобы просмотреть кэш сопоставителя DNS, выполните в командной строке следующую команду:

Эта команда отображает содержимое кэша сопоставителя DNS, включая записи ресурсов DNS, предварительно загруженные из файла Hosts, и все недавно запрошенные имена, разрешенные системой. Через некоторое время сопоставитель отклоняет запись из кэша. Период времени указывается значением срока жизни (TTL) , связанным с записью ресурса DNS. Кэш также можно очистить вручную. После очистки кэша компьютер должен снова запрашивать DNS-серверы для любых записей ресурсов DNS, которые ранее были разрешены компьютером. Чтобы удалить записи в кэше сопоставителя DNS, выполните ipconfig /flushdns команду из командной строки.

Использование реестра для управления временем кэширования

Внимательно выполните действия, описанные в этом разделе. Неправильное изменение реестра может привести к серьезным проблемам. Перед внесением изменений создайте резервную копию реестра для его восстановления в случае возникновения проблем.

Промежуток времени, в течение которого кэшируется положительный или отрицательный ответ, зависит от значений записей в следующем разделе реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNSCache\Parameters

Число секунд, указанное в ответе на запрос, полученным распознавателем

Значение параметра реестра макскачеттл .

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

Запустите редактор реестра (Regedit.exe).

Найдите и выберите в реестре следующий раздел:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters

В меню Правка наведите указатель мыши на пункт Создать, выберите пункт значение DWORD, а затем добавьте следующие значения реестра:

Имя значения: Макскачеттл

Тип данных: REG_DWORD

Данные значения: значение по умолчанию 86400 секунд.

Если вы уменьшите максимальное значение TTL в кэше DNS клиента на 1 секунду, это даст внешнее представление о том, что кэш DNS на стороне клиента отключен.

Подписаться Бесплатная «Серебряная» новостная рассылка . Подписчиков RSS

За последние 60 дней ни разу не выходила

Статистика

Как запретить кэширование страниц сайта

Речь здесь не о том, как запретить кэш лишь в браузере, а о том, как запретить кэширование контента на стороне сервера. Многим наверно известны методы запрета кэширования в заголовках HTML-страниц, например упомянутые в Wikipedia, такие как

Кроме того можно использовать и такие

В первой строке указывается рекомендация запрещать кэширование вообще, а вторая строка указывает браузеру, что страница используется в приватном режиме, поэтому ее содержимое не должно кэшироваться. Мета-теги в третьей и четвертой строках указывают на то, что срок хранения в кэше ограничено временем max-age=10800 (что равно 3-м часам) для браузера и для прокси соответственно.

Приведенные выше в пример рекомендации хороши однако лишь для тех владельцев сайтов, у которых нет доступа к PHP-скриптам, и больше подходят для нединамических страниц. Это как, говорится, «последний шанс», и лишь потому, что многие браузеры, да к тому же их многочисленные версии, все меньше и меньше обращают внимание на то, что прописано в HEAD-секциях страниц сайтов. Каждый из них «тянет одеяло на себя» и не все и не всегда придерживаются каких-то стандартов. Другими словами, что что было сказано выше, может не сработать.

Запрет кэширования страниц на PHP

Вот пример простого указания сроков кэширования страниц сайта:

Однако на практике оказалось, что этого может быть недостаточно, и после многочисленных экспериментов с разными браузерами наиболее лучшим вариантом запрета кэширования на PHP будет такой подход:

В некоторых случаях может пригодиться в параметре заголовка использовать дополнительные параметры post-check=0 и pre-check=0

Некоторые добиваются запрета кэширования страниц или изображений методом добавления к ссылкам рандомного (случайного) числа, как параметра запроса. Точнее это не запрет, а попытка обмануть браузер, что мол он должен заново загрузить страницу, так как URL уже изменен:

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

Проверка, что кэширование отключено

Проверить, кэшируется ли страница или нет, можно с помощью добавления времени сервера, в которое была сгенерирована конкретная страница, непосредственно в код страницы. Это легко сделать с помощью PHP

Запрет кэширования страниц средствами Apache .htaccess

Добавив в файл .htaccess, который находился в каталоге скриптов веб-чата, следующие установки, я решил проблему:

Так что тем, для кого проблема запрета кэширования страниц сайта является актуальной, то рекомендую использовать метод средствами файлов .htaccess сервера Apache. Правда это будет тоже работать лишь при условии, что на вашем хостинге будут загружены и подключены соответствующие модули — mod_expires.so и mod_headers.so . Подключены они или нет, можно будет убедиться при просмотре конфигурационного файла Apache, панели управления на хостинге или, в крайнем случае, обратившись с вопросом к тех.поддержке хостинга.

Если же эти модули у вас подключены, то вы можете манипулировать и кэшированием отдельных файлов, например? добавив в .htaccess такие директивы:

Кроме того, Вы сможете указывать время ограничения кэширования, например:

Эти варианты директив имеют одинаковый смысл и значение, и будут ограничивать кэширование сроком на 1 месяц. Еще можно будет указывать типы файлов контента со сроком окончания времени кэширования или указанием времени их модификации:

На этом пожалуй пока все. Надеюсь информация будет для Вас полезной. Если же у Вас есть свои наработки, дополнения, то не стесняйтесь, пишите их в комментариях или шлите мне по почте, а я добавлю (после проверки) в эту статью.

Не прошло и недели с момента релиза WordPress 3.7, как вышла новая версия 3.7.1. Это всего лишь корректирующее обновление WordPress, в котором не было никаких изменений функциональности, кроме исправления 11 багов, трем из которых был выставлен высокий приоритет важности.

Читайте также: