nginx cache 설정하기
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