nginx FastCGI キャッシュのファイル名とパス

Webサーバー サイトの管理
nginx Webサーバー
fastcgi_cache キャッシュのファイル名とパス
 
nginx の fastcgi_cache を次のように設定しています。
fastcgi_cache_path /var/cache/nginx/farakan60 levels=1:2 keys_zone=farakan60:30m max_size=512M inactive=600m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
この場合、どのようなキャッシュファイル名が生成されるでしょうか?
 
以下に、fastcgiキャッシュのパスとディレクトリ構造についての調査結果をまとめた。
 
 

 

スポンサー リンク

 

 
 
 
 
 
1. サーバー構成とキャッシュの設定状況
 
フロントエンドに Reverse Proxy Server を立て、バックエンドにWebサーバーを配置する構成にしている。
フロントエンドに Reverse Proxy Server を立て、バックエンドにWebサーバーを配置する構成にしている
 
フロントエンドのリバースプロキシ サーバーで 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";
バックエンドのWebサーバーの nginx.conf での fastcgi_cache に関する設定。
# fastcgi cache on arakan60.com
fastcgi_cache_path /var/cache/nginx/farakan60 levels=1:2 keys_zone=farakan60:30m max_size=512M inactive=600m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
※特異点:Reverse Proxy で、SSL証明書を集中管理しているため、リバースプロキシとWebサーバー間は、【HTTP】通信になっている。
 
 
 
2. 実際のキャッシュファイル名を確認してみる
 
キャッシュディレクトリ内の実際のファイルやディレクトリ構造を観察してみる。
sudo find /var/cache/nginx/farakan60 -type f | head -n 10
 
キャッシュディレクトリ内の実際のファイルやディレクトリ構造を観察してみる
 
全てが、/var/cache/nginx/farakan60/a/bc/ のようなディレクトリ構造になっており、キャッシュファイル名は、ハッシュ値を基に設定されている。
 
①.保存場所とディレクトリ構造の設定
fastcgi_cache_path /var/cache/nginx/farakan60 levels=1:2 keys_zone=farakan60:30m max_size=512M inactive=600m;
キャッシュファイルは「 fastcgi_cache_path 」で指定された「/var/cache/nginx/farakan60」に保存される。
 
「levels=1:2」は、キャッシュファイルを保存するためのディレクトリ構造を示しており、
 /var/cache/nginx/farakan60/a/bc/ のように
1階層目のディレクトリが1文字、2階層目が2文字のディレクトリ指定になっている。
 
実際のディレクトリ構造。
実際のディレクトリ構造
ハッシュ値の末尾1文字が1階層目のディレクトリ名に、ハッシュ値の末尾3桁目から2桁が2階層目のディレクトリ名に設定されている。
 
 
②.キャッシュキーの設定
fastcgi_cache_key "$scheme$request_method$host$request_uri";
$scheme: http または https
$request_method: GET、POST など
$host: ホスト名(例: arakan60.com)
$request_uri: クエリパラメータを含むリクエストURI(例: /?p=15602)
 
コマンドで fastcgi_cache_key の設定内容を確認してみる。
grep fastcgi_cache_key /etc/nginx/* -r
 
コマンドで fastcgi_cache_key の設定内容を確認してみる
 
次のリクエストがあった場合:
https://arakan60.com/?p=15602
 
キャッシュキーは次のようになる:
httpsGETarakan60.com/?p=15602
 
キャッシュファイル名は、このキャッシュキーのハッシュ値を基にして決定される。
 
※:ただし、リバースプロキシとWebサーバー間は、
【HTTP】通信にしているため、
httpGETarakan60.com/?p=15602
になる。
 
これに気付くまでに、「多大な時間」を浪費してしまった。
 
 
 
3. 実際に生成されているキャッシュキーの確認方法
 
キャッシュされたリクエストのキーを「ログに出力する設定を一時的に追加」することで、正確なキーが確認できる。
 
/etc/nginx/nginx.conf の変更。
log_format cache_debug '$scheme$request_method$host$request_uri';
access_log /var/log/nginx/cache_debug.log cache_debug;
※:log_format」は「fastcgi_cache_key」の設定内容と同じにする事!。
 
この設定を追加して Nginx を再起動後、対象ページにアクセスし、生成されたキャッシュキーをログから確認する。
tail -f /var/log/nginx/cache_debug.log
 
対象ページにアクセスし、生成されたキャッシュキーをログから確認する
 
キャッシュキーが次のようになっていることが確認できる。
httpGETarakan60.com/?p=15602
 
 
 
4. キャッシュキーのハッシュ値生成
 
次のキャッシュキーを、hash関数を使って MD5 で hash値を生成してみる。
httpGETarakan60.com/?p=15602
python -c 'import hashlib; print(hashlib.md5("httpGETarakan60.com/?p=15602".encode("utf-8")).hexdigest())'
 
キャッシュキーを MD5 でハッシュ化すると、次のようなハッシュ値が得られる
 
生成されたハッシュ値。
d00e494262fd619825bf94939392cf7c
 
得られたハッシュ値でディレクトリ構造とファイル名を組み立ててみると、次のようになる。
 
得られたハッシュ値でディレクトリ構造とファイル名を組み立ててみると、次のようになる。
 
おそらく NGINX のデフォルトのキャッシュ保存ロジック(MD5 ハッシュの最初からではなく、最後尾からディレクトリ分割)が適用されているようだ。
このため、MD5 ハッシュ値を直接利用して探索するだけでは一致しないことがある。
 
 
 
5. 該当のキャッシュファイルを表示してみる
 
find コマンドでの表示。
sudo find /var/cache/nginx/farakan60 -name d00e494262fd619825bf94939392cf7c 2> /dev/null
 
該当のキャッシュファイルを表示してみる
 
ls コマンドでディレクトリを表示。
sudo ls -la /var/cache/nginx/farakan60/c/f7/
 
該当のキャッシュファイルを表示してみる
 
 
6. キャッシュファイルのパスを計算するための Pythonスクリプト
 
正確なキャッシュファイルパスを計算するために、Pythonスクリプトでキャッシュキーを定義し、MD5 ハッシュ値を末尾から分割してディレクトリ構造を作成するプログラムコード。(名前を hash-value_03.py とした。)
 
キャッシュファイルのパスを計算するための Pythonスクリプト
# MD5ハッシュの生成
import hashlib

# キャッシュキーを定義
cache_key = "httpGETarakan60.com/?p=15602"

# MD5ハッシュ値を計算
hash_value = hashlib.md5(cache_key.encode('utf-8')).hexdigest()

# level1: ハッシュ値の末尾1文字
level1 = hash_value[-1]

# level2: ハッシュ値の末尾3桁目から2桁を取得
level2 = hash_value[-3:-1]

# 結果を出力
print("MD5ハッシュ値:", hash_value)
print("level1:", level1)
print("level2 (2桁):", level2)

# キャッシュファイルパスの組み立て
cache_path = f"/var/cache/nginx/farakan60/{level1}/{level2}/{hash_value}"
print("キャッシュファイルパス:", cache_path)
 
Pythonスクリプトの実行。
python hash-value_03.py
 
Pythonスクリプトの実行結果。
Pythonスクリプトの実行結果
 
MD5ハッシュ値: d00e494262fd619825bf94939392cf7c
level1: c
level2 (2桁): f7
キャッシュファイルパス: /var/cache/nginx/farakan60/c/f7/d00e494262fd619825bf94939392cf7c
 
 
以上。
(2024.12.01)
 

 

スポンサー リンク

 

             

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください