digital-garden/dev/architecture/highload/Кэширование на стороне Nginx.md
Struchkov Mark d5e6b54a58
All checks were successful
continuous-integration/drone/push Build is passing
Кэширование
2024-09-11 21:28:43 +03:00

74 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
tags:
- maturity/🌱
date:
- - 2024-04-07
zero-link:
- "[[00 Nginx]]"
parents:
- "[[../Кэширование|Кэширование]]"
linked:
- "[[Кэширование статики в Nginx]]"
---
Если какие-то запросы не часто меняются, то можно закэшировать их на стороне сервера. Тогда Nginx один раз получит результат запроса от вашего приложения, а дальше будет отдавать их другим клиентам.
Перед настройками, нам нужно создать директорию, в которой будут хранится данные кэша:
```shell
sudo mkdir -p /var/nginx/cache
```
Чтобы включить кэширование, нужно прописать несколько директив в основной конфигурации `nginx.conf`.
```nginx
http {
proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=nginxcash:60m max_size=256m inactive=24h;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_methods GET HEAD;
proxy_cache_min_uses 2;
}
```
`proxy_cache_path` указывает путь в файловой системе.
Не кэшируйте HTTP-ответы при первом обращении. Используйте `proxy_cache_min_uses 2`, чтобы кэшировать только те элементы, к которым обращались более одного раза. Таким образом, вы уменьшите нагрузку прокси-кэша на запись и предотвратите заполнение кэша содержимым, к которому редко обращаются.
Ключ кэширования Nginx по умолчанию не очень хорошо работает с сайтами с несколькими поддоменами. Вы можете настроить ключ кэширования, задав proxy_cache_key. В своей конфигурации я использую вот такой ключ: `proxy_cache_key $scheme$host$uri$is_args$args;`
## Переносим кэш Nginx в RAM
Можно значительно ускорить кэш, если смонтировать его не в файловую систему а в RAM.
Для этого также создаем папку для кэша, можно использовать ту же, но ее нужно очистить от папок. Далее монтируем созданный каталог в RAM с помощью команды [tmpfs](https://wiki.archlinux.org/index.php/Tmpfs), выделяя 256 мегабайт под кэш:
```shell
sudo mount -t tmpfs -o size=256M tmpfs /var/nginx/cache
```
Если вам понадобиться отключить RAM-кэш, просто выполните команду:
```shell
sudo umount /var/nginx/cache
```
Чтобы автоматически пересоздать каталог к'ша в RAM после перезагрузки сервера, нам нужно обновить файл `/etc/fstab`. Добавьте в него следующую строку:
```txt
tmpfs /var/nginx/cache tmpfs defaults,size=256M 0 0
```
***
## Мета информация
**Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]]
**Родитель**:: [[../Кэширование|Кэширование]]
**Источник**::
**Автор**::
**Создана**:: [[2024-04-07]]
### Дополнительные материалы
- [Оптимизация NGINX](https://struchkov.dev/blog/ru/nginx-optimization/)
- [Nginx cache: всё новое — хорошо забытое старое / Хабр](https://habr.com/ru/post/428127/)
- [[../../../../../_inbox/Кэширование статики в Nginx|Кэширование статики в Nginx]]
### Дочерние заметки
```dataview
LIST
FROM [[]]
WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link)
```