[네트워크] 리버스 프록시에서의 캐싱

리버스 프록시 캐싱은 클라이언트의 요청을 먼저 받아서 캐시된 응답을 제공하고, 캐시되지 않은 경우 백엔드 서버에 요청을 전달하는 방식

 

 

Nginx 설정 파일에 캐싱을 추가하는 예시

http {
    # 캐시할 위치 설정
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    server {
        listen 80;

        location / {
            # 백엔드 서버로 요청 전달
            proxy_pass http://backend_server;

            # 캐시 설정
            proxy_cache my_cache;
            proxy_cache_valid 200 1h;  # 200 OK 응답에 대해 1시간 동안 캐시
            proxy_cache_valid 404 1m;  # 404 응답에 대해 1분 동안 캐시
            proxy_cache_use_stale error timeout updating;  # 백엔드 서버가 에러를 반환하거나 시간이 초과되면 캐시된 응답 사용
            add_header X-Cache-Status $upstream_cache_status;  # 캐시 상태를 헤더에 추가
        }
    }
}

 

  • proxy_cache_path: 캐시 파일이 저장될 디렉토리와 캐시 관련 설정을 정의
  • proxy_cache: 사용할 캐시 영역을 지정
  • proxy_cache_valid: 특정 상태 코드에 대해 캐시할 유효 시간을 설정 (예를 들어, 200 OK 응답에 대해 1시간 동안 캐시)
  • proxy_cache_use_stale: 백엔드 서버에서 오류나 타임아웃이 발생하면 캐시된 데이터를 사용하도록 설정
  • add_header: 클라이언트에게 캐시 상태를 알리기 위해 응답 헤더에 캐시 상태를 추가

 


리버스 프록시의 캐싱 동작 원리

  1. 클라이언트 요청 수신
    클라이언트가 브라우저를 통해 서버에 요청을 보낼 때, 이 요청은 리버스 프록시를 통해 전달된다.
  2. 캐시 확인
    리버스 프록시는 캐시에 요청한 데이터가 저장되어 있는지 확인한다.
    • 캐시 히트(Cache Hit): 요청한 데이터가 캐시에 존재하는 경우, 원본 서버에 요청을 전달하지 않고 캐시에서 즉시 데이터를 반환
    • 캐시 미스(Cache Miss): 요청한 데이터가 캐시에 없을 경우, 리버스 프록시는 원본 서버에서 데이터를 가져와 클라이언트에 반환하고, 해당 데이터를 캐시에 저장
  3. 캐시 갱신
    캐시에 저장된 데이터가 오래되거나 변경된 경우, 리버스 프록시는 원본 서버에서 최신 데이터를 가져와 캐시를 업데이트한다.

리버스 프록시 캐싱의 주요 특징

1. 정적 콘텐츠 제공

  • 리버스 프록시는 HTML, CSS, JavaScript 파일 및 이미지와 같은 정적 콘텐츠를 캐싱하여 요청이 들어올 때마다 원본 서버에 연결할 필요를 없앤다.
  • 정적 콘텐츠는 변경 빈도가 낮아 캐싱에 적합하다.

2. 동적 콘텐츠 캐싱

  • 일부 리버스 프록시는 동적 콘텐츠도 캐싱할 수 있다.
    예를 들어, 사용자 별로 동일한 결과를 반환하는 검색 요청이 있다면 이를 캐싱하여 서버 부담을 줄인다.
  • 이를 위해 동적 콘텐츠의 캐시 정책(예: 사용자 세션 기반)을 설정해야 한다.

3. TTL(Time to Live)

  • 각 캐시 데이터는 유효 기간(TTL)을 갖는다.
  • TTL이 지나면 캐시는 해당 데이터를 무효화하고 원본 서버에서 최신 데이터를 가져온다.