私のチームはnginxを使用していますキャッシュ問題は、上流のアプリケーションが、上書きしたいヘッダーを送信することです。キャッシュされたオブジェクト内キャッシュ内のキー(またはキーの一部)を検索すると、キャッシュされたオブジェクトに保存されたヘッダーを見ることができます。たとえば、
cd /var/cache/nginx/test
grep -inr part_of_key *
Binary file 6/29/7bcd0cd0aadfd536cdd7183cd8b77296 matches
そうすると
strings 6/29/7bcd0cd0aadfd536cdd7183cd8b77296
# content with keys, cached headers and so on
nginxの設定は(簡略化)
# part of server1
location / {
proxy_pass http://upstream;
proxy_cache zone1;
}
ディレクティブはわかっているのでproxy_hide_header
、キャッシュされたオブジェクトのヘッダーを削除 (および置換) しようとしましたが、うまくいきません。プロセスは次のようになります。
- 上流が応答を送信する
- nginxはレスポンスを読み取ります
- 応答はキャッシュ内のファイルに保存されます
- レスポンスをクライアントに送信するために、ヘッダーの削除などの操作がレスポンスに対して実行されます。
したがって、これがキャッシュに保存される前に、応答のヘッダーに影響を与える方法はないようです。
私が開発できる回避策の 1 つは、中間に別の nginx サーバーを配置してヘッダーを変更し、それを のキャッシュに保存することですserver1
。
例
# part of server1
location /
proxy_pass http://upstream-modify-headers;
proxy_set_header Host modify.headers;
proxy_cache zone1;
}
# the upstream
upstream upstream-modify-headers {
server 127.0.0.1:80;
}
#the host that modifies the headers
server {
listen *:80;
server_name modify.headers;
add_header "cache-control" "public, max-age=10, must-revalidate";
...
location / {
proxy_pass http://upstream;
proxy_hide_header cache-control; #one example header that should be modified in the cache
}
...
allow 127.0.0.1; #only locally available
}
これは機能しますが、追加の nginx ホストが必要です。代わりに、アップストリームに追加のヘッダーを追加せずに、同じ nginx サーバー内のキャッシュされたオブジェクトのヘッダーをオーバーライドすることは可能ですか?
答え1
指示を探しているようですproxy_hide_header
。
答え2
回避策として、ヘッダーに日付スタンプを追加してみてください。追加すると、どのヘッダーがキャッシュからのもので、どのヘッダーが新しいかを区別できるようになります(アクセスログで他のタイムスタンプと比較することにより)。