New We are sorting MAX channels into categories and territories. Read the news

🌐 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
Views: 200
Open in MAX Report an inaccuracy

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content — check the address before entering passwords or payment details.

Redirecting in 10 s

Go