NGINX Caching 설정 가이드
이 포스트에서는 NGINX Reverse Proxy 서버에 caching(캐싱) 설정을 구성하는 방법에 대해서 다룹니다. 이 설정을 통해서 프록시 될 서버의 콘텐츠를 캐싱하여 NGINX 프록시 서버에 저장하고, 동일한 요청을 해당 캐시 데이터를 통해 응답하여 클라이언트로의 콘텐츠 전송 속도를 높일 수 있습니다.
이 포스트에서 다루는 NGINX caching 설정은 NGINX OSS와 NGINX Plus 모두 적용 가능합니다.
목차
1. Caching(캐싱)이란?
2. NGINX Caching 설정
3. NGINX Caching 추가 설정
4. 결론
1. Caching(캐싱)이란?

캐싱은 이전에 요청된 리소스를 임시로 저장하는 기술로, 이후에 동일한 요청이 들어오면 저장된 캐시를 사용하여 응답을 제공합니다. 이를 통해 프록시 될 서버의 부하를 줄이고, 데이터를 다시 가져오는 데 필요한 시간을 줄여 클라이언트에게 더 빠른 응답을 제공할 수 있습니다.
2. NGINX Caching 설정
1. http 블록 내부에 캐시 파일이 저장될 경로와 공유 메모리 영역을 설정합니다.
# /etc/nginx/nginx.conf
...
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
proxy_cache_path /data/nginx/cache keys_zone=nginxcache:10m;
...
include /etc/nginx/conf.d/*.conf;
}
proxy_cache_path 지시문에 따라 캐시 파일은 /data/nginx/cache 경로에 저장되며, keys_zone 설정으로 캐시를 저장할 공유 메모리 영역의 이름을 nginxcache로 정의하고, 해당 영역의 크기를 10MB로 설정합니다.
2. 캐싱을 적용할 리버스 프록시 서버에 관련 설정을 적용합니다.
# /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/default_access.log main;
error_log /var/log/nginx/default_error.log;
proxy_cache nginxcache;
location / {
proxy_pass http://localhost:90;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-CACHE-STATUS $upstream_cache_status;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- proxy_cache : keys_zone에 정의된 공유 메모리 영역 이름 지정
- proxy_cache_valid : 캐싱을 적용할 응답 코드와 캐시의 유효 기간 설정
- 유효 기간만 설정 시 200, 301, 302 응답만 캐싱됩니다.
- 응답 코드를 any로 설정 시 모든 응답이 캐싱됩니다.
- add_header (선택) : 캐싱 상태를 확인할 수 있는 응답 헤더(X-CACHE-STATUS)를 추가합니다.
3. NGINX 서버를 재시작하고, 캐싱 적용을 확인합니다.
$ sudo systemctl restart nginx
$ curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.25.4
Date: Tue, 18 Jun 2024 08:26:07 GMT
Content-Type: text/html
Content-Length: 615
Connection: keep-alive
Last-Modified: Tue, 18 Jun 2024 05:51:17 GMT
ETag: "66712055-267"
X-CACHE-STATUS: MISS
Accept-Ranges: bytes
$ curl -i localhost
HTTP/1.1 200 OK
Server: nginx/1.25.4
Date: Tue, 18 Jun 2024 08:26:54 GMT
Content-Type: text/html
Content-Length: 615
Connection: keep-alive
Last-Modified: Tue, 18 Jun 2024 05:51:17 GMT
ETag: "66712055-267"
X-CACHE-STATUS: HIT
Accept-Ranges: bytes
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...
첫번째 요청은 캐시 데이터가 존재하지 않아 X-CACHE-STATUS 헤더의 값이 MISS였으나, 두번째 요청은 첫 요청을 통해 생성된 캐시 데이터를 통해 응답하여 헤더의 값이 HIT인것을 확인할 수 있습니다.
4. 생성된 캐시 데이터를 확인합니다.
$ ls /data/nginx/cache/
8e47e49a7a4175f257325117c0e34a54
$ cat /data/nginx/cache/8e47e49a7a4175f257325117c0e34a54
�DqfU qf�Dqf \�tkT"66712055-267"
KEY: http://localhost:90/
HTTP/1.1 200 OK
Server: nginx/1.25.4
Date: Tue, 18 Jun 2024 08:26:07 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 18 Jun 2024 05:51:17 GMT
Connection: close
ETag: "66712055-267"
Accept-Ranges: bytes
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
proxy_cache_path 를 통해 지정된 경로(/data/nginx/cache/)에 캐시 파일이 생성된 것을 확인할 수 있습니다.
3. NGINX Caching 추가 설정
추가적인 설정을 통해 캐시를 더욱 효율적으로 관리할 수 있습니다.
proxy_cache_path
캐시와 관련된 추가 설정을 적용할 수 있습니다.
1. levels : 캐시 파일이 저장될 디렉토리의 계층 구조를 설정합니다. 3단계까지 설정이 가능하며, 각 단계별로 1 혹은 2의 값을 설정 가능합니다.
proxy_cache_path /data/nginx/cache keys_zone=nginxcache:10m levels=2:1:1;
위와 같이 설정하면 다음과 같이 캐시 파일이 생성됩니다.
$ ls /data/nginx/cache/54/a/4/
8e47e49a7a4175f257325117c0e34a54
2. inactive : 지정된 시간동안 캐시 파일이 엑세스되지 않으면 캐시 파일의 유효 여부와 관계 없이 해당 캐시 파일을 삭제합니다. 기본값은 10분입니다.
proxy_cache_path /data/nginx/cache keys_zone=nginxcache:10m inactive=10m;
3. max_size / min_free : 캐시 파일의 용량을 관리합니다.
- max_size : 캐시 파일 디렉토리의 최대 크기를 설정합니다. 캐시 파일이 지정된 크기를 초과하면, 오래된 캐시 파일을 삭제합니다.
- min_free : 최소 여유 공간을 설정합니다. 여유 공간이 부족해지면 오래된 캐시 파일을 삭제합니다.
proxy_cache_path /data/nginx/cache keys_zone=nginxcache:10m max_size=10g;
proxy_cache_path /data/nginx/cache keys_zone=nginxcache:10m min_free=3g;
proxy_cache_methods
캐싱 설정을 적용할 http 요청 메서드를 정의합니다. GET, HEAD 메서드는 설정과 관계 없이 항상 적용됩니다.
server {
...
proxy_cache nginxcache;
location / {
proxy_pass http://localhost:90;
proxy_cache_valid 1m;
proxy_cache_methods GET HEAD POST;
add_header X-CACHE-STATUS $upstream_cache_status;
}
}
위와 같은 형식으로 작성할 수 있습니다.
proxy_cache_key
캐시된 항목을 식별할 캐시 키를 정의합니다. 기본값은 $scheme$proxy_host$request_uri입니다.
해당 설정을 통해 특정 헤더를 포함해서 캐시 키를 생성하는 등 지정된 설정을 기반으로 캐시를 분리할 수 있습니다.
server {
...
proxy_cache nginxcache;
location / {
proxy_pass http://localhost:90;
proxy_cache_valid 1m;
proxy_cache_key $scheme$proxy_host$request_uri;
add_header X-CACHE-STATUS $upstream_cache_status;
}
}
4. 결론
이번 포스트에서는 NGINX reverse proxy 서버에 caching(캐싱) 설정을 구성하는 방법에 대해 알아봤습니다. 캐싱 설정을 통해 reverse proxy 서버의 성능을 향상시키고, 클라이언트에게 더 빠른 응답을 제공할 수 있습니다. 또한 추가 설정을 통해 캐시를 최적화하고, 서버 리소스를 효율적으로 사용할 수 있습니다.
NGINX caching 의 보다 자세한 내용은 NGINX 콘텐츠 캐싱을 참고하세요.
댓글을 달려면 로그인해야 합니다.