nginx

nginx cache key설정

꺼비72 2023. 6. 11. 20:09
반응형

nginx 를 proxy로 설정할 때 아래는 nginx에서 캐시를 설정하는 예제입니다.

 

http {
  proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_zone:10m inactive=60m;
  
  server {
    listen       80;
    server_name  my;

    location / {
      proxy_cache my_zone;   # 위에서 지정한 keys_zone 이름을 지정합니다.
      proxy_cache_key $host$uri$is_args$args; # cache key설정
      proxy_pass http://org; # 요청을 전달할 백엔드 서버의 주소를 지정합니다.
    }
  }
}

 

  • proxy_cache_path는 캐시 파일이 저장될 디렉토리 경로를 지정합니다. 이 설정에서는 /var/cache/nginx 디렉토리를 사용하도록 지정되어 있습니다.
  • levels=1:2는 캐시 파일의 하위 디렉토리를 생성하는 데 사용되는 수준 수를 지정합니다. 이 설정에서는 1단계의 하위 디렉토리를 생성하고 그 하위 디렉토리에 2단계의 하위 디렉토리를 생성하도록 지정되어 있습니다.
  • keys_zone=my_zone:10m은 캐시 키를 저장하는 데 사용되는 공간을 지정합니다. 이 설정에서는 my_zone라는 이름의 공간을 10MB 크기로 생성하도록 지정되어 있습니다.
  • inactive=60m은 캐시 파일이 유효하지 않은 것으로 간주되기 전에 얼마나 오래 저장될 수 있는지를 지정합니다. 이 설정에서는 60분 동안 캐시 파일이 유효하도록 지정되어 있습니다.

proxy_cache_key 지시어는 캐싱 용도로 키를 정의하는 데 사용됩니다. 이 경우 키는 다음 변수로 구성됩니다:

  • $host: 요청에서의 호스트 이름
  • $uri: 요청에서의 URI
  • $is_args: 요청에 쿼리 인자가 있는 경우 빈 문자열 또는 "?"
  • $args: 요청에서의 쿼리 문자열

이제 해당 서비스도메인으로 curl을 날려보면

# curl my/1.jpg -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Wed, 14 Jun 2023 07:04:33 GMT
Content-Type: image/jpeg
Content-Length: 82693
Connection: keep-alive
Last-Modified: Fri, 29 Mar 2019 07:19:47 GMT
ETag: "2d-14305-585367ee1aac0"
Cache-Control: max-age=31536000
Accept-Ranges: bytes

 

cache파일의 저장위치는 /var/cache/nginx에서 아래와 같이 cache파일이 저정되어 있음을 확인할 수 있다.

 

# ls -alR /var/cache/nginx/
/var/cache/nginx/:
total 0
drwxr-xr-x. 9 nginx root  116 Jun 14 16:22 .
drwxr-xr-x. 8 root  root   81 Apr 29 12:48 ..
drwx------. 3 nginx nginx  16 Jun 14 16:22 6

/var/cache/nginx/6:
total 0
drwx------. 3 nginx nginx  16 Jun 14 16:22 .
drwxr-xr-x. 9 nginx root  116 Jun 14 16:22 ..
drwx------. 2 nginx nginx  46 Jun 14 16:22 d3

/var/cache/nginx/6/d3:
total 84
drwx------. 2 nginx nginx    46 Jun 14 16:22 .
drwx------. 3 nginx nginx    16 Jun 14 16:22 ..
-rw-------. 1 nginx nginx 83333 Jun 14 16:22 399dc83e97062c14f36ee6bbb2187d36

해당 파일을 읽어보면 첫줄은 cache medata데이타이 바이너리값으로 저장되어 있고, 둘째 라인부터 cache key가 $host$uri$is_args$args 로 my/1.jpg가 key값으로 저장된 것을 확인할 수 있다.

# head /var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36
▒jfǝ\▒j▒d▒▒▒▒_▒"2d-14305-585367ee1aac0"
KEY: my/1.jpg
HTTP/1.1 200 OK
Date: Wed, 14 Jun 2023 06:57:41 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 29 Mar 2019 07:19:47 GMT
ETag: "2d-14305-585367ee1aac0"
Accept-Ranges: bytes
Content-Length: 82693
Cache-Control: max-age=31536000


캐쉬파일의 이름은 cache key에 md5를 적용한 결과로 파일이름 앞 디렉토리는 level 설정 수준에 따라 지정되어 cache key만 알면 해당파일이 어떻게 저장될지를 알 수 있고 이를 바탕으로 nginx는 cache file을 찾아간다.

# echo -n my/1.jpg | md5sum
399dc83e97062c14f36ee6bbb2187d36  -

여기시 level값 1:2로 설정해서 md5마지막값 1자리값인 6이 첫번째 level이고, 
그 앞 2자리 d3이 두번째 level값으로 저장되는 디렉토리는 다음과 같음

/var/cache/nginx/6/d3/399dc83e97062c14f36ee6bbb2187d36