Я использую 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. Хотя она уже включена по умолчанию (я думаю), мне нравится смотреть в эту папку, чтобы узнать, сохраняются ли запросы на статический контент.