Webサーバー サイトの管理
nginx Webサーバー
proxy_cache キャッシュのファイル名
nginx Webサーバー
proxy_cache キャッシュのファイル名
nginx の proxy_cache を次のように設定しています。
proxy_cache_path /var/cache/nginx/arakan60 levels=2:2 keys_zone=arakan60:30m inactive=2h max_size=768m;
proxy_cache_key "$scheme$proxy_host$request_uri";
この場合、どのようなキャッシュファイル名が生成されるでしょうか?
以下に、プロキシキャッシュのパスとディレクトリ構造についての調査結果をまとめた。
スポンサー リンク
目 次
1. サーバー構成とキャッシュの設定状況
フロントエンドのリバースプロキシ サーバーで proxy_cache が使われ、バックエンドのWebサーバーで fastcgi_cache が使われる設定となっている。
リバースプロキシサーバーの nginx.conf での proxy_cache 設定。
# proxy cache on arakan60.com
proxy_cache_path /var/cache/nginx/arakan60 levels=2:2 keys_zone=arakan60:30m inactive=2h max_size=768m;
proxy_cache_key "$scheme$proxy_host$request_uri";
※:キャッシュキーの設定に「$proxy_host」を設定している。
2. 実際のキャッシュファイル名を確認してみる
キャッシュディレクトリ内の実際のファイルやディレクトリ構造を観察してみる。
sudo find /var/cache/nginx/arakan60 -type f | head -n 10
全てが、/var/cache/nginx/arakan60/ab/cd/ のようなディレクトリ構造になっており、キャッシュファイル名は、ハッシュ値を基に設定されている。
①.保存場所とディレクトリ構造の設定
proxy_cache_path /var/cache/nginx/arakan60 levels=2:2 keys_zone=arakan60:30m inactive=2h max_size=768m;
キャッシュファイルは「proxy_cache_path」で指定された「/var/cache/nginx/arakan60」に保存される。
「levels=2:2」は、キャッシュファイルを保存するためのディレクトリ構造を示しており、
/var/cache/nginx/arakan60/ab/cd/ のように
1階層目のディレクトリが2文字、2階層目も2文字のディレクトリ指定になっている。
/var/cache/nginx/arakan60/ab/cd/ のように
1階層目のディレクトリが2文字、2階層目も2文字のディレクトリ指定になっている。
ハッシュ値の末尾2桁目から2文字が1階層目のディレクトリ名に、ハッシュ値の末尾4桁目からの2桁が2階層目のディレクトリ名に設定されている。
②.キャッシュキーの設定
proxy_cache_key "$scheme$proxy_host$request_uri";
$scheme: http または https
$proxy_host: proxy_pass ディレクティブで指定された上流サーバーのホスト部分
$request_uri: クエリパラメータを含むリクエストURI(例: /?p=15602)
$proxy_host: proxy_pass ディレクティブで指定された上流サーバーのホスト部分
$request_uri: クエリパラメータを含むリクエストURI(例: /?p=15602)
「$proxy_host」について。
1. 直接的なホスト指定の場合
例:proxy_pass http://example.com;
この場合、$proxy_host には example.com が設定される。
2. 変数を使用して指定した場合
例:set $upstream_host example.com;
proxy_pass http://$upstream_host;
この場合、$proxy_host には example.com が設定される。
3. IP アドレスを直接指定した場合
例:proxy_pass http://192.168.1.1:8080;
この場合、$proxy_host には 192.168.1.1:8080 が設定される。
リバースプロキシサーバーでの proxy_pass の設定。
location / {
proxy_pass http://192.168.11.106;
}
次のリクエストがあった場合:
https://arakan60.com/?p=15602
https://arakan60.com/?p=15602
キャッシュキーは次のようになる:
https192.168.11.106/?p=15602
https192.168.11.106/?p=15602
キャッシュファイル名は、このキャッシュキーのハッシュ値を基にして決定される。
3. 実際に生成されているキャッシュキーの確認方法
キャッシュされたリクエストのキーを「ログに出力する設定を一時的に追加」することで、正確なキーが確認できる。
/etc/nginx/nginx.conf の変更。
log_format cache_debug '$scheme$proxy_host$request_uri';
access_log /var/log/nginx/cache_debug.log cache_debug;
※:「log_format」は「proxy_cache_key」の設定内容と同じにする事!。
この設定を追加して Nginx を再起動後、対象ページにアクセスし、生成されたキャッシュキーをログから確認する。
tail -f /var/log/nginx/cache_debug.log
キャッシュキーが次のようになっていることが確認できる。
https192.168.11.106/?p=15602
https192.168.11.106/?p=15602
4. キャッシュキーのハッシュ値生成
次のキャッシュキーを、hash関数を使って MD5 で hash値を生成してみる。
httpGETarakan60.com/?p=15602
httpGETarakan60.com/?p=15602
python -c 'import hashlib; print(hashlib.md5("https192.168.11.106/?p=15602".encode("utf-8")).hexdigest())'
生成されたハッシュ値。
48c1e70d4affe2c1d0dd1cde44370e6b
得られたハッシュ値でディレクトリ構造とファイル名を組み立ててみると、次のようになる。
5. 該当のキャッシュファイルを表示してみる
find コマンドでの表示。
sudo find /var/cache/nginx/arakan60 -name 48c1e70d4affe2c1d0dd1cde44370e6b 2> /dev/null
ls コマンドでディレクトリを表示。
sudo ls -la /var/cache/nginx/arakan60/6b/0e/
6. キャッシュファイルのパスを計算するための Pythonスクリプト
正確なキャッシュファイルパスを計算するために、Pythonスクリプトでキャッシュキーを定義し、MD5 ハッシュ値を末尾から分割してディレクトリ構造を作成するプログラムコード。(名前を hash-value_01.py とした。)
# MD5ハッシュの生成
import hashlib
# キャッシュキーを定義
cache_key = "https192.168.11.106/?p=15602"
# MD5ハッシュ値を計算
hash_value = hashlib.md5(cache_key.encode('utf-8')).hexdigest()
# level1: ハッシュ値の末尾から2文字を取得[start:stop]
level1 = hash_value[-2:]
# level2: ハッシュ値の末尾の4桁目から2文字を取得[start:stop]
level2 = hash_value[-4:-2]
# 結果を出力
print("MD5ハッシュ値:", hash_value)
print("level1 (2桁):", level1)
print("level2 (2桁):", level2)
# キャッシュファイルパスの組み立て
cache_path = f"/var/cache/nginx/arakan60/{level1}/{level2}/{hash_value}"
print("キャッシュファイルパス:", cache_path)
Pythonスクリプトの実行。
python hash-value_01.py
MD5ハッシュ値: 48c1e70d4affe2c1d0dd1cde44370e6b
level1 (2桁): 6b
level2 (2桁): 0e
キャッシュファイルパス: /var/cache/nginx/arakan60/6b/0e/48c1e70d4affe2c1d0dd1cde44370e6b
level1 (2桁): 6b
level2 (2桁): 0e
キャッシュファイルパス: /var/cache/nginx/arakan60/6b/0e/48c1e70d4affe2c1d0dd1cde44370e6b
以上。
(2024.12.03)
(2024.12.03)
スポンサー リンク