@Stilar

Исключение из кеширования nginx директорий?

есть поддомен для отдачи api (json или xml )
большенство данных - статичны, отдаются без авторизации , и их устаревание не критично, поэтому все закешировано средствами nginx
но есть запросы (директории), где должны отдавать данные без кеша (или с минимальным кешем - 1m)

конфиг:
proxy_cache_path /mnt/cache_nginx/json levels=1:2 keys_zone=cache_api:100m inactive=72h max_size=1G;

server {
        listen 443 ssl;
        location ~ (\.xml|\.json)$ {
              proxy_cache             cache_api;
              proxy_cache_valid       502 503 1m;
              proxy_cache_valid       404 1h;
              proxy_cache_valid       any 3d;
              proxy_cache_key         $request_uri;

              proxy_intercept_errors off;
              proxy_read_timeout 30s;
              proxy_send_timeout 30s;
        }

        # зона запросов, где кеш отключен
        location /user/ {
            proxy_cache off;
        }
}


По моей логике урлы в зону /user/* должны отдаваться без кеширования. Но это не так. Что я делаю неверно?
  • Вопрос задан
  • 342 просмотра
Решения вопроса 1
dvershinin
@dvershinin
High performance web server engineer
Сначала nginx проверяет location с префиксом, потом находит location c regex так как он более специфичен. Соответственно все директивы будут применяться из `location ~ (\.xml|\.json)$ {`.

Выход в том, чтобы сделать /user/ более специфичным и указать его в начале (порядок важен):

proxy_cache_path /mnt/cache_nginx/json levels=1:2 keys_zone=cache_api:100m inactive=72h max_size=1G;

server {
        listen 443 ssl;

        # зона запросов, где кеш отключен
        location ~ /user/.*(\.xml|\.json)$ {
              proxy_cache             off;

              proxy_intercept_errors off;
              proxy_read_timeout 30s;
              proxy_send_timeout 30s;
        }

        location ~ (\.xml|\.json)$ {
              proxy_cache             cache_api;
              proxy_cache_valid       502 503 1m;
              proxy_cache_valid       404 1h;
              proxy_cache_valid       any 3d;
              proxy_cache_key         $request_uri;

              proxy_intercept_errors off;
              proxy_read_timeout 30s;
              proxy_send_timeout 30s;
        }


}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы