Nginx 캐시 서버 구축 및 운영 시 필요한 다양한 설정 방법
루트 경로 /
에 대해서만 캐시를 완전히 비활성화하고, 다른 경로에 대해서는 기본 캐시 설정을 유지하려면, Nginx의 location
블록을 정확히 지정하여 설정할 수 있습니다.
다음은 이러한 설정을 구현하는 방법의 설정 예시입니다.
http {
server {
listen 80;
server_name example.com;
# 정확히 루트 경로에 대한 설정
location = / {
root /usr/share/nginx/html;
index index.html index.htm;
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
}
# 다른 모든 경로에 대한 설정
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
location = / { ... }
location = /
는 정확히/
경로에 대해 일치하는 요청을 처리합니다. 이는 루트 URL(/
)에 대한 요청만 처리합니다.root /usr/share/nginx/html;
는 정적 파일의 루트 디렉토리를 지정합니다.index index.html index.htm;
는 기본 인덱스 파일을 지정합니다.expires -1;
는 캐시를 비활성화합니다. 이는 브라우저가 해당 파일을 캐시하지 않도록 설정합니다.add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
는 HTTP 헤더를 추가하여 캐시를 완전히 비활성화합니다.
location / { ... }
location /
는 다른 모든 경로에 대해 일치하는 요청을 처리합니다.root /usr/share/nginx/html;
와index index.html index.htm;
는 정적 파일의 기본 설정을 지정합니다.
이 설정을 통해, 정확히 루트 경로(/
)에 대한 요청은 캐시되지 않고 항상 최신 콘텐츠를 제공받을 수 있습니다. 다른 경로에 대한 요청은 기본 설정에 따라 캐시될 수 있습니다. 이를 통해 홈 페이지와 같이 항상 최신 상태를 유지해야 하는 페이지에 대해 캐시를 비활성화할 수 있으며, 나머지 페이지는 캐시를 사용하여 성능을 향상시킬 수 있습니다.
또다른 설정으로 정확히 루트 경로(/
)와 robots.txt
파일에 대한 캐시 제어를 각각 설정한 예시입니다.
server {
listen 80;
server_name example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
# 정확히 루트 경로에 대한 캐시 비활성화 설정
location = / {
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
}
# robots.txt 파일에 대한 설정
location = /robots.txt {
allow all;
log_not_found off;
}
}
}
location / { ... }
- 이 블록은
/
경로와 그 하위 경로에 대한 기본 설정을 정의합니다. root /usr/share/nginx/html;
는 정적 파일의 루트 디렉토리를 지정합니다.index index.html index.htm index.php;
는 기본 인덱스 파일을 지정합니다.
- 이 블록은
location = / { ... }
location = /
는 정확히/
경로에 대한 요청을 처리합니다.expires -1;
는 캐시를 비활성화합니다. 이는 브라우저가 해당 파일을 캐시하지 않도록 설정합니다.add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
는 HTTP 헤더를 추가하여 캐시를 완전히 비활성화합니다.
location = /robots.txt { ... }
location = /robots.txt
는 정확히/robots.txt
파일에 대한 요청을 처리합니다.allow all;
은 모든 클라이언트가robots.txt
파일에 접근할 수 있도록 허용합니다.log_not_found off;
는robots.txt
파일이 존재하지 않을 경우 로그를 남기지 않도록 설정합니다.
이 설정은 정확히 /
경로와 /robots.txt
파일에 대해 각각 캐시 제어와 접근 허용을 설정하는 데 적합합니다. 이를 통해 루트 페이지의 캐시를 비활성화하고, robots.txt
파일에 대한 접근을 허용하면서 존재하지 않을 경우 로그를 남기지 않도록 할 수 있습니다.
NGINX 캐시 서버와 CDN 서비스 구축 관련하여 대표적인 유형들입니다.
NGINX 캐시 계측
NGINX는 add_header
지시문을 사용해 캐시 상태를 확인할 수 있습니다.
add_header X-Cache-Status $upstream_cache_status;
- MISS: 캐시에 응답이 없어 원본 서버에서 가져옴.
- BYPASS: 특정 조건으로 캐시를 우회함.
- EXPIRED: 캐시 항목이 만료되어 원본 서버에서 최신 콘텐츠를 가져옴.
- STALE: 원본 서버가 응답하지 않아 오래된 콘텐츠를 제공함.
- UPDATING: 캐시 항목이 업데이트 중임.
- REVALIDATED: 캐시된 콘텐츠의 유효성을 확인함.
- HIT: 캐시에서 유효한 콘텐츠를 제공함.
캐시 여부 결정
NGINX는 응답에 미래 날짜의 Expires
헤더나 Cache-Control
헤더의 max-age
값이 있을 때만 캐싱합니다. 또한 proxy_buffering
이 on
상태여야 합니다.
Cache-Control 헤더 무시
proxy_ignore_headers
지시문을 사용하여 Cache-Control
헤더를 무시할 수 있습니다.
location /images/ {
proxy_cache my_cache;
proxy_ignore_headers Cache-Control;
proxy_cache_valid any 30m;
}
Set-Cookie 헤더와 캐싱
proxy_ignore_headers
지시문을 사용하여 Set-Cookie 헤더가 있는 콘텐츠도 캐시할 수 있습니다.
POST 요청 캐싱
proxy_cache_methods
지시문을 사용하여 POST 요청을 캐시할 수 있습니다.
proxy_cache_methods GET HEAD POST;
동적 콘텐츠 캐싱
동적 콘텐츠도 Cache-Control
헤더가 허용하는 경우 캐싱할 수 있습니다. 이를 통해 서버 부하를 줄이고 응답 시간을 단축할 수 있습니다.
캐시 우회
proxy_cache_bypass
지시문을 사용하여 특정 조건에서 캐시를 우회할 수 있습니다.
location / {
proxy_cache_bypass $cookie_nocache $arg_nocache;
}
캐시 키 구성
기본 캐시 키는 $scheme$proxy_host$request_uri
의 MD5 해시로 생성됩니다.
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_pass http://my_upstream;
}
}
쿠키를 캐시 키로 사용
proxy_cache_key
지시문을 사용하여 쿠키 값을 캐시 키에 포함할 수 있습니다.
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
ETag 헤더 사용
NGINX 1.7.3 및 NGINX Plus R5 이상에서 ETag 헤더를 완전히 지원합니다.
바이트 범위 요청 처리
파일이 캐시에 있으면 NGINX는 바이트 범위 요청을 수락하여 지정된 바이트만 제공합니다. 파일이 캐시에 없거나 오래된 경우 원본 서버에서 전체 파일을 다운로드합니다.
캐시 제거 지원
NGINX Plus는 캐시된 파일을 선택적으로 제거할 수 있습니다. 이는 원본 서버에서 업데이트된 파일을 캐시에서 제거하는 데 유용합니다.
Pragma 헤더 처리
기본적으로 NGINX는 Pragma 헤더를 따르지 않지만, proxy_cache_bypass
지시문을 사용하여 Pragma 헤더를 무시하도록 설정할 수 있습니다.
location /images/ {
proxy_cache my_cache;
proxy_cache_bypass $http_pragma;
}
Cache-Control 확장 지원
NGINX Plus R12 및 NGINX 1.11.10 이상에서 stale-while-revalidate
및 stale-if-error
확장을 지원합니다. 이를 통해 캐시된 응답이 오래된 경우에도 사용할 수 있습니다.
Vary 헤더 지원
NGINX Plus R5 및 NGINX 1.7.7 이상에서 Vary 헤더를 지원합니다.