- Автор темы
- Администратор
- Модер.
- Команда форума
- #1
NGINX позволяет значительно ускорить процесс загрузки страницы, не обращаясь к бэкэнду, а выдавая готовый html из кэша. Для работы данной функции необходимо, чтобы веб-сервер был версии 0.7.44 и выше (проверить можно командой nginx -v).
Для FastCGI кэш задается с помощью опций fastcgi_cache_*. Для запросов к бэкэнду с помощью proxy_pass — proxy_cache_*.
В секцию http добавляем:
* в данном примере мы задали глобальную настройку для кэширования:
... и добавим к proxy_pass кэширование — мы получим что-то на подобие:
* где:
Теперь заходим на сайт и смотрим в каталог с кэшем — в нем должны появиться каталоги и файлы:
Мы должны увидеть что-то на подобие:
Открываем конфиг nginx:
Добавляем в секцию http:
* обратите внимание, что мы задали другой каталог и keys_zone.
Создаем каталог для кэша:
Настраиваем хост:
* опции fastcgi_ аналогичны опциям proxy_.
Проверяем настройки и применяем их:
Настройка выполняется для каждого виртуального хоста (секция server):
* в данном примере мы задаем для файлов изображений (jpg, jpeg, gif, png) кэш до 31 декабря 2037 23:55:55 (max), для файлов css и js — 1 неделя с момента их модификации. Данные настройки мы задаем при помощи параметра expires, который, в свою очередь, задает заголовок cache-control. NGINX будет искать статические файлы в корневом каталоге /var/www/site.
После применяем настройки:
* обратите внимание, что в данном примере мы отключаем кэширование как для запросов proxy_pass, так и fastcgi_pass.
При отключении кэширования для статики используем следующую конфигурацию:
* expires epoch задаст заголовок сache-control с временем окончания кэша "1 января 1970 00:00:01".
Для сброса кэша мы просто должны удалить содержимое каталога, который прописан в опции proxy_cache_path или fastcgi_cache_path — в нашем случае, это /var/cache/nginx и /var/cache/fastcgi соответственно.
а) для proxy_cache_path:
б) для fastcgi_cache_path:
Создаем обычный каталог, в который будем монтировать часть оперативной памяти:
... и дадим на него полные права:
Монтируем часть оперативной памяти как обычный каталог:
* в данном примере мы монтируем 2 Гб оперативной памяти как папку /var/ramdisk. Возможно, правильнее будет заранее убедиться в наличие свободной памяти командой free.
Для автоматического монтирования открываем на редактирование fstab:
... и добавляем:
Теперь, когда у нас есть каталог, данные которого хранятся в оперативной памяти, редактируем параметр proxy_cache_path или fastcgi_cache_path в NGINX:
... или:
Перезапускаем nginx:
Для 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;
...
}
Создаем каталог для кэша:
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;
}
}
После применяем настройки:
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;
}
При отключении кэширования для статики используем следующую конфигурацию:
Код:
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