nginx

cli로 nginx cache file 찾기, 삭제 및 TTL변경

꺼비72 2023. 6. 14. 17:45
반응형

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