Как настроить кеширование запросов в nginx?

Как настроить кеширование запросов в nginx таким образом, чтобы все запросы с ответом 200 кешировались, а остальные не кешировались и проксировались на бекенд сервер? Требуется кешировать запросы вида sandbox6.dev.ru/api/v2/qa/diff/2291314/a49ef19f-60..., при этом 2291314 - это update index, который иногда меняется. Предоставленный конфигурационный файл не срабатывает, proxy_cache_valid 200 не приводит к необходимому результату.
  • 18 января 2024 г. 16:18
Ответы на вопрос 2
Для настройки кеширования запросов в nginx вам потребуется задействовать модуль `ngx_http_proxy_module`. Он позволяет настроить кеширование ответов от проксируемых серверов. Ниже приведен пример конфигурации, которая кэширует GET и HEAD запросы для определенных запросов, возвращающих статус 200.

Прежде всего, необходимо определить область для кэша в `http` блоке настройки:

```nginx
http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    server {
        listen       80;
        server_name  sandbox6.dev.ru;

        # Кеширование определенных запросов
        location ~ ^/api/v2/qa/diff/(.+)/(.+)$ {
            proxy_pass http://backend_server; # Замените на адрес вашего бекенд сервера

            # Включение кеширования
            proxy_cache my_cache;

            # Условие, при котором ответ будет кэшироваться
            proxy_cache_valid 200 60m; # кэшировать статус 200 на 60 минут

            # Ключ кэширования, указывается, какие части запроса учитываются при формировании ключа кэша
            # Так как update index меняется, его можно исключить из ключа
            proxy_cache_key $scheme$host$uri;

            # Хедеры, которые влияют на кэш или берутся из кэша
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # Остальные параметры проксирования, если необходимо
            # ...
        }
        
        # Прочие location, если они требуются
        #...
    }
}
```

Обратите внимание:
- `proxy_cache_path` задает путь к хранилищу кэша, `keys_zone` - это имя и размер зоны ключей кэша, `max_size` - максимальный размер кэша, `inactive` - время, через которое неиспользуемый кэш будет удален.
- `proxy_cache` указывает на зону кэша, которую вы определили (в данном случае `my_cache`).
- `proxy_cache_valid` указывает, как долго содержимое будет кэшироваться (в данном случае, только 200 OK ответы будут кэшироваться на 60 минут).
- `proxy_cache_key` определяет ключ, по которому кэш будет идентифицировать запросы. Если update index всегда разный и не должен учитываться, то его можно исключить из ключа кэша.
- `location` регулярное выражение сопоставляется с URI запросов.

Если ваш конфигурационный файл не работает, убедитесь, что:
- Вы создали директорию для кэша и nginx имеет разрешения на её использование.
- В `proxy_pass` указан корректный URL бекэнд сервера.
- `proxy_cache_path` находится вне `location` блока, а в контексте `http`.

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

Для диагностики проблем с кешированием полезно использовать логирование. Можно добавить `$upstream_cache_status` в `log_format` для отслеживания статуса кеша запросов.
https://nginx.org/ru/docs/http/ngx_http_proxy_modu... 
proxy_cache_valid [код ...] время;

Время обязательный параметр, а код ответа можно пропустить.
Если указано только время кэширования, то кэшируются только ответы 200, 301 и 302.

proxy_cache_valid 200;
Тут 200 это не код ответа, а время 200 секунд.
Похожие вопросы