관리 메뉴

피터의 개발이야기

[Nginx] NGINX으로 HLS(HTTP Live Streaming) 스트리밍 캐싱설정 본문

DevOps/nginx

[Nginx] NGINX으로 HLS(HTTP Live Streaming) 스트리밍 캐싱설정

기록하는 백앤드개발자 2025. 3. 14. 00:00
반응형

ㅁ 들어가며

지난 글, [Nginx] NGINX 설정 파일의 구조와 사용법 - 캐시 설정 (정적 파일)에서 캐시설정 방법을 공부하였다. NGINX를 이용하여 HLS(HTTP Live Streaming) 스트리밍 캐싱을 설정하는 방법을 정리해 보았다.

 

ㅁ HTTP 라이브 스트리밍이란?

  HLS(HTTP 라이브 스트리밍)는 Apple이 개발한 널리 사용되는 비디오 스트리밍 프로토콜이다. 비디오 혹은 오디오 파일을 작은 HTTP 파일 조각으로 나누어 전송하며, 주문형 스트리밍과 라이브 스트리밍 모두 지원한다.

  .m3u8 파일(재생 목록)과 .ts 파일(비디오 세그먼트)을 사용하는데, 클라이언트는 m3u8 파일을 먼저 다운로드하고, 이를 통해 ts 파일들을 순차적으로 요청하여 재생한다. HLS의 이러한 특성으로 인해 다양한 네트워크 환경에서 안정적인 스트리밍 서비스를 제공할 수 있으며, 버퍼링 문제를 최소화할 수 있다.

 

ㅁ proxy_cache 캐시 동작 방식

ㅇ 사용자가 .m3u8 또는 .ts 파일 요청 → NGINX는 캐시 확인

ㅇ 캐시 상태 확인를 upstream_cache_status으로 제공한다. 
 - MISS : 캐시에 없음 (최초 요청)
 - HIT : 캐시에서 제공됨
 - UPDATING : 캐시 업데이트 중

 

ㅁ proxy_cache를 이용한 HLS 스트리밍 캐싱

http {
    proxy_cache_path /var/cache/nginx/hls_cache levels=1:2 keys_zone=hls_cache:10m 
        inactive=30s max_size=500m;  # 캐시 경로 및 정책 설정

    server {
        listen 80;
        server_name stream.example.com;

        location /hls/ {
            proxy_pass http://backend_streaming_server/hls/;
            proxy_cache hls_cache;
            proxy_cache_valid 200 10s;  # 200 응답을 10초간 캐싱
            proxy_cache_use_stale updating;
            proxy_cache_background_update on;
            proxy_cache_min_uses 1;
            proxy_ignore_headers Cache-Control Expires;
            add_header X-Cache-Status $upstream_cache_status;
        }
    }
}

ㅇ NGINX를 이용하여 HLS 스트리밍 캐싱을 설정하려면 proxy_cache 기능을 활용해야 한다.

캐시 저장소 설정 (proxy_cache_path)

  • /var/cache/nginx/hls_cache : 캐시 저장 경로
  • levels=1:2 : 디렉토리 구조 (하위 2단계)
  • keys_zone=hls_cache:10m : 10MB 크기의 공유 메모리 사용
  • inactive=30s : 사용되지 않는 캐시는 30초 후 삭제
  • max_size=500m : 최대 500MB 캐시 저장

ㅇ 스트리밍 캐시 (proxy_cache)

  • proxy_pass http://backend_streaming_server/hls/ : 백엔드 스트리밍 서버 주소
  • proxy_cache hls_cache; : 지정한 캐시 영역 사용
  • proxy_cache_valid 200 10s; : .m3u8, .ts 파일을 10초 동안 캐싱
  • proxy_cache_use_stale updating; : 캐시를 업데이트하는 동안 이전 캐시 사용
  • proxy_cache_background_update on; : 백그라운드에서 캐시 업데이트
  • proxy_cache_min_uses 1; : 한 번만 요청되어도 캐싱 수행
  • proxy_ignore_headers Cache-Control Expires; : 백엔드 서버의 캐시 무효화 방지

ㅇ 캐시 상태 확인 (add_header X-Cache-Status $upstream_cache_status;)

  • MISS : 캐시에 없으면 백엔드 서버에서 가져와 저장 (최초 요청)
  • HIT : 10초 동안 동일 요청 발생 시 캐시에서 제공
  • UPDATING :  10초 후 새로운 요청이 오면 백엔드에서 최신 데이터 가져와 캐시 업데이트

 

ㅁ 캐시 적용 및 테스트

nginx -t

ㅇ NGINX 설정 문법 검사

mkdir -p /var/cache/nginx/hls_cache
chown -R nginx:nginx /var/cache/nginx/hls_cache
chmod -R 755 /var/cache/nginx/hls_cache

ㅇ NGINX 캐시 폴더 생성

systemctl restart nginx

ㅇ NGINX 재시작

 

curl -I http://stream.example.com/hls/playlist.m3u8

# 샘플 헤드 응답
X-Cache-Status: HIT

ㅇ curl로 헤드 확인.

 

ㅁ 추가적인 선택 사항

캐시 유지 시간 조정

location ~* \.m3u8$ {
    proxy_cache_valid 200 10s;
}

location ~* \.ts$ {
    proxy_cache_valid 200 30s;
}

ㅇ  .m3u8은 10초, .ts는 30초로 캐싱 주기를 정할 수 있다.

 

특정 파일 캐싱 제외

location ~* \.m3u8$ {
    proxy_cache hls_cache;
    proxy_cache_valid 200 10s;
}

location ~* \.ts$ {
    proxy_no_cache 1;
    proxy_cache_bypass 1;
}

ㅇ .m3u8만 캐싱하고 .ts는 제외할 수 있다.

 

ㅁ 함께 보면 좋은 사이트

HLS(HTTP 라이브 스트리밍)란 무엇입니까?

NGINX Cache 시스템 이해하기

  ㄴ 기본 캐싱을 ​​설정 및 구성하는 방법
  ㄴ Origin이 다운된 경우 캐시된 Content Delivering
  ㄴ 캐시 미세 조정 및 성능 향상
  ㄴ 여러 하드 드라이브에 캐시 분할

월드컵 라이브 스트리밍을 지탱하는 기술, HLS 프로토콜에 대해

  ㄴ HLS는 HTTP를 기반으로 하는 프로토콜이라 기업 입장에서는 적용하는데 별다른 비용이 들지 않고, '적당히 실시간에 가까운' 동영상을 사람들이 가장 많이 사용하는 환경인 '웹으로' 제공해준다.

 NGINX Plus HLS 모듈을 사용하여 동영상 스트리밍 서비스 구성

nginx rtmp를 이용해서 실시간 스트리밍 구현 예제(HLS 프로토콜 추가)

 

 

반응형
Comments