본문 바로가기
Infra2026년 3월 25일6분 읽기

Nginx 캐싱 전략 — proxy_cache로 백엔드 부하 줄이기

YS
김영삼
조회 399

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

아직 댓글이 없습니다.
Ctrl+Enter로 등록