nginx 설정에서 아래와 같이 X-CACHE-STATUS해더를 추가해 주면 브라우저에서 cache status 확인이 가능하다.
server {
listen 80;
server_name my;
location / {
proxy_cache my_zone;
proxy_cache_key $host$uri$is_args$args;
proxy_pass http://org;
add_header X-CACHE-STATUS $upstream_cache_status;
}
}
위와 같이 설정 후 curl로 확인하면 아래와 같이 X-CACHE-STATUS: MISS 해더가 추가된 것을 확인할 수 있다.
$ curl my/1.json -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Thu, 15 Jun 2023 00:21:44 GMT
Content-Type: application/json
Content-Length: 6
Connection: keep-alive
Last-Modified: Sun, 07 May 2023 14:17:16 GMT
ETag: "6457b2ec-6"
Expires: Thu, 15 Jun 2023 00:25:04 GMT
Cache-Control: max-age=200
X-CACHE-STATUS: MISS
Accept-Ranges: bytes
이를 한 번 더 요청하면 아래와 같이 저장된 Cache file이 HIT되어 원본으로 요청하지 않고, proxy에서 해당 콘텐츠를 전달했음을 알 수 있다.
curl my/1.json -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Thu, 15 Jun 2023 00:22:14 GMT
Content-Type: application/json
Content-Length: 6
Connection: keep-alive
Last-Modified: Sun, 07 May 2023 14:17:16 GMT
ETag: "6457b2ec-6"
Expires: Thu, 15 Jun 2023 00:25:04 GMT
Cache-Control: max-age=200
X-CACHE-STATUS: HIT
Accept-Ranges: bytes
앞서 만든 Cache TTL을 확인하는 script를 이용해 cache의 TTL을 확인해보면 아래와 같이 78초가 남아 있는 것을 확인할 수 있다. https://kubby72.tistory.com/entry/cli로-nginx-cache-file찾기
$ get_ttl my/1.json
/var/cache/nginx/5/69/1f0419833724d7ff705cd5204bcd1695 (KEY: my/1.json, TTL: 143) EXPIRE at 2023/Jun/15 09:25:04 KST
해당 TTL이 만료되길를 기다렸다가, 다시 curl로 요청을 하면 아래와 같이 X-CACHE-STATUS가 REVALIDATED로 변경된 것을 확인할 수 있다
(콘텐츠의 TTL확인 > TTL expired > 원본에 요청 > 원본에서 가져온 데이타와 Cache데이타 비교 > 동일한 Contetns로 기존 Cache 데이타 전달 이라는 과정을 거친다.)
$ get_ttl my/1.json
/var/cache/nginx/5/69/1f0419833724d7ff705cd5204bcd1695 (KEY: my/1.json, TTL: -2) already EXPIED 2023/Jun/15 09:25:04 KST
$ curl my/1.json -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Thu, 15 Jun 2023 00:25:12 GMT
Content-Type: application/json
Content-Length: 6
Connection: keep-alive
Last-Modified: Sun, 07 May 2023 14:17:16 GMT
ETag: "6457b2ec-6"
Expires: Thu, 15 Jun 2023 00:25:04 GMT
Cache-Control: max-age=200
X-CACHE-STATUS: REVALIDATED
Accept-Ranges: bytes
이 때 만약 원본에 변화가 생겼다면 어떻게 될까?
위 nginx proxy가 바라보고 있는 기존 원본 설정은 아래와 같고, /usr/share/nginx/html 이 해당 웹서버의 Root로 설정되어 있다.
server {
listen 80;
server_name org;
access_log /var/log/nginx/org.access.log my_log;
root /usr/share/nginx/html;
location / {
expires 200s;
}
}
해당 디렉토리로 이동하면 테스트용파일을 몇개 생성해 놓은게 있는 이중 예제와 같이 1.json파일을 수정해 기존값 aaaaa 를 bbbbb로 수정해 보자
$ ls /usr/share/nginx/html
1.jpg 1.mp4 2.jpg 2.mp4 3.json 4.mp4 5.mp4 aaa
1.json 2.jpeg 2.json 3.jpg 3.mp4 50x.html 6.mp4 index.html
$ cat 1.json
aaaaa
$ cat 1.json
bbbbb
get_ttl로 cache TTL시간이 지났는지를 확인한 뒤 다시 curl로 요청하면 이번에는 REVALIDATED가 아닌 EXPIRED가 나온다. (콘텐츠의 TTL확인 > TTL expired > 원본에 요청 > 원본에서 가져온 데이타와 Cache데이타 비교 > Contents가 변경된 것을 확인하고 원본으로 부터 가져온 데이타를 전송)
$ get_ttl my/1.json
/var/cache/nginx/5/69/1f0419833724d7ff705cd5204bcd1695 (KEY: my/1.json, TTL: -64) already EXPIED 2023/Jun/15 09:28:32 KST
$ curl my/1.json -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Thu, 15 Jun 2023 00:29:50 GMT
Content-Type: application/json
Content-Length: 6
Connection: keep-alive
Last-Modified: Thu, 15 Jun 2023 00:26:34 GMT
ETag: "648a5aba-6"
Expires: Thu, 15 Jun 2023 00:33:10 GMT
Cache-Control: max-age=200
X-CACHE-STATUS: EXPIRED
Accept-Ranges: bytes
이처럼 Cache Status는 MISS, HIT, REVALIDAED, EXPIRED외에도 여려가지 상태를 가질 수 있고, 각 상태에 대한 설명은 다음과 같습니다.
https://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_cache_status
Module ngx_http_upstream_module
Module ngx_http_upstream_module The ngx_http_upstream_module module is used to define groups of servers that can be referenced by the proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, and grpc_pass directives. Example Configuration upstream
nginx.org
- MISS – Cache 된 데이타가 없을 때 오리진서버에서 가져왔음을 의미하고, 이 응답은 cache될 수 있습니다.
- BYPASS – proxy_cache_bypass directive 혹은 Client의 요청해더에 의해 오리진서버로 부터 데이타를 가져와 전달하고, 이 응답은 다시 Cache될 수 있습니다. .
- EXPIRED – 캐시된 콘텐츠의 TTL이 만료되어 오리진 서버에서 새로운 콘텐츠를 가져와 전달했음을 의미합니다.
- STALE – 오리진 서버가 올바르게 응답하지 않아 콘텐츠가 오래되었으며, nginx proxy에서 proxy_cache_use_stale이 구성된 경우에 반환됩니다.
- UPDATING – 이전 요청에 대한 응답으로 항목이 업데이트되는 동안 오래된 컨텐츠를 전달했음을 의미하고, nginx proxy에서 proxy_cache_use_stale updating 설정이 되었을 경우 반환됩니다.
- REVALIDATED – proxy_cache_revalidate 지시문이 활성화되어 현재 캐시된 콘텐츠가 여전히 유효한지 원본으로 부터 확인한 후에 반환된 응답 (원본에 요청 시는 If-Modified-Since or If-None-Match 해더를 이용해 선택적요청을 진행합니다.)
- HIT – 캐시에 저장된 콘텐츠의 TTL이 만료되지않을 때 전달되는 응답
'nginx' 카테고리의 다른 글
Consistant hash (0) | 2023.06.16 |
---|---|
nginx upstream module - part1 (load balancing) (0) | 2023.06.15 |
nginx cache-control 및 priority (0) | 2023.06.14 |
cli로 nginx cache file 찾기, 삭제 및 TTL변경 (0) | 2023.06.14 |
nginx cache key설정 (0) | 2023.06.11 |