nginx proxy キャッシュのファイル名

Webサーバー サイトの管理
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. サーバー構成とキャッシュの設定状況
 
フロントエンドに 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";
※:キャッシュキーの設定に「$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文字のディレクトリ指定になっている。
 
実際のディレクトリ構造。
実際のディレクトリ構造
ハッシュ値の末尾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」について。
 

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
 
キャッシュキーは次のようになる:
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
 
tail -f /var/log/nginx/cache_debug.log
 
キャッシュキーが次のようになっていることが確認できる。
https192.168.11.106/?p=15602
 
 
 
4. キャッシュキーのハッシュ値生成
 
次のキャッシュキーを、hash関数を使って MD5 で hash値を生成してみる。
httpGETarakan60.com/?p=15602
python -c 'import hashlib; print(hashlib.md5("https192.168.11.106/?p=15602".encode("utf-8")).hexdigest())'
 
キャッシュキーを、hash関数を使って MD5 で hash値を生成してみる
 
生成されたハッシュ値。
48c1e70d4affe2c1d0dd1cde44370e6b
 
得られたハッシュ値でディレクトリ構造とファイル名を組み立ててみると、次のようになる。
得られたハッシュ値でディレクトリ構造とファイル名を組み立ててみる
 
 
 
5. 該当のキャッシュファイルを表示してみる
 
find コマンドでの表示。
sudo find /var/cache/nginx/arakan60 -name 48c1e70d4affe2c1d0dd1cde44370e6b 2> /dev/null
 
<a href="https://arakoki70.com/wp-content/uploads/2024/12/proxy-cache_0421.png"><img class="alignnone size-full wp-image-8561" src="https://arakoki70.com/wp-content/uploads/2024/12/proxy-cache_0421.png" alt="find コマンドでの表示" width="800" height="136" /></a>
 
ls コマンドでディレクトリを表示。
sudo ls -la /var/cache/nginx/arakan60/6b/0e/
 
ls コマンドでディレクトリを表示
 
 
6. キャッシュファイルのパスを計算するための Pythonスクリプト
 
正確なキャッシュファイルパスを計算するために、Pythonスクリプトでキャッシュキーを定義し、MD5 ハッシュ値を末尾から分割してディレクトリ構造を作成するプログラムコード。(名前を hash-value_01.py とした。)
キャッシュファイルのパスを計算するための Pythonスクリプト
# 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
 
Pythonスクリプトの実行結果。
Pythonスクリプトの実行結果
 
MD5ハッシュ値: 48c1e70d4affe2c1d0dd1cde44370e6b
level1 (2桁): 6b
level2 (2桁): 0e
キャッシュファイルパス: /var/cache/nginx/arakan60/6b/0e/48c1e70d4affe2c1d0dd1cde44370e6b
 
 
以上。
(2024.12.03)
 

 

スポンサー リンク

 

             

 

 

 

コメントを残す

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

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