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

이 포스트에서는 NGINX Plus와 ngx_http_hls_module을 사용하여 HLS(HTTP Live Streaming) 방식의 동영상 스트리밍을 제공하는 방법에 대해 알아봅니다. 동영상 스트리밍은 최근 몇 년간 급격히 성장했으며,NGINX Plus HLS 방식을 사용하여 사용자들에게 더 나은 품질의 콘텐츠를 제공할 수 있습니다.

NGINX Plus와 ngx_http_hls_module을 활용하면 고품질의 동영상 스트리밍 서비스를 효율적으로 제공할 수 있습니다. HLS를 통해 사용자 경험을 크게 향상시킬 수 있으며, 동영상 콘텐츠의 품질과 안정성을 보장할 수 있습니다.

목차

1. HLS(HTTP Live Streaming)
2. ngx_http_hls_module
3. NGINX Plus HLS 모듈 활성화
4. NGINX Plus HLS 작동 분석
5. 결론

1. HLS(HTTP Live Streaming)

HTTP Live Streaming(HLS)은 애플이 개발한 스트리밍 프로토콜로, 동영상 및 오디오 콘텐츠를 인터넷을 통해 실시간으로 전송하는 데 사용됩니다. HLS는 HTTP를 기반으로 하여 안정적이고 효율적인 스트리밍을 제공합니다.

HLS는 m3u8과 ts를 사용합니다. m3u8은 영상 재생을 위한 메타 정보이며, ts는 잘개 쪼개진 미디어 파일입니다.

NGINX Plus의 ngx_http_hls_module은 HLS 스트리밍을 지원하는 모듈로, HLS를 통해 동영상 콘텐츠를 효율적으로 제공할 수 있도록 돕습니다.

2. ngx_http_hls_module

ngx_http_hls_module 모듈은 MP4와 MOV 미디어 파일에 HTTP Live Streaming(HLS) 서버 측 지원을 제공합니다. 일반적으로 이런 파일은 확장자가 .mp4, .m4v, .m4a, .mov, .qt입니다. 이 모듈은 H.264 영상 코덱, AAC 및 MP3 오디오 코덱을 지원합니다.

각 미디어 파일에 URI 2개가 지원됩니다.

  • 하나는 파일 이름 확장자가 “.m3u8″인 재생 목록 URI가 있습니다. 이 URI는 선택적 인수를 받습니다.
    • “start”와 “end”는 재생 목록 경계(초)를 정의합니다(1.9.0).
    • “offset”은 최초 재생 위치를 시간 오프셋(초)으로 이동합니다(1.9.0). 양수 값은 재생 목록 처음부터 시간 오프셋을 설정합니다. 음수 값은 재생 목록 마지막 프래그먼트 끝에서 시간 오프셋을 설정합니다.
    • “len”은 프래그먼트 길이(초)를 정의합니다.
  • 다른 하나는 파일 이름 확장자가 “.ts”인 프래그먼트 URI가 있습니다. 이 URI는 선택적 인수를 받습니다.
    • “start” 및 “end”는 프래그먼트 경계(초)를 정의합니다.

이 모듈은 NGINX Plus에서 제공합니다.

예제:

location / {
    hls;
    hls_fragment            5s;
    hls_buffers             10 10m;
    hls_mp4_buffer_size     1m;
    hls_mp4_max_buffer_size 5m;
    root /var/video/;
}

구성에 대한 설명은 아래와 같습니다:

  • hls – HLS 기능을 활성화합니다.
  • hls_fragment – 클라이언트가 다운로드할 수 있는 세그먼트의 총 시간을 설정합니다. (예시에서는 5초)
  • hls_buffers – HLS 처리를 위해 사용하는 버퍼의 개수와 크기를 설정합니다. (예시에서는 10개의 버퍼를 각각 10MB 크기)
  • hls_mp4_buffer_size – MP4 파일에서 데이터를 읽기 위한 버퍼의 초기 크기를 설정합니다. (예시에서 버퍼의 초기 크기는 1MB 입니다.)
  • hls_mp4_max_buffer_size – MP4 파일에서 데이터를 읽기 위한 버퍼의 최대 크기를 설정합니다. (예시에서 사용할 수 있는 최대 버퍼 크기는 5MB 입니다.)

3. NGINX Plus HLS 모듈 활성화

ngx_http_hls_module 섹션에서 확인할 수 있듯이, NGINX Plus를 사용하여 HLS를 활성화하는 방법은 복잡하지 않습니다.

server {
        listen 80;
        server_name example.com;

        access_log /var/log/nginx/video_access.log;

        location /hls/ {
                hls;
                hls_fragment            5s;
                hls_buffers             10 10m;
                hls_mp4_buffer_size     1m;
                hls_mp4_max_buffer_size 5m;

                root /usr/share/nginx;
                add_header Cache-Control no-cache;
        }
}

위의 HLS 구성은 ngx_http_hls_module 섹션의 예시 구성과 동일하며, /usr/share/nginx/hls/ 하위에 test.mp4 비디오가 있습니다.

add_header Cache-Control no-cache; 헤더를 추가하여 클라이언트와 중간 캐시 서버가 HLS 콘텐츠를 캐싱하지 않도록 설정합니다. 이는 최신 세그먼트를 항상 제공하며, 실시간 스트리밍 품질을 유지합니다.

HLS가 적용되었는지 확인하기 위해 http://example.com/hls/test.mp4.m3u8 로 접근합니다. (HLS 프로토콜을 지원하는 환경에서 접근합니다)

정상적으로 비디오가 재생이 된다면 개발자 도구 또는 access log를 통해 HLS가 적용되었는지 확인할 수 있습니다.

개발자 도구 – Network:

위의 사진에서와 같이 .m3u8과 .ts가 생성된 것을 확인할 수 있습니다. 여기서 .m3u8 파일은 HLS 스트리밍에서 사용하는 플레이리스트 파일입니다.

또한 아래 생성된 .ts 파일은 HLS 스트리밍에서 동영상 데이터를 포함한 MPEG-TS(Transport Stream) 형식의 세그먼트 파일입니다. 즉, 동영상의 작은 조각으로 나뉘어져 클라이언트가 스트리밍 방식으로 재생할 수 있도록 하는 파일입니다.

개발자 도구의 .ts 부분을 확인해보면 NGINX Plus의 구성인 hls_fragment 5s; 설정에 따라 5초 길이의 동영상 데이터로 나뉘어 진 것을 확인할 수 있습니다.

NGINX Plus Access Log:

nginx plus hlsnginx plus hls

마찬가지로 HLS가 적용되어 .m3u8 파일로 요청을 받고, 5초 간격의 .ts 파일을 요청하는 것을 확인할 수 있습니다.

4. NGINX Plus HLS 작동 분석

아래와 같이 구성하여 일반적인 progressive 방식과 HLS 방식을 비교합니다.

server {
        listen 80;
        server_name example.com;

        access_log /var/log/nginx/video_access.log;

        location / {
                root /usr/share/nginx;
        }

        location /hls/ {
                hls;
                hls_fragment            5s;
                hls_buffers             10 10m;
                hls_mp4_buffer_size     1m;
                hls_mp4_max_buffer_size 5m;

                root /usr/share/nginx;
                add_header Cache-Control no-cache;
        }
}

위 구성은 location / { }로 요청하는 .mp4는 progressive 방식으로 해당 파일을 통째로 다운로드하여 전달합니다. 따라서 클라이언트는 파일을 점진적으로 다운로드합니다.

location /hls/ { }로 요청의 경우 NGINX Plus HLS 모듈 활성화 섹션과 구성이 동일합니다.

간단하게 NGINX Plus의 로그 중 $body_bytes_sent값을 확인하여 클라이언트가 다운로드 받는 크기를 확인하는 방법이 있습니다.

progressive 방식:

클라이언트는 비디오 재생을 위해 한 번의 요청에 test.mp4 파일 전체를 다운로드 하는 것을 확인할 수 있습니다.

HLS 방식:

nginx plus hls

클라이언트는 각각 5초 분량의 .ts 파일 세그먼트 파일을 다운로드 하는 것을 확인할 수 있습니다.

5. 결론

이번 포스트에서는 NGINX Plus의 HLS 모듈을 간단히 구성하고 progressive 방식과 HLS 방식의 동작 원리를 간단히 살펴보았습니다. NGINX Plus는 고성능의 미디어 스트리밍 솔루션을 제공하며, HLS는 특히 다양한 디바이스와 네트워크 환경에서 안정적인 비디오 재생을 가능하게 합니다.

Progressive 방식은 간단한 구현과 빠른 초기 재생 속도를 제공하지만 전체를 다운로드할 때까지 다운로드를 진행하게 되며, 대량의 트래픽이 발생할 경우 서버에 부담을 줄 수 있습니다.

반면 HLS 방식은 작은 조각 단위의 비디오를 가지고 세분화된 스트리밍을 통해 네트워크 상황에 따라 적절한 품질의 비디오를 제공하며, 품질이 동적으로 조정되기 때문에 사용자에게 최적의 시청 경험을 선사할 수 있습니다.

결론적으로, 비디오 스트리밍의 요구사항에 따라 적절한 방식을 선택하는 것이 중요합니다. NGINX Plus는 두 가지 방식을 모두 지원하여 유연하고 효율적인 비디오 서비스 환경을 구축할 수 있는 강력한 도구입니다. 앞으로의 비디오 스트리밍 기술 발전에 주목하며, NGINX Plus를 통해 더욱 향상된 사용자 경험을 제공할 수 있습니다.

NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required