NGINXとNGINX Plusでリモート学習向け動画ストリーミングを実現

NGINX | 2020年4月16日

1年前にF5がNGINXの買収を発表したとき、私は大変うれしく思いました。F5に長年在籍してきた者として、NGINXがF5にまさにふさわしいと確信していたからです。その思いは、両社による最初の合同ミーティングの1つで、NGINXの社員が私にとって非常に重要なこと、すなわち「コミュニティ」へのコミットメントについて語ったことで、確信へと変わりました。プロダクトマネージャーとしてNGINXチームに加わって以来、そのコミットメントが実践される様子を目の当たりにし、コミュニティとより深く関わる機会にも恵まれています。

COVID-19パンデミックの中で結束するNGINXコミュニティ

オープンソースに携わる人々は通常、コードを提供してオープンソースプロジェクトを支援する人々を「コミュニティ」と呼びます。こうした方々は重要な存在ですが、NGINXコミュニティのごく一部にすぎません。では、ほかにどのような方々がコミュニティに参加しているのでしょうか。私たちは、次のような方々も大切なメンバーだと考えています。

  • GitHubで共有するプロジェクトでNGINXを使用している方
  • NGINXを活用して、サイト、アプリ、APIをユーザーに安全に配信する
  • NGINXのインストール方法と使用方法に関するブログ記事を執筆する
  • 公開フォーラムでNGINXユーザーを支援する

ここ数か月、NGINXコミュニティのメンバーは一丸となり、互いに支え合うとともに、COVID‑19のパンデミック下で事業継続に苦慮する多くの組織を支援してきました。NGINXソフトウェアが役立つ可能性のあるサイトをお知らせくださった方や、NGINXのパフォーマンスを最大限に引き出すためのチューニングに時間と専門知識を提供してくださった方も数多くいらっしゃいます。F5もその一助となるべく、「COVID‑19の影響を受けたWebサイト向けの無償リソース」を公開しました。コミュニティが新たなNGINXユーザーを支援する姿を、大変心強く感じています。

トラフィックの増加への対応や新機能の追加に取り組む組織を支援するため、パンデミック対応の最前線に立つ組織にNGINX Plusの無料インスタンスを最大5つ提供してきました。対象には、医療機関、政府機関、そしてこのブログに特に関連する学校、大学、教育分野の非営利団体が含まれます。こうした組織では、皆さまにとっても意外ではないであろうユースケースが増加傾向にあることがわかりました。それは、動画ストリーミングです!

世界各地で学校が閉鎖され、遠隔学習の導入が急速に進む中、今後数週間から数か月にわたり、ストリーミング動画の利用が飛躍的に増加すると予想されます。このブログの以降のセクションでは、NGINX Open SourceとNGINX Plusを使用して、安定性とセキュリティに優れ、拡張可能な動画ストリーミングを実現する方法を説明します。

このブログに添えるデモ動画を収録してくれたNGINXテクニカルソリューションアーキテクトのJames Jonesに、心より感謝します!

NGINX Open Sourceによるライブ動画のストリーミングと動画の保存

F5の動画ストリーミングソリューションでは、NGINX向けのReal-Time Messaging Protocol(RTMP)モジュールを活用しています。この動画では、Jamesがその手順を1つずつ解説します。

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 Compatible Regular Expressions(PCRE)、OpenSSL、圧縮用のzlibなど、複数の依存関係も必要です。

パッケージマネージャーを使用した依存関係のインストール

依存関係を簡単にダウンロードしてインストールするには、パッケージマネージャーを使用します。お使いのオペレーティングシステムに対応するコマンドを実行してください(ここに記載されていない場合は、OSベンダーのドキュメントを参照してください)。

  • 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 Live Streaming(HLS)とDynamic Adaptive Streaming over 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を1つの設定にまとめています。

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を使用していません。動画ストリームを開始するには(9:30)、stream.shスクリプトを実行します。このスクリプトの内容は次のとおりです。

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引数で指定)は、blender.orgが提供するオープンソース動画「Big Buck Bunny」です。その他の引数について詳しくは、ffmpegのドキュメントを参照してください。

動画のストリーミングが開始されたら、設定したプロトコルを使用してNGINXが動画を正しく配信しているかテストできます。JamesはVLC media playerを3つ起動し、各再生方式に対応する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の影響を受けたWebサイト向けの無償リソース」をご覧ください。

RTMPモジュールをNGINX Plusに組み込むには、動的にロードします。詳しくは「NGINX Plus管理ガイド」を参照してください。

この2つ目のデモでは、JamesがAnsibleとTerraformを使用して、NGINX Plusを3台の動画サーバーのロードバランサーとして簡単にセットアップする方法を紹介します。

2つ目のデモでJamesが使用しているファイルにアクセスするには、Jamesの「GitHubリポジトリ」をご覧ください。

共に取り組む

動画ストリーミングをはじめとするユースケースの実装でお困りの場合は、ぜひご相談ください。NGINXの従業員とコミュニティがStack OverflowのNGINXチャンネル1を確認し、質問やリクエストにできる限り迅速に対応しています。

パンデミック対応の最前線に立つ組織に所属し、高度なニーズがある場合は、上記のNGINX Plusライセンスに加え、F5 DNS Load Balancer Cloud Serviceの上位階層を利用できる可能性があります。詳しくは「COVID‑19の影響を受けたWebサイト向けの無料リソース」をご覧ください。

また、そのブログでは、NGINXとF5の無料リソースを活用してウェブサイトのパフォーマンスを簡単に向上させる方法をまとめて紹介しています。


1Stack Overflowは第三者が運営するWebサイトであり、F5, Inc.とは提携していません。F5およびその関連会社は、Stack Overflowまたはその他の第三者Webサイトに投稿されたコンテンツ(一般情報および質問に対して提案された解決策を含む)について、一切の責任を負いません。


共有
タグ: COVID-19, F5 NGINX, Tech, 2020

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります