Назад | Перейти на главную страницу

Проблема с кешем nginx с несколькими восходящими потоками

У меня странная проблема с прокси-сервером nginx proxy + cache setup для двух идентичных восходящих потоков. У меня есть два идентичных вышестоящих сервера в конфигурации активный / резервный. Кеш работает нормально для одного из серверов, но как только я переключаю активную / резервную конфигурацию и перезагружаю nginx, я не получаю никаких попаданий в кеш, а журнал ошибок заполняется следующими:

2017/06/15 10:14:21 [warn] 19048#19048: *2562 an upstream response is buffered to a temporary file /mnt/cache/temp/0000000504 while reading upstream, client: <CLIENT IP>, server: , request: "GET /secure/assets/file.ts?id=456 HTTP/1.1", upstream: "http://<UPSTREAM IP>:80/assets/file.ts", host: "server-host"

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

Теперь соответствующие части конфига:

http {

    tcp_nodelay on;

    proxy_cache_path /mnt/cache/cache keys_zone=one:20m inactive=24h loader_threshold=300 loader_files=200 max_size=180g;
    proxy_cache_key $uri;

    upstream master-cdn {
        server cdn1 backup max_fails=10 fail_timeout=60s;
        server cdn0 max_fails=10 fail_timeout=60s;
        keepalive 10;
    }

    proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_403 http_404;

        server {

                listen 80;
                if_modified_since off;
                add_header          Cache-Control no-cache;
                add_header          Pragma "no-cache";
                root                /var/www/html;

                location /assets {
                        sendfile on;
                        tcp_nopush on;
                        internal;
                        proxy_pass http://master-cdn;
                        proxy_cache             one;
                        proxy_cache_min_uses    1;
                        proxy_cache_lock        on;
                        proxy_cache_valid       200 24h;
                        proxy_temp_path /mnt/cache/temp;
                }
}

Примечание: клиенты попадают в /secure url, который отправляется на сервер приложений, который затем будет использовать X-Accel-Redirect заголовок, чтобы указать nginx для обслуживания статического файла из внутреннего расположения.

Вся установка работает нормально, но только с cdn0 вышестоящий сервер. Как только я сдвину backup заявление к cdn0 server и перезагрузите nginx, я получаю буферизацию восходящего потока и промахи кеша.

Есть ли у кого-нибудь идеи, как отладить это дальше?

Заранее спасибо.

Мне удалось это решить. С помощью журнала отладки я обнаружил, что один из вышестоящих серверов ошибочно (содержимое статично и не истекает), отправляя Cache-Control и Expires заголовки с ответом, которые затем испортят кеш nginx (к сожалению, вышестоящие серверы не находятся под моим контролем).

Я добавил эти два утверждения в прокси-расположение:

proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;

И кеширование теперь работает нормально на обоих вышестоящих серверах.