Nginx Proxy Cache
Nginx의 proxy_cache는 리버스 프록시에서 백엔드 응답을 캐싱하여 동일한 요청에 대해 백엔드 호출 없이 즉시 응답합니다. 적절히 설정하면 백엔드 부하를 90% 이상 줄일 수 있습니다.
기본 설정
# /etc/nginx/nginx.conf (http 블록)
http {
proxy_cache_path /var/cache/nginx/proxy
levels=1:2
keys_zone=my_cache:10m
max_size=10g
inactive=60m
use_temp_path=off;
proxy_cache_key "$scheme$request_method$host$request_uri";
}
서버 블록 설정
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 1h;
proxy_cache_valid 301 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_min_uses 2;
proxy_cache_use_stale error timeout updating
http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
}
}
조건부 캐싱
map $request_uri $no_cache {
default 0;
~*/admin/ 1;
~*/api/auth/ 1;
}
map $http_cookie $no_cache_cookie {
default 0;
~*session_id 1;
}
server {
location /api/ {
proxy_pass http://backend_api;
proxy_cache my_cache;
proxy_cache_bypass $no_cache $no_cache_cookie;
proxy_no_cache $no_cache $no_cache_cookie;
proxy_cache_methods GET HEAD;
proxy_cache_key "$host$request_uri";
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 7d;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
캐시 퍼지(삭제)
# ngx_cache_purge 모듈 사용
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
proxy_cache_purge my_cache "$scheme$request_method$host$1";
}
# 사용: curl -X PURGE https://example.com/purge/api/posts
모니터링
log_format cache '$remote_addr - [$time_local] '
'"$request" $status '
'Cache:$upstream_cache_status '
'Time:${request_time}s';
access_log /var/log/nginx/cache.log cache;
캐시 상태값 설명
| 상태 | 의미 |
|---|---|
| HIT | 캐시에서 응답 (백엔드 호출 없음) |
| MISS | 캐시 없음, 백엔드에서 가져옴 |
| EXPIRED | 캐시 만료, 백엔드에서 갱신 |
| STALE | 오래된 캐시 사용 (백엔드 에러 시) |
| UPDATING | 백그라운드 갱신 중, 오래된 캐시 응답 |
| BYPASS | 캐시 바이패스 조건에 해당 |
proxy_cache_use_stale로 백엔드 장애 시에도 서비스 유지 가능proxy_cache_lock은 Thundering Herd 문제 방지- 캐시 키 설계가 중요: 불필요한 쿼리 파라미터 제외로 히트율 향상
- 로그인 사용자는 캐시 바이패스하여 개인화된 응답 제공
- 정기적으로 캐시 히트율을 모니터링하고 키와 TTL을 최적화
댓글 0