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

Скачать Кэширование ответа от backend с помощью NGINX
Недавно искали:

Itnull

Команда форума
Администратор
Регистрация
22.05.13
Сообщения
25.288
Реакции
9.246
Веб-сайт
itnull.me
  • Автор темы
  • Администратор
  • Модер.
  • Команда форума
  • #1
NGINX позволяет значительно ускорить процесс загрузки страницы, не обращаясь к бэкэнду, а выдавая готовый html из кэша. Для работы данной функции необходимо, чтобы веб-сервер был версии 0.7.44 и выше (проверить можно командой nginx -v).

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

Настройка кэширования для 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 сам удаляет устаревшие данные.
Создаем каталог для хранения кэша и задаем владельца:
mkdir /var/cache/nginx
chown nginx:nginx /var/cache/nginx

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

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

vi /etc/nginx/conf.d/default.conf
... и добавим к 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
Теперь заходим на сайт и смотрим в каталог с кэшем — в нем должны появиться каталоги и файлы:

ls /var/cache/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:

vi /etc/nginx/nginx.conf
Добавляем в секцию http:

Код:
http {
...
fastcgi_cache_path /var/cache/fastcgi levels=1:2 keys_zone=fastcgi:64m inactive=2h max_size=2g;
...
}
* обратите внимание, что мы задали другой каталог и keys_zone.

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

mkdir /var/cache/fastcgi
chown nginx:nginx /var/cache/fastcgi

Настраиваем хост:

vi /etc/nginx/conf.d/default.conf

Код:
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:

rm /var/cache/nginx/*
б) для fastcgi_cache_path:

rm /var/cache/fastcgi/*

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

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

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

mkdir /var/ramdisk
... и дадим на него полные права:

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

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

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

vi /etc/fstab
... и добавляем:

ramdisk /var/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=2G 0 0
Теперь, когда у нас есть каталог, данные которого хранятся в оперативной памяти, редактируем параметр proxy_cache_path или fastcgi_cache_path в NGINX:

vi /etc/nginx/nginx.conf
Код:
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;
Перезапускаем nginx:

systemctl restart nginx
 
Назад
Сверху Снизу