Webサーバー サイトの管理
nginx Webサーバー
fastcgi_cache キャッシュのファイル名とパス
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. サーバー構成とキャッシュの設定状況
フロントエンドのリバースプロキシ サーバーで 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文字のディレクトリ指定になっている。
/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)
$request_method: GET、POST など
$host: ホスト名(例: arakan60.com)
$request_uri: クエリパラメータを含むリクエストURI(例: /?p=15602)
コマンドで fastcgi_cache_key の設定内容を確認してみる。
grep fastcgi_cache_key /etc/nginx/* -r
次のリクエストがあった場合:
https://arakan60.com/?p=15602
https://arakan60.com/?p=15602
キャッシュキーは次のようになる:
httpsGETarakan60.com/?p=15602
httpsGETarakan60.com/?p=15602
キャッシュファイル名は、このキャッシュキーのハッシュ値を基にして決定される。
※:ただし、リバースプロキシとWebサーバー間は、
【HTTP】通信にしているため、
httpGETarakan60.com/?p=15602
になる。
【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
httpGETarakan60.com/?p=15602
4. キャッシュキーのハッシュ値生成
次のキャッシュキーを、hash関数を使って MD5 で hash値を生成してみる。
httpGETarakan60.com/?p=15602
httpGETarakan60.com/?p=15602
python -c 'import hashlib; print(hashlib.md5("httpGETarakan60.com/?p=15602".encode("utf-8")).hexdigest())'
生成されたハッシュ値。
d00e494262fd619825bf94939392cf7c
得られたハッシュ値でディレクトリ構造とファイル名を組み立ててみると、次のようになる。
おそらく NGINX のデフォルトのキャッシュ保存ロジック(MD5 ハッシュの最初からではなく、最後尾からディレクトリ分割)が適用されているようだ。
このため、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 とした。)
# 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
MD5ハッシュ値: d00e494262fd619825bf94939392cf7c
level1: c
level2 (2桁): f7
キャッシュファイルパス: /var/cache/nginx/farakan60/c/f7/d00e494262fd619825bf94939392cf7c
level1: c
level2 (2桁): f7
キャッシュファイルパス: /var/cache/nginx/farakan60/c/f7/d00e494262fd619825bf94939392cf7c
以上。
(2024.12.01)
(2024.12.01)
スポンサー リンク