Перейти к содержимому

Как очистить кэш nginx

  • автор:

[nginx] Как принудительно очистить кэш для сайта/URI

Всем привет, есть такой вопрос: как принудительно очистить кэш у nginx`а?

Нашел упоминание о модуле ngx_cache_purge(http://labs.frickle.com/nginx_ngx_cache_purge/), но что-то не понял ни как его использовать ни как он работает 🙂

A_Hariton ★
25.02.10 15:16:24 MSK

поищи в архиве рассылки nginx-ru, там этот вопрос поднимался.

true_admin ★★★★★
( 25.02.10 18:01:43 MSK )

rm -rf proxy_temp

и перезапустите nginx

Sylvia ★★★★★
( 25.02.10 18:05:38 MSK )
Ответ на: комментарий от Sylvia 25.02.10 18:05:38 MSK

было бы классным решением, еслибы не чистился кэшь для всех сайтов 🙁

A_Hariton ★
( 25.02.10 18:15:00 MSK ) автор топика
Ответ на: комментарий от A_Hariton 25.02.10 18:15:00 MSK

server < listen site; server_name site; root /var/www/site; location / < try_files /cache/$uri @stor; >location @stor < proxy_pass http://servak; proxy_set_header Host $host; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /var/www/site/cache/; root /var/www/site/cache/; >> 

ну и чистим соответственно руками (кроном). перезапускать ничего не нужно

r0mik ★
( 25.02.10 22:26:56 MSK )
Ответ на: комментарий от r0mik 25.02.10 22:26:56 MSK

а что обозначает конструкция @stor ?

A_Hariton ★
( 26.02.10 12:20:12 MSK ) автор топика
Ответ на: комментарий от A_Hariton 26.02.10 12:20:12 MSK

это отдельный локейшн в котором как раз и указывается куда класть кеш данного вирт.хоста
proxy_pass — куда проксировать proxy_temp_path и root в этом локейшнене указывает куда оно будет складироваться (/var/www/site/cache/).
потом в рутовом локейшене с помощью try-files будет сделана попытка сначала забрать из кеша, а если там нету файла то оно на прокси передаст (@stor)
так делаете с каждым вашим вирт.хостом, меняя соответствующим образом site_name, root и proxy_temp_path.
то есть второй (третий) виртхост будет таким:

server < listen mysite2.net; server_name mysite2.net; root /var/www/mysite2.net; location / < try_files /cache/$uri @stor; >location @stor < proxy_pass http://servak; proxy_set_header Host $host; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /var/www/mysite2.net/cache/; root /var/www/mysite2.net/cache/; >> 

таким образом кеши будут отдельно в /var/www/САЙТ/cache/.
вообще это один из вариантов возможных, так как не понятно как оно у вас там сделано. вы бы показали свой конфиг что ли.

r0mik ★
( 26.02.10 13:58:46 MSK )
Ответ на: комментарий от r0mik 26.02.10 13:58:46 MSK

да нечего мне собственно показываьть, просто есть конфигурация

users -> nginx -> Apache

nginx кэширует ответы от Apache чтобы ему было не так плохо. Нужно сделать возможность мочить кэш сайта при необходимости.

A_Hariton ★
( 26.02.10 16:00:44 MSK ) автор топика
Ответ на: комментарий от A_Hariton 26.02.10 16:00:44 MSK

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

r0mik ★
( 26.02.10 18:25:19 MSK )
Ответ на: комментарий от r0mik 26.02.10 18:25:19 MSK

эээмм. извиняюсь, вообще-то эта конфа рассчитана на статику, а я что-то не в те дебри залез.
короче вам, по простому говоря, вообще нужно описать только дерективу proxy_temp_path и proxy_cache_path, а store не трогайте)))) ну и перезапускать таки нужно, это да..

Кэширование ответа от backend с помощью NGINX

Обновлено

Обновлено: 02.08.2023 Опубликовано: 27.01.2020

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

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

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

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

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

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

Открываем конфигурационный файл nginx:
vi /etc/nginx/nginx.conf
В секцию http добавляем:
http <
.
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=all:64m inactive=2h max_size=2g;
.
>

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

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

chown nginx:nginx /var/cache/nginx

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

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

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

location / if ($http_cookie ~* «.+» ) set $cookie_cache_bypass 1;
>
proxy_cache_bypass $cookie_cache_bypass;
proxy_pass http://localhost:3000;
.
proxy_cache all;
proxy_cache_methods GET POST HEAD;
proxy_cache_valid 404 502 503 5m;
proxy_cache_valid any 1h;
proxy_cache_use_stale error timeout invalid_header updating;
>

  • set $cookie_cache_bypass 1 — задаем значения переменной $cookie_cache_bypass, если передаются куки. Необходимо для предотвращения отдачи устаревших данных.
  • proxy_cache_bypass — не отдавать данные из кэша. В нашем случае, применяется при куках.
  • proxy_pass — передает запросы на бэкэнд.
  • proxy_cache_methods — по умолчанию, закэшированными будут только запросы GET и HEAD. Если нам нужны другие методы, то добавляем их. В нашем примере добавлен POST.
  • proxy_cache — включаем кэширование.
  • proxy_cache_valid — задает время кеширования. В нашем примере первый параметр задает кэширование страниц с кодами ответов 404, 502, 503 на 5 минут, второй — для всего остального на 1 час.
  • proxy_cache_use_stale — указывает, в каких случаях можно отдать устаревший кэш.

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

NGINX настроен. Проверим корректность настроек и применяем их, если нет ошибок:

nginx -t && nginx -s reload

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

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

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:

Добавляем в секцию http:

http .
fastcgi_cache_path /var/cache/fastcgi levels=1:2 keys_zone=fastcgi:64m inactive=2h max_size=2g;
.
>

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

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

chown nginx:nginx /var/cache/fastcgi

location / if ($http_cookie ~* «.+» ) set $cookie_cache_bypass 1;
>
fastcgi_cache_bypass $cookie_cache_bypass;
fastcgi_pass http://localhost:9000;
.
fastcgi_cache all;
fastcgi_cache_methods GET POST HEAD;
fastcgi_cache_valid 404 502 503 5m;
fastcgi_cache_valid any 1h;
fastcgi_cache_use_stale error timeout invalid_header updating;
>

* опции fastcgi_ аналогичны опциям proxy_.

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

nginx -t && nginx -s reload

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

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

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

server .
location ~* ^.+\.(css|js)$ root /var/www/site
expires modified +1w;
>
location ~* ^.+\.(jpg|jpeg|gif|png)$ root /var/www/site
expires max;
>
>

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

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

systemctl restart nginx

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

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

location /proxy_nocache proxy_pass http://localhost:3000;
.
proxy_cache off;
>

location /fastcgi_nocache fastcgi_pass http://localhost:9000;
.
fastcgi_cache off;
>

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

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

server .
location ~* ^.+\.(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;

systemctl restart nginx

Как очистить (удалить/обнулить/сбросить) cache в nginx?

Как очистить (удалить/обнулить/сбросить) cache в nginx?

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

Удаление всего кеша с диска

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

При использовании proxy_cache

Местоположение каталога, в котором будут хранится закешированные ресурсы, определяется параметром proxy_cache_path в конфигурационном файле, обычно, если не менять конфигурацию, все расположено в директории: /var/cache/nginx Чтобы удалить все закешированные страницы и файлы, необходимо проделать следующее:

sudo find /var/cache/nginx -type f -delete

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

При использовании fastcgi_cache

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

fastcgi_cache_path /var/run/nginx-fastcgi-cache levels=1:2 keys_zone=FASTCGICACHE:150m inactive=60m;

То отсюда видно, что кеш хранится в директории /var/run/nginx-fastcgi-cache
Чтобы удалить все закешированные страницы и файлы, необходимо проделать следующее:

sudo find /var/run/nginx-fastcgi-cache -type f -delete

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

Clear the Cache of Nginx

A side effect of content caching is that content updates on the origin server don’t necessarily propagate immediately to the cache. This means that old content may persist for some time.

For example, whenever the execution of update operations happens, there’s a probability that the client might receive a mixture of stale and current resources making the presentation seem inconsistent.

In this tutorial, we’ll explore different ways to clear the cache on Nginx. Before we move on to how we can clear the cache, we need to know the proxy_cache_path value. In most cases, the path is /var/cache/nginx.

2. Manually Deleting the Files From the Cache Directory

This is one of the simplest methods and works well if we’re looking for a more manual approach.

Below is a response header for a file we have in the cache:

$ curl -I http://my.example.com/index.html HTTP/1.1 200 OK Server: nginx/1.20.2 Date: Sun, 20 Nov 2022 17:25:08 GMT Content-Type: text/html Content-Length: 2419 Connection: keep-alive Last-Modified: Mon, 14 Nov 2022 22:16:45 GMT ETag: "7gx5ntda-fdb" Cache: HIT Accept-Ranges: bytes

The cache header has the value ‘HIT’, meaning the file is cached.

Let’s purge the Nginx cache manually:

$ sudo rm -rf /var/cache/nginx/*

Now, let’s check the cache header value after using the curl command above:

$ curl -I http://my.example.com/index.html HTTP/1.1 200 OK Server: nginx/1.20.2 Date: Sun, 20 Nov 2022 18:10:25 GMT Content-Type: text/html Content-Length: 3782 Connection: keep-alive Last-Modified: Sun, 20 Nov 2022 17:50:10 GMT ETag: "7ct9wqxm-fdb" Cache: MISS Accept-Ranges: bytes

We can confirm the purging of the cache by looking at the new value in the response header cache showing a ‘MISS’ value.

3. Using proxy_cache_bypass Module

The proxy_cache_bypass module is useful in the invalidation of cache assets. It does this by instructing Nginx to pass the request back to the backend server and refresh the cached resource upon retrieval.

In a real-world scenario, we are looking for this when handling cache invalidation.

To make this type of purge block, we need to first enable purge from local IP only:

if ($remote_addr ~ "^(example.ip)$")

Then we can enable the BYPASS method:

proxy_cache_bypass $bypass;

Combining the changes above, here’s the full configuration file:

proxy_cache_path /var/cache/nginx keys_zone=my_zone:10m inactive=8h; server < listen 80 default_server; listen [::]:80 default_server; set $bypass 0; if ($remote_addr ~ "^(example.ip)$") < set $bypass $http_cache_purge; >root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; proxy_cache_key $scheme$http_host$uri$is_args$args; location / < proxy_cache my_zone; proxy_pass http://my.example; proxy_cache_valid 200 1d; add_header Cache $upstream_cache_status; proxy_cache_min_uses 2; proxy_cache_bypass $bypass; >>

To test this method, we need to change the origin file to confirm that Nginx took the fresh version and cached it.

Let’s calculate the MD5 hash signature of the cached file:

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 10918 100 10918 0 0 710k 0 --:--:-- --:--:-- --:--:-- 761k 3526531ccd6c6a1d2340574a305a18f8 -

Next, let’s make any kind of change to the origin file and then check the resulting MD5 hash signature:

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 162 100 162 0 0 158k 0 --:--:-- --:--:-- --:--:-- 158k 1b7c22a214949975556626d7217e9a39 -

After doing this, we have a firm understanding of what to expect on the Nginx side.

Let’s send a new request for the Nginx version with the request header to purge the cache:

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 162 100 162 0 0 158k 0 --:--:-- --:--:-- --:--:-- 158k 1b7c22a214949975556626d7217e9a39 -

Finally, let’s confirm if the cached file was successfully purged:

$ curl localhost/index.html -H 'Cache-Purge: true' -I HTTP/1.1 200 OK Server: nginx/1.14.1 Date: Thu, 03 Nov 2022 13:01:37 GMT Content-Type: text/html Content-Length: 4059 Connection: keep-alive Last-Modified: Thu, 03 Nov 2022 14:01:10 GMT ETag: "5f2befda-fdb" Cache: BYPASS Accept-Ranges: bytes

From the above header, we don’t have any ‘HIT’ or ‘MISS’ values. Only a ‘BYPASS’ value is visible.

This is because Nginx bypasses the local cache and heads straight to the backend server for the requested file.

4. Using proxy_cache_purge Module

The proxy_cache_purge module defines conditions under which a request is to be considered a cache purge request.

Whenever the value of at least one string parameter isn’t empty and not “0”, the cache entry with a matching cache key is removed. Successful requests return the 204 (No Content) response.

Purge requests with cache keys that end with an asterisk (“*”) will automatically remove all the cache entries matching the wildcard cache key.

Let’s explore how we can use the proxy_cache_purge module to clear the cache on Nginx.

We first map the $request_method to a custom variable which is the $cache_purge under the HTTP context:

http < . map $request_method $cache_purge < PURGE 1; default 0; >>

Here’s a sample of the full configuration file:

proxy_cache_path /tmp/cache keys_zone=mycache:10m levels=1:2 inactive=60s; map $request_method $purge_method < PURGE 1; default 0; >server < listen 80; server_name www.example.com; location / < proxy_pass http://localhost:8008; proxy_cache mycache; proxy_cache_purge $purge_method; >>

Then let’s send the purge request:

$ curl -X PURGE -D – "http://www.example.com/*"   Example Domain    body < background-color: #f0f0f2; . . truncated. 

Here, the command ends with an asterisk that purges all the pages under the http://www.example.com/ domain. We receive HTML content of the homepage as the response.

5. Conclusion

In this article, we have observed the different ways we can clear the cache of an Nginx server. Some of the methods have a manual process of clearing the cache. However, we’ve also explored the proxy_cache_bypass method, which can be helpful in clearing the cache automatically.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *