nginxのキャッシュを個別に削除する Pythonスクリプト

Webサーバー サイトの管理
nginx
キャッシュを個別に削除する Pythonスクリプト
 
nginx における「FastCGI キャッシュ」と「proxy キャッシュ」のファイル名を特定し、キャッシュファイルへのパスを計算する Pythonスクリプトを作った。
これを利用して、キャッシュファイルへのパスでキャッシュを個別に削除する Pythonスクリプトに仕上げた。
 
実行結果:python del_cache_f7.py page_id=904
 
以下、nginxのキャッシュを個別に削除する Pythonスクリプト を掲載。
 
 

 

スポンサー リンク

 

 
 
 
 
nginx でキャッシュを個別に削除するには、nginxモジュールの「ngx_cache_purge」を使用する方法が一般的に紹介されている。
 
しかし、キャッシュファイルのパスを計算するための Pythonスクリプトが用意出来たので、これを拡張して、Pythonスクリプト で削除することとした。
 
 
 
 
1. nginx でのサーバー構成とキャッシュ設定
 
サーバーは全て Raspberry Pi 4 Model B で構成。
フロントエンドに Reverse Proxy Server を立て、バックエンドにWebサーバーを配置する構成にしている
フロントエンドのリバースプロキシ サーバーで proxy_cache を設定し、バックエンドのWebサーバーでは fastcgi_cache が使われる設定となっている。
 
バックエンドのWebサーバーでは「WordPress」が稼働している。
 
※特異点:Reverse Proxy で、SSL証明書を集中管理しているため、リバースプロキシとWebサーバー間は、【HTTP】通信になっている。
 
リバースプロキシサーバーの nginx.conf での proxy_cache 設定。
①.http ディレクティブ。
    proxy_cache_path /var/cache/nginx/arakan60 levels=1:2 keys_zone=arakan60:10m max_size=1g inactive=7d use_temp_path=off;
    proxy_cache_path /var/cache/nginx/arakoki70 levels=1:2 keys_zone=arakoki70:10m max_size=1g inactive=7d use_temp_path=off;
    proxy_cache_path /var/cache/nginx/treksite levels=1:2 keys_zone=treksite:10m max_size=1g inactive=7d use_temp_path=off;
②.各ドメイン別の location ディレクティブ。
    location / {
	# ユーザーエージェントが指定の文字列を含む場合にアクセスを拒否
	include conf.d/sotodasi/agent-block.conf;

        proxy_pass http://192.168.11.107;

	proxy_cache arakoki70;
	proxy_cache_key "$scheme$request_method$host$request_uri";
	proxy_cache_valid 200 301 302 7d;
	proxy_cache_valid 404 1h;
	proxy_ignore_headers Cache-Control Expires;
	add_header X-Proxy-Cache $upstream_cache_status;
            
	# キャッシュをバイパスする条件
	set $skip_cache 0;
	if ($http_cookie ~* "wordpress_logged_in|comment_author") {
	    set $skip_cache 1;
	}
	proxy_cache_bypass $skip_cache;
	proxy_no_cache $skip_cache;
 
バックエンドの、ドメイン別Web サーバーの http ディレクティブでの fastcgi_cache 設定。
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=farakoki70:10m max_size=500m inactive=7d use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
 
 
 
2. WordPress の パーマリンク構造
 
WordPress でのパーマリンクの設定は、基本の
https://arakoki70.com/?p=123
となっている。
 
従って、サイトにアクセスするURLは次のようになる。
 
記事の場合の例:
https://arakoki70.com/?p=8686
 
固定ページの場合の例:
https://arakoki70.com/?page_id=904
 
 
 
3. Pythonスクリプトの使い方
 
削除対象となるキャッシュは、WordPressの記事ページや固定ページになるので、これらのページIDを Pythonスクリプトに「引数」として渡す方式とした。
 
Pythonスクリプトの名前:del_cache_f7.py とした場合。
 
記事の場合の引数指定例:
python del_cache_f7.py p=8686
 
固定ページの場合の引数指定例:
python del_cache_f7.py page_id=904
 
 
 
4. fastcgi_cache を削除するPythonスクリプト
 
fastcgi のキャッシュキーは次のようになる:【HTTP】通信にしているため、
httpGETarakoki70.com/?p=8686
 
バックエンドでの fastcgi_cache を削除するPythonスクリプト。
import argparse
import hashlib
import os
import subprocess

def calculate_md5(cache_key):
    """渡されたキャッシュキーのMD5ハッシュを計算"""
    return hashlib.md5(cache_key.encode('utf-8')).hexdigest()

def build_cache_path(hash_value):
    """キャッシュパスを組み立て"""
    level1 = hash_value[-1]  # ハッシュの末尾1文字
    level2 = hash_value[-3:-1]  # ハッシュの末尾3桁目から2文字
    return f"/var/cache/nginx/farakoki70/{level1}/{level2}/{hash_value}"

def delete_cache(cache_path):
    """指定されたキャッシュパスを削除"""
    try:
        print(f"Deleting cache path: {cache_path}")
        subprocess.run(["sudo", "rm", "-r", cache_path], check=True)
        print("Cache deleted successfully.")
    except subprocess.CalledProcessError as e:
        print(f"Error: Failed to delete cache. {e}")
        exit(1)

def main():
    # コマンドライン引数を解析
    parser = argparse.ArgumentParser(description="Delete cache based on parameter.")
    parser.add_argument("param", help="The parameter in the format 'key=value'", type=str)
    args = parser.parse_args()

    # パラメーターのチェック
    if "=" not in args.param:
        print("Error: Parameter must be in the format 'key=value'")
        exit(1)

    # キャッシュキーを生成
    base_url = "httpGETarakoki70.com/"
    cache_key = f"{base_url}?{args.param}"
    print(f"Cache key: {cache_key}")

    # MD5ハッシュ値を計算
    hash_value = calculate_md5(cache_key)
    print(f"MD5 hash: {hash_value}")

    # キャッシュパスを構築
    cache_path = build_cache_path(hash_value)
    print(f"Cache path: {cache_path}")

    # キャッシュを削除
    delete_cache(cache_path)

if __name__ == "__main__":
    main()
 
実行結果:python del_cache_f7.py page_id=904
実行結果:python del_cache_f7.py page_id=904
 
 
 
5. proxy_cache を削除するPythonスクリプト
 
proxy のキャッシュキーは次のようになる:【HTTPS】通信
httpsGETarakoki70.com/?p=8686
 
フロントエンドでの proxy_cache を削除するPythonスクリプト。
import argparse
import hashlib
import os
import subprocess

def calculate_md5(cache_key):
    """渡されたキャッシュキーのMD5ハッシュを計算"""
    return hashlib.md5(cache_key.encode('utf-8')).hexdigest()

def build_cache_path(hash_value):
    """キャッシュパスを組み立て"""
    level1 = hash_value[-1]  # ハッシュの末尾1文字
    level2 = hash_value[-3:-1]  # ハッシュの末尾3桁目から2文字
    return f"/var/cache/nginx/arakoki70/{level1}/{level2}/{hash_value}"

def delete_cache(cache_path):
    """指定されたキャッシュパスを削除"""
    try:
        print(f"Deleting cache path: {cache_path}")
        subprocess.run(["sudo", "rm", "-r", cache_path], check=True)
        print("Cache deleted successfully.")
    except subprocess.CalledProcessError as e:
        print(f"Error: Failed to delete cache. {e}")
        exit(1)

def main():
    # コマンドライン引数を解析
    parser = argparse.ArgumentParser(description="Delete cache based on parameter.")
    parser.add_argument("param", help="The parameter in the format 'key=value'", type=str)
    args = parser.parse_args()

    # パラメーターのチェック
    if "=" not in args.param:
        print("Error: Parameter must be in the format 'key=value'")
        exit(1)

    # キャッシュキーを生成
    base_url = "httpsGETarakoki70.com/"
    cache_key = f"{base_url}?{args.param}"
    print(f"Cache key: {cache_key}")

    # MD5ハッシュ値を計算
    hash_value = calculate_md5(cache_key)
    print(f"MD5 hash: {hash_value}")

    # キャッシュパスを構築
    cache_path = build_cache_path(hash_value)
    print(f"Cache path: {cache_path}")

    # キャッシュを削除
    delete_cache(cache_path)

if __name__ == "__main__":
    main()
 
実行結果:python del-cache_p7.py p=8686
実行結果:python del-cache_p7.py p=8686
 
 
以上。
(2024.12.23)
 

 

スポンサー リンク

 

             

 

 

 

コメントを残す

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

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