web-dev-qa-db-ja.com

X-Accel-Redirectヘッダーを含むアップストリーム応答をキャッシュするようにnginxを作成できますか?

アプリケーションサーバーの前でリバースプロキシとしてnginxを使用しています。アプリケーションはX-Accel-Redirectヘッダーで応答し、nginxに提供する静的ファイルを通知します。私ができるようにしたいのは、nginxにこれらのアップストリーム応答の一部をキャッシュさせて、アプリサーバーにアクセスすることなく正しいファイルを提供できるようにすることです。

残念ながら、これは機能しません。nginxは、X-Accel-Redirectヘッダーを使用して応答をキャッシュすることを拒否しているようです。 X-Accel-Redirectを使用せず、アプリサーバーにファイル自体を返してもらうと、キャッシュは完全に機能します。ただし、アプリサーバーがファイルをディスクから読み取り、nginxに送信する必要があるため、これはあまり効率的ではありません。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の処理にジャンプし、通常のキャッシュロジックをスキップすることですが、これを確認しておくと便利です。

5
D. Evans

私が使用していたWebアプリが、設定したくないCookieを設定しようとしていたため、nginxが自分のものをキャッシュしたくないという同様の状況がありました。

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

ソースコードをハッキングするために誰かを雇いたくないのであれば、nginxをそれ自体のプロキシにしてからWebアプリのプロキシにすることを試みるかもしれません。

真ん中にあるものでは、X-Accel-Redirectヘッダーを無視するため、キャッシュが再び有効になります。

前面にあるものでは、キャッシュは行いませんが、X-Accel-Redirect応答をキャッシュする中央にあるものにリクエストをプロキシします。

このようなことがうまくいかない理由はわかりません! :-)

2
cnst