Webサーバー サイトの管理
nginx
キャッシュを個別に削除する Pythonスクリプト
nginx
キャッシュを個別に削除する Pythonスクリプト
nginx における「FastCGI キャッシュ」と「proxy キャッシュ」のファイル名を特定し、キャッシュファイルへのパスを計算する Pythonスクリプトを作った。
これを利用して、キャッシュファイルへのパスでキャッシュを個別に削除する Pythonスクリプトに仕上げた。
これを利用して、キャッシュファイルへのパスでキャッシュを個別に削除する Pythonスクリプトに仕上げた。
以下、nginxのキャッシュを個別に削除する Pythonスクリプト を掲載。
スポンサー リンク
目 次
nginx でキャッシュを個別に削除するには、nginxモジュールの「ngx_cache_purge」を使用する方法が一般的に紹介されている。
しかし、キャッシュファイルのパスを計算するための Pythonスクリプトが用意出来たので、これを拡張して、Pythonスクリプト で削除することとした。
1. nginx でのサーバー構成とキャッシュ設定
フロントエンドのリバースプロキシ サーバーで proxy_cache を設定し、バックエンドのWebサーバーでは fastcgi_cache が使われる設定となっている。
バックエンドのWebサーバーでは「WordPress」が稼働している。
※特異点:Reverse Proxy で、SSL証明書を集中管理しているため、リバースプロキシとWebサーバー間は、【HTTP】通信になっている。
リバースプロキシサーバーの nginx.conf での proxy_cache 設定。
①.http ディレクティブ。
①.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
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()
5. proxy_cache を削除するPythonスクリプト
proxy のキャッシュキーは次のようになる:【HTTPS】通信
httpsGETarakoki70.com/?p=8686
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()
以上。
(2024.12.23)
(2024.12.23)
スポンサー リンク