Server/Nginx

nginx cache 설정하기

web data 2024. 11. 13. 09:23

nginx  cache 설정하여 api 응답 속도 개선 및 api 서버 처리 부담 줄이기

 

캐시키는 매모리에 저장하고, 데이터는 hdd 에 저장된다.
캐시파일 저장디렉토리는 "/var/cache/nginx" 를 사용할 것이므로 미리 만들어 놓는다.

 

1. /etc/nginx/nginx.conf 파일에 proxy_cache_path 항목 추가

# cache 
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=sketch_cache:10m max_size=1g inactive=60m use_temp_path=off

 

* /var/cache/nginx : 캐시파일을 저장할 경로를 설정한다.

 

* levels=1:2 : 위에서 설정한 저장 경로 아래에 2단계 디렉터리 계층 구조를 설정한다.  
단일 디렉터리에 많은 수의 파일이 있으면 파일 액세스 속도가 느려질 수 있으므로 대부분의 배포에 2단계 디렉터리 계층 구조를 사용하는 것이 좋다.

 

* keys_zone=sketch_cache:10m : 캐시이름을 설정한다. (여기선 : sketch_cache)
캐시 키 및 사용 타이머와 같은 메타데이터를 저장하기 위한 공유 메모리 영역을 설정한다.  
NGINX에서 디스크로 이동할 필요 없이 요청이 HIT인지 MISS인지 빠르게 결정할 수 있어 검사 속도가 크게 빨라진다.  
1MB 영역은 약 8,000개의 키에 대한 데이터를 저장할 수 있으므로 예제에서 구성된 10MB 영역은 약 80,000개의 키에 대한 데이터를 저장할 수 있다.

 

* max_size=1g (선택사항) : 캐시 크기가 제한에 도달하면 캐시 관리자라는 프로세스가 캐시 크기를 제한 아래로 되돌리기 위해 가장 최근에 사용된 파일을 제거한다.  
값을 지정하지 않으면 캐시가 사용 가능한 모든 디스크 공간을 사용하도록 확장된다.

 

* inactive=60m : 항목이 액세스되지 않고 캐시에 남아 있을 수 있는 기간을 지정한다. 기본값은 10분(10m)

 

* use_temp_path=off : nginx 1.7.1 이상부터 해당되는 옵션이라고 한다.  
파일 시스템 간에 불필요한 데이터 복사를 방지하려면 이 매개변수를 off로 설정하는 것이 좋다.

 

 

2. /etc/nginx/sites-available/{호스팅설정파일} 에 위 설정 적용

	location ^~ /api2 {
			proxy_pass http://localhost:8888;
			..
			..
			proxy_cache sketch_cache;
			proxy_cache_methods GET HEAD;
			proxy_cache_valid 200 302 10m;
			proxy_cache_valid 404     1m;
			proxy_cache_lock_timeout 5s;
			add_header X-CACHE-STATUS $upstream_cache_status;
			..
			..	
	}

 

- proxy_cache_lock_timeout : 여러 클라이언트가 캐시에 최신이아닌 파일을 요청하는 경우,  첫번째 요청만 Origin 서버를 통해 통과할 수 있고 나머지는 대기 후(5초) 캐시에서 파일을 가져온다.
- proxy_cache_methods : 클라이언트 요청 메서드 목록을 지정해준다.  “GET” 과 “HEAD” 메서드는 default로 지정되어있지만 명시적으로 지정해 주는 것이 좋다.
- proxy_cache_valid : 응답 코드에 대해 캐싱 시간을 설정해준다. (위에선 200,302 와 404를 다르게 설정)
- add_header : 사용자 정의 헤더를 추가한다.   X-Cache-Status는 캐시 상태를 표시한다.

 

3. nginx 테스트 후 서비스 재시작 

nginx -t
service nginx restart

 

X-Cache-Status의 값 정의

 

값의미

HIT 응답이 캐시에서 제공되었습니다.
MISS 응답이 처음으로 캐시되었습니다.
BYPASS 캐시가 통과되었고, 응답이 직접 백엔드 서버에서 가져온 것입니다.
EXPIRED 캐시된 응답이 만료되었고, 새로운 응답이 백엔드 서버에서 가져와 캐시되었습니다.
STALE 만료된 캐시된 응답이 제공되었습니다.
UPDATING 다른 요청이 이미 캐시 업데이트를 시작했으며, 현재 요청은 캐시된 응답을 받았습니다.
REVALIDATED 캐시된 응답이 백엔드 서버에서 재검증되었습니다.

 

 

참고: https://sweet-rain-kim.tistory.com/m/159