Новое Распределяем каналы MAX по категориям и территориям. Читать новость

🌐 Nginx может кэшировать ответы отдельно для каждого варианта сжатия и не смешивать форматы



👁 При проксировании API и раздаче статики кэш часто усложняется из-за gzip, Brotli и заголовков клиента. Если сервер отдаёт разные представления одного ресурса, кэш должен учитывать соответствующие признаки запроса, иначе можно получить некорректный ответ для клиента.

📝 Учитываем поддержку сжатия при выборе кэшируемого представления:

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



http {
map $http_accept_encoding $encoding_variant {
"~*br" br;
"~*gzip" gzip;
default identity;
}

proxy_cache_path /var/cache/nginx
keys_zone=assets:20m
levels=1:2
inactive=1h;

server {
location /assets/ {
proxy_cache assets;
proxy_cache_key "$scheme$proxy_host$request_uri|$encoding_variant";
proxy_pass http://static_backend;
}
}
}

📝 Запрещаем кэшировать персонализированные ответы:

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



map $http_authorization $skip_auth_cache {
"" 0;
default 1;
}

map $http_cookie $skip_cookie_cache {
"" 0;
default 1;
}

server {
location /api/ {
proxy_cache api_cache;
proxy_cache_bypass $skip_auth_cache $skip_cookie_cache;
proxy_no_cache $skip_auth_cache $skip_cookie_cache;

proxy_pass http://api_backend;
}
}

📝 Проверяем, откуда пришёл ответ:

Добавьте диагностический заголовок, чтобы видеть, был ли ответ получен из кэша или передан от upstream. Это упрощает поиск ошибок при настройке ключей и правил обхода кэша.



location /assets/ {
proxy_cache assets;
add_header X-Cache-Status $upstream_cache_status always;

proxy_pass http://static_backend;
}

❗️ Важно: первый пример корректен только если upstream действительно выдаёт представления, соответствующие выбранному варианту кодирования. Простая проверка подстроки br или gzip не является полноценным разбором Accept-Encoding и может неверно обработать q=0. Если сжатие выполняет сам Nginx, обычно безопаснее использовать штатные механизмы сжатия и корректный Vary: Accept-Encoding. Для персонализированных ответов также учитывайте cookies, авторизацию и заголовки управления кэшем от upstream.

tags: #nginx #производительность #разработка

🧭 @recura_tech
Просмотры: 89
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти