前几天用 php 写了一个 nginx 无 ngx_cache_purge 模块时的刷新方法。之所以当时使用 php 而非 shell,是因为用 md5sum 得到的 MD5SUM 值不对,百思不得其解时只能先用已经验证对的用了。这个过程中怀疑过 md5 算法是否有不同标准,但是总觉得这种怀疑毫无理由。所以今天重新整理思路,最终验证出我的疏漏,因此最终形成了如下直接使用 shell 即可完成的清除脚本,不再依赖于 php 环境。
/var/tmp/list.purge是URI列表,即URL去除域名后剩余的部分,比如:
https://blog.51cto.com/logo.gif
应该去掉 https://blog.51cto.com,最终变成如下样式:
/logo.gif
每行一个,前后不留空格字符。整个文件不允许有空行。

脚本全文如下:
#!/bin/sh
DIR_CACHE=$(awk '/^proxy_cache_path/{print $2}' /usr/local/nginx/conf/vhosts/cache.conf)
cd ${DIR_CACHE}
awk '{ ("echo -en "$0"|md5sum -")|getline v; split(v, N, " "); line=N[1]; line1=substr(line,32,1);line2=substr(line,30,2);printf("rm -f %s/%s/%s\t#%s\n", line1,line2,line,$0)}' /var/tmp/list.purge | sh

附送一个Python版的 getkey.py:
#!/usr/bin/python
try:
    from hashlib import md5
except:
    from md5 import md5

import sys

m = md5()
for line in sys.stdin.readlines():
        lt = line.strip()
        if not lt:
                break
        m.update(lt)
        ck=m.hexdigest()
        print ('rm -f %s/%s/%s\t#%s') % (ck[-1:], ck[-3:-1], ck, lt)

运行时的 shell 脚本就是:
#!/bin/sh
DIR_CACHE=$(awk '/^proxy_cache_path/{print $2}' /usr/local/nginx/conf/vhosts/cache.conf)
cd ${DIR_CACHE}
cat /var/tmp/list.purge | python /var/tmp/getkey.py | sh