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

Можно ли заставить nginx кэшировать ответы восходящего потока, содержащие заголовок X-Accel-Redirect?

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

К сожалению, это не работает: похоже, что nginx отказывается кэшировать любой ответ с заголовком X-Accel-Redirect. Если я не использую X-Accel-Redirect и заставляю сервер приложений возвращать сам файл, кеширование работает отлично. Однако это не очень эффективно, так как затем сервер приложений должен прочитать файл с диска и отправить его в nginx, который затем записывает файл обратно на диск (в свой кеш) и отправляет его клиенту.

Вот урезанная версия моей конфигурации nginx:

proxy_cache_path /tmp/nginx-cache keys_zone=testzone:10m;

server {
    location / {
        proxy_cache testzone;
        proxy_pass http://localhost:8000/;
    }

    location /static-files/ {
        internal;
        alias /var/static-files/;
    }
}

Кто-нибудь знает, возможно ли то, что я пытаюсь сделать? Я подозреваю, что когда nginx обнаруживает заголовок X-Accel-Redirect, он немедленно переходит к обработке предоставленного URI и пропускает обычную логику кеширования, но было бы неплохо, если бы это подтвердилось.

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

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers

Если вы не хотите нанять кого-то для взлома исходного кода, вы можете попробовать сделать так, чтобы nginx был прокси для самого себя, а затем для веб-приложения.

С одним в середине вы игнорируете X-Accel-Redirect заголовок, и, следовательно, кеш должен снова включиться.

С тем, что находится спереди, вы не кешируете, а запрашиваете прокси-сервер к тому, который кеширует посередине X-Accel-Redirect ответы.

Я не вижу причин, почему что-то подобное не должно работать! :-)

Предлагаю вам переписать свой сервер и блок местоположения:

server {
    location / {
        proxy_cache testzone;
        proxy_pass http://localhost:8000;
    }

    location ~* \.(ico|js|jpg|png|gif|jpeg|mp3|wav|swf|mov|doc|pdf|flv|css)$ {
       expires max;
       proxy_cache testzone;
       proxy_pass http://localhost:8000;
    }
}

также посмотрите proxy_temp_path http://wiki.nginx.org/HttpProxyModule#proxy_temp_path. Хотя она уже включена по умолчанию (я думаю), мне нравится смотреть в эту папку, чтобы узнать, сохраняются ли запросы на статический контент.