반응형
https://kubby72.tistory.com/entry/nginx-cache-key설정
에서 nginx에서 cache file을 저장하는 logic을 설명하였다.
이번에 간단한 script를 통해 해당 파일을 찾고 이를 삭제, 변경하는 방법에 대해 설명하고자 합니다.
- get-cache-md5 스크립트 작성해 해당 파일을 쉽게 찾을 수 있는 shell script 생성
#!/bin/bash
cache_key=$1
md5=$(echo -n "$cache_key" | md5sum | cut -f1 -d' ')
p1=$(echo "${md5:0-1:1}")
p2=$(echo "${md5:0-3:2}")
file_path="/var/cache/nginx/$p1/$p2/$md5"
# echo "$file_path"
ls -l $file_path
$ get-cache-md5 my/1.jpg
-rw-------. 1 nginx nginx 83333 Jun 14 16:22 /var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36
- 혹은 find를 통해 cache directory에서 해당 cache key를 보유하고 있는 파일을 찾을 수도 있다
$ cat search
#!/bin/bash
find /var/cache/nginx -type f | xargs grep -EI -a "^KEY: $1"
$ search my/1.jpg
/var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36:KEY: my/1.jpg
- 해당파일을 삭제하고 싶을 때 purge라는 script를 만들어 해당 파일을 삭제
$ cat purge
#!/bin/bash
files=$(search $1 | cut -f 1 -d ":")
if [ -n "$files" ]; then
for i in $files; do
[ -f $i ] || continue
key=$(head -n 2 $i | grep -EI -a "^KEY:")
rm $i
echo "$i ($key) file is deleted "
done
else
echo "Contents $1 is not cached."
exit 3
fi
$ purge my/1.jpg
/var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36 (KEY: my/1.jpg) file is deleted
- 저장된 파일의 TTL을 확인하고 싶을 때
$ cat get_ttl
#!/bin/bash
files=$(search $1 | cut -f 1 -d ":")
if [ -n "$files" ]; then
for i in $files; do
[ -f $i ] || continue
key=$(head -n 2 $i | grep -EI -a "^KEY:")
expires=$(head -n 1 $i | od -dL | sed -n '2p' | awk '{print $2}')
ttl=$(expr $expires - $(date '+ %s'))
if [ $ttl -gt 0 ]; then
echo "$i ($key, TTL: $ttl) EXPIRE at $(date '+%Y/%b/%d %T KST' --date=@$expires)"
else
echo "$i ($key, TTL: $ttl) already EXPIED $(date '+%Y/%b/%d %T KST' --date=@$expires)"
fi
done
else
echo "Contents $1 is not cached."
exit 3
fi
$ get_ttl my/1.jpg
/var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36 (KEY: my/1.jpg, TTL: -1279) already EXPIED 2023/Jun/14 17:35:19 KST
위 script는 cache file header를 읽었을 때 나오는 첫줄에 cache file에 대한 meta data 정보를 long integers 10진수 형식으로 읽어 드리면 아래와 같이 나온다. 이중 두번 째 줄 맨 끝 1686731719 이 unixtime으로 해당 cache file의 expired date값을 저장하고 있기 때문에, 이를 바탕으로 TTL을 계산할 수 있다.
$ head -n 1 /var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36
▒{▒dǝ\▒{▒d▒▒▒▒_▒"2d-14305-585367ee1aac0"
$ head -n 1 /var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36 | od -dL
0000000 5 0 0 0 31687 25737 0 0
5 1686731719
0000020 0 0 0 0 0 0 0 0
0 0
0000040 50963 23709 0 0 31684 25737 0 0
1553843987 1686731716
0000060 49880 50371 0 351 640 8728 25650 12589
98797720126603992 3543598648293589632
0000100 13108 13616 13613 13624 13875 25911 12645 24929
3834873550988129076 7016944005979518515
0000120 12387 34 0 0 0 0 0 0
2240611 0
0000140 0 0 0 0 0 0 0 0
0 0
*
0000520 10
10
0000521
- 해당 파일을 삭제하지 않고 TTL을 0으로 변경하고 싶을 때
$ cat set_ttl
#!/bin/bash
files=$(search $1 | cut -f 1 -d ":")
now_date=`date -d "now" "+%s"`
hex_date=`echo "obase=16; $now_date"|bc`
hex_low=${hex_date,,}
hex1=$(echo "${hex_low:0-2:2}")
hex2=$(echo "${hex_low:0-4:2}")
hex3=$(echo "${hex_low:0-6:2}")
hex4=$(echo "${hex_low:0-8:2}")
new_hex=$hex1$hex2$hex3$hex4
if [ -n "$files" ]; then
for i in $files; do
[ -f $i ] || continue
key=$(head -n 2 $i | grep -EI -a "^KEY:")
expires=$(head -n 1 $i | od -dL | sed -n '2p' | awk '{print $2}')
ttl=$(expr $expires - $(date '+ %s'))
if [ $ttl -gt 0 ]; then
get_hex=`head -n 1 $i | xxd -p | tr -d '\n'| cut -c 17-24`
xxd -p $i| tr -d '\n'| sed "s/$get_hex/$new_hex/" > /tmp/$get_hex
xxd -p -r /tmp/$get_hex $i
echo "$i ($key ttl $ttl) set to ttl=0 EXPIRED $(date '+%Y/%b/%d %T KST' --date=@$now_date)"
else
echo "$i ($key ttl $ttl) already EXPIRED $(date '+%Y/%b/%d %T KST' --date=@$expires)"
fi
done
else
echo "Contents $1 is not cached."
exit 3
fi
$ set_ttl my/1.jpg
/var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36 (KEY: my/1.jpg ttl 31535997) set to ttl=0 EXPIRED 2023/Jun/14 17:35:19 KST
위와 같이 xxd를 통해 expire date부분의 hex editor로 수정하면 해당 cache file의 TTL변경이 가능하다.
'nginx' 카테고리의 다른 글
nginx upstream module - part1 (load balancing) (0) | 2023.06.15 |
---|---|
nginx cache status 확인 (0) | 2023.06.15 |
nginx cache-control 및 priority (0) | 2023.06.14 |
nginx cache key설정 (0) | 2023.06.11 |
nginx (web server, proxy, api gateway...) (0) | 2023.06.11 |