У меня странная проблема с прокси-сервером 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;
И кеширование теперь работает нормально на обоих вышестоящих серверах.