👁 При проксировании 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