NGINX 및 NGINX Plus를 활용한 원격 학습용 비디오 스트리밍 지원

NGINX | 2020년 4월 16일

1년 전 F5가 NGINX 인수를 발표했을 때 저는 무척 기뻤습니다. 오랫동안 F5에서 일해 온 저는 NGINX가 F5에 꼭 맞는 회사라는 것을 알고 있었기 때문입니다. 이후 처음으로 가진 공동 회의 중 한 자리에서 NGINX 직원들이 제가 매우 중요하게 여기는 가치, 즉 ‘커뮤니티’에 대한 헌신을 이야기하는 모습을 보며 그런 확신은 더욱 굳어졌습니다. 제품 관리자로 NGINX 팀에 합류한 이후, 저는 그러한 헌신이 실제로 실천되는 모습을 직접 확인하고 커뮤니티와 더욱 긴밀하게 협력하는 기쁨을 누려 왔습니다.

코로나19 팬데믹 속에서 하나로 뭉치는 NGINX 커뮤니티

오픈 소스 분야에서 일하는 사람들은 일반적으로 코드를 제출하여 오픈 소스 프로젝트를 지원하는 사람들을 가리켜 ‘커뮤니티’라고 합니다. 이들도 중요하지만 NGINX 커뮤니티의 일부에 불과합니다. 그렇다면 커뮤니티의 다른 구성원은 누구일까요? 다음과 같은 분들도 소중한 커뮤니티 구성원입니다:

  • GitHub에서 공유하는 프로젝트에 NGINX를 사용하시는 분
  • NGINX를 활용하여 사이트, 앱, API를 사용자에게 안전하게 제공하세요
  • NGINX 설치 및 사용에 관한 블로그 게시물 작성
  • 공개 포럼에서 NGINX 사용자 지원

최근 몇 달 동안 NGINX 커뮤니티 구성원들은 COVID‑19 팬데믹 기간에 운영을 유지하는 데 어려움을 겪는 수많은 조직과 서로를 지원하기 위해 진정으로 힘을 모았습니다. 많은 분이 NGINX 소프트웨어의 도움을 받을 수 있는 사이트를 알려 주셨으며, NGINX를 최적의 성능으로 조정하는 방법에 관한 시간과 전문 지식을 기꺼이 제공해 주시기도 했습니다. 저희도 힘을 보태고자 COVID‑19로 영향을 받은 웹사이트를 위한 무료 리소스를 게시했으며, 커뮤니티가 새로운 NGINX 사용자를 중심으로 힘을 모으는 모습을 보며 큰 기쁨을 느꼈습니다.

트래픽 증가에 대응하고 새로운 기능을 추가하려는 조직을 지원하기 위해, 저희는 팬데믹 최전선에 있는 조직에 NGINX Plus 인스턴스를 최대 5개까지 무료로 제공해 왔습니다. 여기에는 의료기관, 정부 기관, 그리고 이 블로그와 가장 관련이 깊은 학교, 대학교, 교육 중심의 비영리 단체가 포함됩니다. 이러한 조직에서 증가하고 있는 활용 사례를 발견했는데, 아마 여러분도 놀라지 않으실 겁니다. 바로 동영상 스트리밍입니다!

전 세계 학교들이 문을 닫고 원격 학습을 빠르게 도입함에 따라, 앞으로 몇 주에서 몇 달 동안 스트리밍 동영상 사용이 기하급수적으로 증가할 것으로 예상됩니다. 이 블로그의 나머지 부분에서는 NGINX Open Source와 NGINX Plus를 사용하여 안정적이고 안전하며 확장 가능한 동영상 스트리밍을 구현하는 방법을 설명합니다.

이 블로그와 함께 제공되는 데모 동영상을 녹화해 주신 NGINX 기술 솔루션 아키텍트 James Jones에게 깊이 감사드립니다!

NGINX Open Source를 활용한 라이브 비디오 스트리밍 및 비디오 저장

당사의 비디오 스트리밍 솔루션은 NGINX용 RTMP(Real-Time Messaging Protocol) 모듈을 활용합니다. 이 동영상에서 James가 전체 과정을 단계별로 설명합니다:

James의 데모를 시청하면서 따로 메모하지 않아도 되도록, 모든 명령어와 구성 내용을 다음 섹션에 정리했습니다.

중요 사항: 보안을 잊지 마세요!

이 블로그에서 소개하는 NGINX 구성에는 동영상 스트림을 시청할 수 있는 사용자를 제한하는 보안 조치가 포함되어 있지 않습니다. 특정 IP 주소에서만 액세스를 허용하거나 시청자에게 인증을 요구하는 등, 시청자가 동영상을 보는 데 사용하는 프런트엔드 애플리케이션을 통해 스트림을 보호하는 방법은 다양합니다.

빌드 도구 설치

NGINX를 컴파일하기 전에 몇 가지 기본 빌드 도구를 설치해야 합니다: autoconf, gcc, git, 그리고 make입니다. 이러한 도구를 다운로드하고 설치하려면 사용 중인 운영 체제에 해당하는 명령어를 실행하세요. 운영 체제가 여기에 포함되어 있지 않다면 해당 OS 공급업체의 문서를 참조하세요.

  • Debian 및 Ubuntu의 경우:
$ sudo apt update$ sudo apt install build-essential git
  • CentOS, Oracle Linux 및 RHEL의 경우:
$ sudo yum update$ sudo yum groupinstall "Development Tools"
$ sudo yum install git

종속성 설치

NGINX를 빌드하려면 Perl 호환 정규 표현식(PCRE), OpenSSL, 압축용 zlib 등 여러 종속성도 필요합니다.

패키지 관리자를 사용하여 종속성 설치

종속성을 더 쉽게 다운로드하고 설치하려면 패키지 관리자를 사용하세요. 사용 중인 운영 체제에 맞는 명령을 실행하세요(여기에 해당 명령이 없다면 운영 체제 공급업체의 문서를 참조하세요).

  • Debian 및 Ubuntu의 경우:
$ sudo apt install libpcre3-dev libssl-dev zlib1g-dev
  • CentOS, Oracle Linux 및 RHEL의 경우:
$ sudo yum groupinstall pcre-devel zlib-devel openssl-devel

소스에서 종속성 설치

대신 소스에서 종속성을 빌드하고 설치하려면 다음 지침을 참조하세요.

RTMP 모듈을 포함하여 NGINX 컴파일하기

빌드를 완료하려면 RTMP와 NGINX의 GitHub 리포지토리를 복제하고 NGINX configure 명령을 실행한 다음 NGINX를 컴파일합니다.

$ cd /path/to/build/dir$ git clone https://github.com/arut/nginx-rtmp-module.git
$ git clone https://github.com/nginx/nginx.git
$ cd nginx
$ ./auto/configure --add-module=../nginx-rtmp-module
$ make
$ sudo make install

NGINX 구성하기

NGINX에서 HTTP 라이브 스트리밍(HLS) 및 HTTP를 통한 동적 적응형 스트리밍(DASH) 프로토콜 중 하나 또는 둘 다를 사용하여 비디오를 스트리밍하도록 구성할 수 있습니다. 두 프로토콜은 동일한 기능을 제공하므로 어느 것을 선택할지는 선호도에 따라 결정하면 됩니다. 이러한 프로토콜이 익숙하지 않다면 Vidbeo 블로그의 HLS와 DASH 비교를 참조하세요.

HLS 구성

HLS의 구성은 다음과 같습니다. 데모의 5분 10초 지점에서 James가 이러한 지시문의 용도를 설명합니다.

rtmp {     server { 
        listen 1935; 
        application live { 
            live on; 
            interleave on;
 
            hls on; 
            hls_path /tmp/hls; 
            hls_fragment 15s; 
        } 
    } 
} 
 
http { 
    default_type application/octet-stream;
 
    server { 
        listen 80; 
        location /tv { 
            root /tmp/hls; 
        } 
    }
 
    types {
        application/vnd.apple.mpegurl m3u8;
        video/mp2t ts;
        text/html html;
    } 
}

DASH 구성

DASH의 구성은 다음과 같습니다. 데모에서 James는 두 프로토콜에 공통으로 적용되는 지시어가 많기 때문에 HLS와 DASH를 하나의 구성으로 결합합니다.

rtmp {     server { 
        listen 1935; 
        application live { 
            live on; 
            dash on; 
            dash_path /tmp/dash; 
            dash_fragment 15s; 
        } 
    } 
} 
 
http { 
    server { 
        listen 80; 
        location /tv { 
            root /tmp/dash; 
        } 
    }
 
    types {
        text/html html;
        application/dash+xml mpd;
    } 
}

구성 검증 및 NGINX 시작

구문 오류가 없는지 확인하려면 항상 NGINX 구성을 검증하는 것이 좋습니다. 다음 명령을 실행하세요:

$ sudo nginx -tnginx: the configuration file filename syntax is ok
nginx: configuration file filename test is successful

그런 다음 다음 명령어를 실행하여 NGINX를 시작합니다:

$ sudo nginx

재생 메서드 테스트

비디오 스트리밍을 시작합니다. OBS Studio는 사용자 지정 RTMP 서버를 구성하여 워크스테이션에서 NGINX 서버로 라이브 스트리밍할 수 있게 해주는 널리 사용되는 오픈 소스 도구입니다. OBS의 스트리밍 대상을 rtmp://NGINX_server/tv/tv2로 구성합니다. 여기서 NGINX_server는 NGINX 서버의 IP 주소 또는 호스트 이름입니다. 스트림 키는 필요하지 않습니다.

James는 데모에서 라이브 영상 대신 파일의 영상을 스트리밍하므로 OBS를 사용하지 않습니다. 그는 stream.sh 스크립트를 실행하여 영상 스트리밍을 시작합니다(9분 30초). 이 스크립트의 내용은 다음과 같습니다.

ffmpeg -re -I bbb_sunflower_1080p_60fps_normal.mp4 -vcodec copy -loop -1 -c:a aac -b:a 160k -ar 44100 -strict -2 -f flv rtmp:192.168.1.138/live/bbb

그가 스트리밍하는 동영상(-I 인수로 지정)은 Big Buck Bunny라는 blender.org의 오픈 소스 동영상입니다. 다른 인수에 대한 자세한 내용은 ffmpeg 문서를 참조하세요.

비디오 스트리밍이 시작되면 구성한 프로토콜을 사용하여 NGINX가 비디오를 올바르게 제공하는지 테스트할 수 있습니다. James는 VLC 미디어 플레이어 인스턴스 세 개를 열고 각 재생 방식에 해당하는 URL에 접속합니다. URL에서 NGINX_server는 James의 NGINX 서버 IP 주소 또는 호스트 이름입니다:

  • RTMP – rtmp://NGINX_server/live/bbb
  • HLS – http://NGINX_server/live/bbb.m3u8
  • DASH – http://NGINX_server/live/bbb.mpd

NGINX Plus로 사용자 경험 개선

비디오 라이브러리나 강좌를 구축하는 경우 NGINX Open Source에서 제공하는 기능 이상의 역량이 필요할 수 있습니다. NGINX Plus는 확장 기능을 제공하여 사전 빌드된 모듈로 성능과 최종 사용자 경험을 개선합니다. 다음과 같은 작업을 수행할 수 있습니다:

  • 동영상을 캐싱하여 더 큰 규모 지원
  • 주문형 비디오(VOD) 서비스 제공
  • 대역폭을 제한하여 스트리밍 비용과 용량을 관리하세요

COVID‑19 팬데믹 기간 동안 NGINX는 교육, 공공기관 및 비영리 부문의 조직에 NGINX Plus 인스턴스를 최대 5개까지 사용할 수 있는 1년 무료 라이선스를 제공합니다(검토 및 승인 필요). 자세한 내용은 COVID‑19의 영향을 받은 웹사이트를 위한 무료 리소스를 참조하세요.

RTMP 모듈을 NGINX Plus에 통합하려면 동적으로 로드해야 합니다. 자세한 내용은 NGINX Plus 관리자 가이드를 참조하세요.

이 두 번째 데모에서 James는 Ansible과 Terraform을 사용하여 NGINX Plus를 세 대의 비디오 서버를 위한 로드 밸런서로 얼마나 쉽게 설정할 수 있는지 보여줍니다:

James가 두 번째 데모에서 사용하는 파일을 확인하려면 그의 GitHub 저장소를 참조하세요.

우리는 함께합니다

비디오 스트리밍이나 기타 사용 사례를 구현하는 데 어려움이 있다면 저희가 도와드리겠습니다! NGINX 직원과 커뮤니티는 Stack Overflow의 NGINX 채널1을 모니터링하며 질문과 요청에 최대한 신속하게 답변하고 있습니다.

팬데믹 최전선에서 활동하는 조직에 근무하며 고급 기능이 필요한 경우, 위에서 언급한 NGINX Plus 라이선스와 상위 등급의 F5 DNS Load Balancer Cloud Service를 이용할 자격이 있을 수 있습니다. 자세한 내용은 COVID‑19의 영향을 받은 웹사이트를 위한 무료 리소스를 참조하세요.

또한 해당 블로그에서 NGINX와 F5의 무료 리소스를 활용해 웹사이트 성능을 손쉽게 개선하는 방법을 간략히 살펴보세요.


1Stack Overflow는 제3자 웹사이트이며 F5, Inc.와 제휴 관계가 없습니다. F5 및 그 계열사는 Stack Overflow 또는 기타 제3자 웹사이트에 게시된 콘텐츠(일반 정보 및 질문에 대해 제안된 해결책 포함)에 대해 어떠한 책임도 지지 않습니다.


공유

관련 블로그 게시물

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
NGINX | 2023. 11. 30.

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric

이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
NGINX | 2023. 03. 23.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법

앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
NGINX | 2021. 09. 27.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션

개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX | 2021. 07. 06.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법

NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX | 2021. 06. 30.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리

NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
NGINX | 2015. 03. 25.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유

Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.