はい、承知いたしました。Nginx RTMP Moduleを使ったRTMPサーバー構築に関する詳細な技術解説記事を、約5000語のボリュームで記述します。
【簡単そうで奥深い】Nginx RTMP Moduleを使った堅牢なRTMPサーバー構築入門から応用まで
はじめに
近年、ライブストリーミングは私たちの日常生活に欠かせないものとなりました。ゲーム実況、オンラインイベント、セミナー、個人的な情報発信など、様々な場面でリアルタイムな映像・音声配信が利用されています。ライブストリーミングを実現するための技術はいくつかありますが、特に普及しているプロトコルの一つにRTMP(Real-Time Messaging Protocol)があります。
RTMPはAdobeによって開発されたプロトコルで、元々はAdobe Flash Playerとの連携を主目的としていました。しかし、その低遅延性と信頼性から、ライブストリーミングの「取り込み(Ingest)」プロトコルとして広く使われるようになりました。多くのエンコーダーソフトウェア(OBS Studio, FFmpegなど)がRTMP出力をサポートしており、TwitchやYouTube Liveのような大手プラットフォームもRTMPでの配信を受け付けています。
RTMPサーバーを構築するためのソフトウェアはいくつか存在しますが、その中でも特に人気があり、柔軟性とパフォーマンスに優れているのがNginx RTMP Moduleです。Nginxはもともと高性能なWebサーバーおよびリバースプロキシとして知られていますが、このモジュールを追加することで、Nginxを堅牢なRTMPサーバーとして機能させることができます。オープンソースでありながら商用レベルの機能を提供し、カスタマイズ性も高い点が魅力です。
この記事では、Nginx RTMP Moduleを使ってRTMPサーバーを構築するための、基本的なステップから応用的な設定までを、詳細かつ網羅的に解説します。Linuxサーバーの基本的な操作ができる方を対象としており、コマンド例や設定ファイルの記述例を豊富に含んでいます。この記事を読むことで、あなた自身のライブストリーミングサーバーを構築し、運用するための知識とスキルを習得できるでしょう。
さあ、Nginx RTMP Moduleの世界へ踏み出しましょう。
RTMPサーバー構築の全体像
Nginx RTMP Moduleを使ったRTMPサーバー構築は、以下の主要なステップで構成されます。
- OSの準備: サーバーとなるコンピュータにLinuxオペレーティングシステムをインストールし、初期設定を行います。
- 必要なライブラリのインストール: NginxやRTMP Moduleをビルドするために必要な開発ツールやライブラリをインストールします。
- NginxとRTMP Moduleのダウンロード: Nginx本体とNginx RTMP Moduleのソースコードを取得します。
- Nginxのビルドとインストール: RTMP Moduleを組み込んでNginxをソースコードからコンパイルし、インストールします。
- Nginx RTMP Moduleの設定: Nginxの設定ファイル(nginx.conf)にRTMPに関する設定を記述します。
- Nginxの起動と確認: 設定を反映してNginxを起動し、RTMPサーバーとして機能しているか確認します。
- ライブストリーミングの配信テスト: エンコーダーソフトウェア(OBS Studioなど)を使ってRTMPサーバーにストリームを送信します。
- ストリームの視聴テスト: プレイヤーソフトウェア(VLC Media Playerなど)を使って配信されたストリームを視聴します。
これらのステップを順に進めることで、基本的なRTMPライブストリーミングサーバーが構築できます。さらに、認証設定、HLS/DASHへの変換、統計情報の取得といった応用的な設定についても解説します。
ステップ1: OSの準備
まず、RTMPサーバーを稼働させるための基盤となるオペレーティングシステムを準備します。
サーバーの選択
物理サーバー、VPS(Virtual Private Server)、クラウドプラットフォーム上の仮想マシン(AWS EC2, Google Cloud Compute Engine, Azure Virtual Machinesなど)のいずれかを選択します。ライブストリーミングはサーバーに一定の負荷をかけるため、利用目的や予算に合わせて適切なスペックを選びましょう。特に、複数の同時配信や視聴者を想定する場合は、CPU、メモリ、ネットワーク帯域幅が重要になります。
OSのインストールと初期設定
Linuxディストリビューションとしては、Ubuntu Server LTS または CentOS Stream/AlmaLinux/Rocky Linux がよく利用されます。これらのOSは情報が多く、パッケージ管理システムが充実しているため、構築作業が比較的容易です。ここでは、説明の多くをUbuntu LTSを前提に進めますが、他のディストリビューションでも基本的な考え方は同じです。
OSをインストールしたら、以下の初期設定を行うことを推奨します。
- SSH接続の有効化とセキュリティ設定: リモートから安全にサーバーを操作するためにSSHを有効にし、パスワード認証を無効にして鍵認証のみにする、SSHポートを変更するといったセキュリティ対策を行います。
- ユーザーアカウントの作成: rootユーザーでの直接ログインを避け、一般ユーザーを作成して
sudo
コマンドで管理者権限の必要な操作を行うようにします。 - ファイアウォール設定: サーバーのセキュリティを高めるためにファイアウォールを設定します。不要なポートへのアクセスを制限し、必要なポート(SSH用の22番、RTMP用の1935番、もしWebサーバーとしても使うならHTTPの80番/HTTPSの443番など)のみを開放します。Linuxでは ufw (Uncomplicated Firewall) や firewalld といったツールがよく使われます。
例:Ubuntuでのufw設定
“`bash
ufwを有効化
sudo ufw enable
SSHポート(デフォルト22)を許可
sudo ufw allow ssh
RTMPポート(デフォルト1935)を許可
sudo ufw allow 1935/tcp
NginxをWebサーバーとしても使う場合のHTTP/HTTPSポートを許可
sudo ufw allow http
sudo ufw allow https
設定の確認
sudo ufw status
“`
- システムのアップデート: インストールされているパッケージを最新の状態に更新し、セキュリティパッチを適用します。
bash
sudo apt update
sudo apt upgrade -y
- タイムゾーンの設定: サーバーのタイムゾーンを適切に設定します。
これで、RTMPサーバー構築の土台となるOSの準備が整いました。
ステップ2: NginxとRTMP Moduleのインストール
Nginx RTMP ModuleはNginx本体に組み込まれるモジュールとして提供されています。そのため、Nginxをソースコードからコンパイルする際に、このモジュールを組み込む必要があります。パッケージマネージャーでインストールできるNginxは、通常RTMP Moduleを含んでいないため、ソースビルドが推奨される方法です。
必要な依存関係のインストール
NginxやRTMP Moduleをソースコードからビルドするには、いくつかの開発ツールやライブラリが必要です。主に以下のものが必要になります。
- GCC (GNU Compiler Collection) および関連ツール (makeなど)
- PCRE (Perl Compatible Regular Expressions) ライブラリ: Nginxのリライトモジュールなどで正規表現を使うために必要
- zlib ライブラリ: HTTP圧縮をサポートするために必要
- OpenSSL ライブラリ: HTTPSやその他のSSL/TLS機能のために必要 (RTMPでは必須ではないが、同時にWebサーバーとして使う場合や、RTMPSを使う場合に必要)
Ubuntuの場合、以下のコマンドで必要なパッケージをインストールできます。
bash
sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
CentOS/AlmaLinux/Rocky Linuxの場合、以下のコマンドになります。
bash
sudo dnf install -y gcc gcc-c++ make automake autoconf pcre pcre-devel zlib zlib-devel openssl openssl-devel
NginxとRTMP Moduleのソースコードのダウンロード
まず、Nginxの公式サイトから最新の安定版のソースコードをダウンロードします。
“`bash
例: 安定版の最新バージョンを確認し、それに合わせてURLを変更してください
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
“`
次に、Nginx RTMP ModuleのGitHubリポジトリからソースコードをダウンロードします。
“`bash
Nginx RTMP Moduleのソースコードをクローン
Nginxソースディレクトリの兄弟ディレクトリとして配置することが多い
cd .. # Nginxソースディレクトリから出る
git clone https://github.com/arut/nginx-rtmp-module.git
“`
これで、nginx-1.24.0
ディレクトリと nginx-rtmp-module
ディレクトリが同じ階層にある状態になります。
Nginxのビルドとインストール
Nginxのソースディレクトリに戻り、ビルドの設定を行います。configure
スクリプトを実行する際に、--add-module
オプションを使ってRTMP Moduleのソースディレクトリを指定します。
“`bash
cd nginx-1.24.0/
./configure \
–prefix=/usr/local/nginx \
–sbin-path=/usr/local/nginx/sbin/nginx \
–conf-path=/etc/nginx/nginx.conf \
–pid-path=/var/run/nginx.pid \
–lock-path=/var/run/nginx.lock \
–error-log-path=/var/log/nginx/error.log \
–http-log-path=/var/log/nginx/access.log \
–with-http_ssl_module \
–with-http_stub_status_module \
–with-http_realip_module \
–with-http_gzip_static_module \
–add-module=../nginx-rtmp-module
“`
各オプションの意味は以下の通りです。
--prefix=/usr/local/nginx
: Nginxのインストール先ディレクトリを指定します。--sbin-path=.../nginx
: Nginx実行ファイルのパスを指定します。--conf-path=.../nginx.conf
: メイン設定ファイルのパスを指定します。--pid-path=.../nginx.pid
: PIDファイルのパスを指定します。--lock-path=.../nginx.lock
: ロックファイルのパスを指定します。--error-log-path=.../error.log
: エラーログファイルのパスを指定します。--http-log-path=.../access.log
: HTTPアクセスログファイルのパスを指定します。--with-http_ssl_module
: SSL/TLSモジュールを有効にします(HTTPSに必要)。--with-http_stub_status_module
: Nginxの基本的なステータス情報を表示するモジュールを有効にします。--with-http_realip_module
: クライアントの本当のIPアドレスを取得するモジュールを有効にします(プロキシ経由の場合)。--with-http_gzip_static_module
: 静的ファイルのgzip圧縮配信モジュールを有効にします。--add-module=../nginx-rtmp-module
: ここが重要です。RTMP Moduleのソースディレクトリを指定して、Nginxに組み込みます。パスはconfigure
スクリプトを実行しているディレクトリからの相対パスで指定します。
configure
スクリプトが正常に実行されると、ビルド設定が完了します。もし必要なライブラリが不足している場合はエラーが表示されるので、不足しているものをインストールして再度 configure
を実行してください。
設定が完了したら、以下のコマンドでコンパイルとインストールを実行します。
bash
make
sudo make install
make
コマンドはコンパイルを実行し、sudo make install
コマンドは指定したインストールディレクトリ(--prefix
で指定したパス)にコンパイル済みのファイルを配置します。
インストールの確認
インストールが完了したら、以下のコマンドでNginxのバージョン情報と configure オプションを確認します。RTMP Moduleが組み込まれていれば、configure arguments
の中に --add-module=../nginx-rtmp-module
(または指定したパス) が含まれているはずです。
bash
/usr/local/nginx/sbin/nginx -V
これで、RTMP Moduleが組み込まれたNginxがサーバーにインストールされました。
systemdサービスの作成(オプション、推奨)
Nginxをサービスとして管理できるように systemd
のサービスファイルを作成すると便利です。これにより、systemctl start nginx
, systemctl stop nginx
, systemctl restart nginx
, systemctl status nginx
といったコマンドでNginxを操作できるようになります。
/etc/systemd/system/nginx.service
のような名前でファイルを作成し、以下の内容を記述します(インストールパスは適宜修正してください)。
“`ini
[Unit]
Description=nginx – high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
“`
ファイルを保存したら、systemdに設定を読み込ませてサービスを有効化します。
bash
sudo systemctl daemon-reload
sudo systemctl enable nginx
これで sudo systemctl start nginx
でNginxを起動できるようになります。ただし、まだRTMPの設定をしていないため、この段階で起動してもWebサーバーとしては機能しますがRTMPサーバーとしては機能しません。
ステップ3: Nginx RTMP Moduleの設定
Nginx RTMP Moduleの設定は、Nginxのメイン設定ファイルである nginx.conf
に追記して行います。設定ファイルの場所は、configure
オプションの --conf-path
で指定したパスです(例: /etc/nginx/nginx.conf
)。
nginx.conf
ファイルを開き、既存の設定(http
ブロックなど)とは別に、最上位の階層(events
や http
と同じレベル)に rtmp
ブロックを新しく追加します。
“`nginx
nginx.conf の例
… 既存の http ブロックなど …
RTMPサーバー設定
rtmp {
# RTMPサーバー全体の設定
server {
# RTMPリスニングポート
listen 1935;
# ライブストリーミング設定
application live {
# ライブストリーミングを有効化
live on;
# 必要に応じてその他の設定を記述
# 例:視聴者からのアクセス制御
# allow publish 127.0.0.1; # サーバー自身からの配信のみ許可
# deny publish all; # 全てからの配信を拒否 (ただし下記allow playと組み合わせる意味は少ない)
# allow play all; # 全てからの視聴を許可 (デフォルト)
# deny play 192.168.1.0/24; # 特定ネットワークからの視聴を拒否
# 例:統計情報の有効化 (後述)
# stat on;
# 例:HLS/DASH変換設定 (後述)
# hls on;
# hls_path /tmp/hls;
# hls_fragment 5s;
# dash on;
# dash_path /tmp/dash;
# dash_fragment 5s;
}
# その他のアプリケーションブロックを定義することも可能
# application vod {
# play /var/www/html/vod; # VOD (Video On Demand) 用の設定
# }
}
# 複数のserverブロックを定義することも可能(例: 異なるポートで異なる設定)
# server {
# listen 1936;
# application private {
# live on;
# allow publish 192.168.1.100; # 特定IPからの配信のみ許可
# deny publish all;
# allow play 192.168.1.0/24; # 特定ネットワークからの視聴のみ許可
# deny play all;
# }
# }
}
“`
rtmp
ブロックの中には、一つ以上の server
ブロックを定義できます。各 server
ブロックは、特定のポートで待ち受けるRTMPサーバーの設定を記述します。
server
ブロック内の主なディレクティブ:
listen <port> [ssl];
: RTMPリクエストを待ち受けるポート番号を指定します。通常はRTMPの標準ポートである1935
を使用します。ssl
オプションを付けるとRTMPS (RTMP over SSL/TLS) になりますが、これには証明書の設定が必要です。chunk_size <size>;
: RTMPのチャンクサイズを指定します。デフォルトは4096バイトです。通常は変更する必要はありませんが、特定の状況でパフォーマンス調整のために変更することがあります。keepalive <timeout>;
: クライアントとのコネクション維持時間(秒)を指定します。
server
ブロックの中には、一つ以上の application
ブロックを定義できます。各 application
ブロックは、特定のアプリケーション名(ストリームキーのパスの最初の部分、例: rtmp://server_ip/live/stream_key
の /live
部分)に対する設定を記述します。これにより、異なる用途やアクセス制御を持つ複数のRTMPアプリケーションを同じサーバーでホストできます。
application
ブロック内の主なディレクティブ:
live on;
: このアプリケーションでライブストリーミングを有効にします。配信者がストリームをプッシュできるようになり、視聴者がそのストリームを再生できるようになります。live off;
: ライブストリーミングを無効にします。このアプリケーションでは配信や視聴はできません。play <path>;
: VOD (Video On Demand) として静的ファイルを配信する場合に、ファイルのあるディレクトリを指定します。この場合、配信者は不要で、指定したディレクトリ内のファイル名がストリームキーとして扱われます。allow publish <address> | all;
: 特定のIPアドレスまたはネットワークからの配信(Publish)を許可します。deny publish <address> | all;
: 特定のIPアドレスまたはネットワークからの配信を拒否します。allow
とdeny
は順に評価されます。通常はdeny all;
の後にallow publish <trusted_ip>;
のように記述します。allow play <address> | all;
: 特定のIPアドレスまたはネットワークからの視聴(Play)を許可します。deny play <address> | all;
: 特定のIPアドレスまたはネットワークからの視聴を拒否します。on_publish <url>;
: 配信者がストリームを開始したときに指定されたURLにHTTP POSTリクエストを送信します。これを利用して、認証、ストリームキーの検証、配信開始の記録などを行うことができます。on_play <url>;
: 視聴者がストリームの再生を開始したときに指定されたURLにHTTP POSTリクエストを送信します。視聴者の認証や視聴開始の記録などに利用できます。on_done <url>;
: 配信または視聴が終了したときに指定されたURLにHTTP POSTリクエストを送信します。push <url>;
: 受信したストリームを指定された別のRTMPサーバーに転送します。これにより、負荷分散やバックアップ、CDNへの転送などが実現できます。url
はrtmp://[host]:[port]/[application]/[stream_key]
の形式で指定します。push rtmp://backup.server/live/$name;
のように$name
変数を使うと、元のストリームキーを維持して転送できます。pull <url>;
: 指定された別のRTMPサーバーからストリームを取得し、このサーバーで再配信します。pull rtmp://origin.server/live/mystream;
のように指定します。exec <command>;
: ストリームの開始時などに外部コマンドを実行します。これを利用して、トランスコーディング(HLS/DASH変換など)や録画処理を行うことができます。
基本的なライブストリーミングサーバーとしては、以下の設定が最もシンプルです。
“`nginx
rtmp {
server {
listen 1935;
application live {
live on;
# 誰でも配信・視聴できる最も緩い設定
allow publish all;
allow play all;
}
}
}
“`
この設定では、サーバーのIPアドレスまたはドメイン名の1935番ポートでRTMPリクエストを受け付け、アプリケーション名が live
のストリームに対して、誰からの配信・視聴も許可します。
設定ファイルを編集したら、必ず設定の構文チェックを行います。
bash
/usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf
エラーが表示されなければ、設定は正しいです。警告が表示されることもありますが、致命的でない場合は無視できることもあります(内容による)。
Nginxの起動または再起動
設定を反映するには、Nginxを起動または再起動します。
“`bash
systemdを使用している場合
sudo systemctl start nginx # 初回起動時
sudo systemctl restart nginx # 設定変更時
sudo systemctl status nginx # 状態確認
systemdを使用していない場合や、手動での操作
sudo /usr/local/nginx/sbin/nginx # 初回起動時
sudo /usr/local/nginx/sbin/nginx -s reload # 設定変更時
sudo /usr/local/nginx/sbin/nginx -s stop # 停止時
“`
sudo systemctl status nginx
コマンドで active (running)
と表示されていれば、Nginxは正常に起動しています。エラーが出ている場合は、/var/log/nginx/error.log
ファイルを確認して原因を特定してください。
ステップ4: ライブストリーミングの配信テスト
Nginx RTMPサーバーが起動したら、エンコーダーソフトウェアを使って実際にストリームを送信してみましょう。ここでは、無料かつ高機能なOBS Studioを使った設定例を紹介します。FFmpegなどのコマンドラインツールを使うことも可能です。
OBS Studioの設定
- OBS Studioをインストール: 公式サイトからお使いのOSに合ったバージョンをダウンロードしてインストールします。
- 設定を開く: OBS Studioを起動し、「ファイル」メニューから「設定」を選択します。
- 「配信」タブを選択: 左側のリストから「配信」を選びます。
- サービスを設定:
- 「サービス」ドロップダウンリストから「カスタム…」を選択します。
-
サーバーとストリームキーを設定:
- サーバー: Nginx RTMPサーバーのURLを指定します。これは
rtmp://[サーバーのIPアドレスまたはドメイン名]/[アプリケーション名]
の形式になります。- 例:
rtmp://your_server_ip/live
(先ほどnginx.conf
で設定したapplication live
の場合)
- 例:
- ストリームキー: 任意の値(例:
my_stream_key_001
)を入力します。この値が、後で視聴者がストリームを再生する際のパスとして使われます。セキュリティ上、推測されにくい複雑な文字列にすることを推奨します。
- サーバー: Nginx RTMPサーバーのURLを指定します。これは
-
設定を保存: 「適用」をクリックし、「OK」をクリックして設定ウィンドウを閉じます。
- 配信の開始: OBS Studioのメインウィンドウに戻り、「配信開始」ボタンをクリックします。
OBS Studioの下部ステータスバーに接続状況や配信中の情報(CPU使用率、フレームレート、配信速度など)が表示されます。エラーが出ていなければ、ストリームはNginx RTMPサーバーに正常に送信されています。
もし接続できない場合は、以下の点を確認してください。
* サーバーのIPアドレスまたはドメイン名が正しいか。
* RTMPポート(デフォルト1935)が正しいか。
* NginxのRTMP設定で指定したアプリケーション名が正しいか (live
など)。
* サーバーのファイアウォールで1935/tcpポートが開放されているか。
* Nginxが正常に起動しているか (sudo systemctl status nginx
)。
* Nginxのエラーログ (/var/log/nginx/error.log
) にエラーが出ていないか。
ステップ5: ストリームの視聴テスト
配信が正常に行われていることを確認したら、次にそのストリームを視聴できるかテストします。RTMPストリームを再生できるプレイヤーソフトウェアが必要です。ここでは、多機能な無料メディアプレイヤーであるVLC Media Playerを使った方法を例に挙げます。FFplay (FFmpegに含まれるプレイヤー) や、Video.jsなどのRTMP対応JavaScriptライブラリを使ったWebプレイヤーでも視聴可能です。
VLC Media Playerでの視聴
- VLC Media Playerをインストール: 公式サイトからお使いのOSに合ったバージョンをダウンロードしてインストールします。
- VLCを起動: VLC Media Playerを起動します。
- ネットワークストリームを開く: 「メディア」メニューから「ネットワークストリームを開く…」を選択します。
-
ネットワークのURLを入力: 入力フィールドに、視聴したいRTMPストリームのURLを入力します。URLの形式は
rtmp://[サーバーのIPアドレスまたはドメイン名]/[アプリケーション名]/[ストリームキー]
になります。- 例:
rtmp://your_server_ip/live/my_stream_key_001
(OBSで設定したサーバー、アプリケーション名、ストリームキーの場合)
- 例:
-
再生: 「再生」ボタンをクリックします。
数秒待つと、OBS Studioから配信されている映像と音声がVLC Media Playerで表示されるはずです。
もし視聴できない場合は、以下の点を確認してください。
* 入力したURLが正しいか(IPアドレス、アプリケーション名、ストリームキー)。
* 配信が正常に行われているか(OBS Studioで配信中になっているか)。
* サーバーのファイアウォールで1935/tcpポートが開放されているか。
* NginxのRTMP設定で allow play all;
または特定のIPアドレスからの視聴が許可されているか。
* Nginxのエラーログ (/var/log/nginx/error.log
) にエラーが出ていないか。
これで、Nginx RTMP Moduleを使った基本的なRTMPライブストリーミングサーバーの構築、配信、視聴の一連の流れが完了しました。
高度な設定と応用
基本的な構築ができたら、より実用的な運用に向けて高度な設定や応用機能を組み込んでみましょう。
認証設定
前述の基本設定では、アプリケーション名とストリームキーが分かれば誰でも配信・視聴ができてしまいます。セキュリティを高めるために、認証設定を導入することを強く推奨します。Nginx RTMP Moduleはいくつかの認証方法を提供しています。
-
簡易認証 (allow/deny):
これはステップ3で既に触れたallow publish
/deny publish
およびallow play
/deny play
ディレクティブを使う方法です。IPアドレスやネットワーク単位でのアクセス制御が可能です。固定IPアドレスからの配信・視聴を許可したい場合に有効ですが、動的IPアドレスや不特定多数のユーザーを扱う場合には不向きです。 -
HTTPコールバック認証 (on_publish, on_play):
これが最も柔軟で一般的な認証方法です。配信者や視聴者が接続を試みた際に、Nginxが指定されたURLにHTTP POSTリクエストを送信し、そのレスポンスに基づいて接続を許可するかどうかを判断します。認証処理を独自のスクリプトやWebアプリケーションで行えるため、データベースと連携してユーザー認証を行ったり、ストリームキーを動的に生成・検証したりといった高度な制御が可能です。nginx.conf
でon_publish
およびon_play
ディレクティブを設定します。“`nginx
rtmp {
server {
listen 1935;
application live {
live on;# 配信開始時のコールバックURL on_publish http://localhost:8080/auth/publish; # 視聴開始時のコールバックURL on_play http://localhost:8080/auth/play; # デフォルトは全て拒否しておき、コールバックで許可されたもののみ通す deny publish all; deny play all; } }
}
“`この設定では、配信または視聴リクエストがあった際に、Nginxは
http://localhost:8080/auth/publish
またはhttp://localhost:8080/auth/play
に対してHTTP POSTリクエストを送信します。リクエストボディには、接続情報(ストリームキー、クライアントIPアドレスなど)が含まれます。HTTPコールバックを受け付けるサーバー側のスクリプトまたはアプリケーションを用意する必要があります。例えば、Node.js, Python (Flask/Django), PHPなどで簡単なWebサーバーを構築し、指定されたURLでPOSTリクエストを受け付けます。
コールバックを受け取ったサーバーは、リクエストに含まれる情報(特にストリームキー)を検証し、接続を許可する場合はHTTPステータスコード
200 OK
を返します。接続を拒否する場合は、401 Unauthorized
や404 Not Found
などのエラーコードを返します。例:PHPでの簡易認証スクリプト (
/var/www/html/auth/publish.php
)“`php
<?php
header(“Content-Type: text/plain”);// NginxからPOSTデータを受け取る
$stream_key = $_POST[‘name’]; // ストリームキーは ‘name’ パラメータで渡される// ここで認証ロジックを実装
// 例: データベースに登録された有効なストリームキーかチェック
$valid_keys = [‘my_stream_key_001’, ‘another_valid_key’];if (in_array($stream_key, $valid_keys)) {
// 認証成功:200 OKを返す
http_response_code(200);
echo “OK”;
} else {
// 認証失敗:401 Unauthorizedを返す
http_response_code(401);
echo “Unauthorized”;
}
?>
“`このPHPスクリプトをWebサーバー(NginxのHTTP機能やApacheなど)でホストし、Nginx RTMPモジュールの
on_publish
で指定します。on_play
でも同様の認証スクリプトを作成できます。これにより、許可されたストリームキーを持つユーザーのみが配信・視聴できるようになります。
HLS/DASHへのトランスコーディング
RTMPは多くのエンコーダーで使われますが、視聴には専用のRTMPプレイヤーが必要です。現代のWebブラウザはFlash Playerのサポートを終了しており、RTMPを直接再生することはできません。Webブラウザでライブストリーミングを視聴させるには、HTTPベースのストリーミング技術であるHLS (HTTP Live Streaming) や DASH (Dynamic Adaptive Streaming over HTTP) に変換するのが一般的です。
Nginx RTMP Moduleは、外部のトランスコーダーであるFFmpegと連携することで、受信したRTMPストリームをHLSやDASH形式にリアルタイムに変換して出力する機能を持っています。
まず、サーバーにFFmpegをインストールする必要があります。パッケージマネージャーでインストールできますが、特定のコーデックや機能が必要な場合はソースコードからビルドすることもあります。
Ubuntuの場合:
bash
sudo apt update
sudo apt install -y ffmpeg
CentOS/AlmaLinux/Rocky Linuxの場合:
bash
sudo dnf install -y ffmpeg
FFmpegがインストールされたら、nginx.conf
の application
ブロックにHLSやDASHに関する設定を追加します。exec
ディレクティブを使って、FFmpegコマンドを実行させるのが一般的な方法です。
HLS変換設定例:
“`nginx
rtmp {
server {
listen 1935;
application live {
live on;
# HLSを有効化
hls on;
# HLSセグメントファイルとプレイリストファイルを保存するディレクトリ
# Nginxのworkerプロセスが書き込み権限を持つ必要がある
hls_path /tmp/hls;
# HLSセグメントの長さ(秒)
hls_fragment 5s;
# HLSプレイリストに保持するセグメントの数
# これを超えると古いセグメントは削除される
hls_playlist_length 30s;
# HLSセグメントのキャッシュ時間を制御 (オプション)
# hls_nested on; # ネストされたディレクトリ構造にする場合 (推奨)
# FFmpegを使ってRTMPストリームをHLS対応のフォーマットに変換
# exec ffmpeg -i rtmp://localhost/$app/$name -c:v libx264 -preset fast -c:a aac -strict -2 -crf 20 -tune zerolatency -f flv rtmp://localhost/hls/$name; # 例: 再エンコード
# 受信したRTMPストリームをそのまま(コーデックを変更せず)HLSに変換する場合
exec /usr/bin/ffmpeg -i rtmp://localhost/$app/$name -c copy -map 0 -f segment -segment_time 5 -segment_format mpegts -segment_list_flags live -segment_list_size 10 -segment_list /tmp/hls/$name.m3u8 -segment_format mpegts /tmp/hls/$name-%05d.ts;
}
# FFmpegからの出力(HLSセグメント)を受け取るためのアプリケーション
# execで指定した rtmp://localhost/hls/$name のアプリケーション名と一致させる
application hls {
live on;
# このアプリケーションは視聴用ではないのでallow publishのみ許可
allow publish 127.0.0.1;
deny publish all;
allow play all;
}
}
# HTTPサーバー部分でHLSファイル(m3u8プレイリストとtsセグメント)を配信する設定
http {
server {
listen 80; # または適切なポート
location /hls {
# hls_pathで指定したディレクトリをルートとして設定
root /tmp/;
# クロスオリジンリソース共有を許可 (Webプレイヤーからアクセスするために必要)
add_header Access-Control-Allow-Origin *;
}
}
}
}
“`
FFmpegコマンド (exec
) の解説:
* -i rtmp://localhost/$app/$name
: 入力元として、同じNginxサーバーで受信したRTMPストリームを指定します。$app
と $name
はNginx RTMP Moduleの組み込み変数で、それぞれアプリケーション名とストリームキーに置き換わります。
* -c copy
: ビデオとオーディオのコーデックを変更せず、そのままコピーします。これが最も負荷が低い方法です。ただし、入力ストリームがHLSに適した形式(ビデオ: H.264/AVCまたはH.265/HEVC, オーディオ: AAC)である必要があります。そうでない場合は -c:v libx264 -c:a aac ...
のように再エンコードオプションを指定します。
* -map 0
: 入力ストリームの全てのトラック(ビデオ、オーディオなど)をコピーまたはエンコード対象とします。
* -f segment
: 出力フォーマットとしてセグメント形式を指定します。
* -segment_time 5
: セグメントファイルの長さを5秒に設定します。
* -segment_format mpegts
: セグメントのコンテナフォーマットをMPEG-TS (HLS標準) に設定します。
* -segment_list_flags live
: プレイリストをライブストリーミング用(末尾に追加され、古いものが削除される)として扱います。
* -segment_list_size 10
: プレイリストに含めるセグメントの数を10個に設定します。hls_playlist_length
と組み合わせて、プレイリストの長さを制御します (hls_playlist_length
が優先されることが多い)。
* -segment_list /tmp/hls/$name.m3u8
: マスタープレイリスト (.m3u8ファイル) のパスを指定します。
* /tmp/hls/$name-%05d.ts
: 出力されるセグメントファイル (.tsファイル) のパスと命名規則を指定します。%05d
は連番に置き換えられます。
HTTPサーバー設定 (http
ブロック):
HLS/DASHはHTTPで配信されるため、NginxのHTTPサーバー機能を使って /tmp/hls
や /tmp/dash
ディレクトリ以下のファイルを配信する必要があります。location
ディレクティブでHLS/DASHファイルへのアクセスパスを設定し、root
ディレクティブで実際のファイルパスを指定します。add_header Access-Control-Allow-Origin *;
は、異なるドメインのWebページからストリームを埋め込む際に必要となるCORS設定です。
HLSストリームは、HTTPサーバーのURL http://[サーバーIPまたはドメイン]/hls/[ストリームキー].m3u8
で視聴できるようになります。Webブラウザで再生するには、Video.js + videojs-contrib-hls プラグインのようなHLS対応のWebプレイヤーを使用します。
DASH変換も同様に設定できます。
DASH変換設定例:
“`nginx
rtmp {
server {
listen 1935;
application live {
live on;
# HLS設定と同時にDASH設定も可能
dash on;
dash_path /tmp/dash;
dash_fragment 5s;
# DASH MPD (Media Presentation Description) ファイルのパス
# dash_playlist_length 30s; # DASHでは通常playlist_lengthは使わない
# FFmpegを使ってRTMPストリームをDASH対応のフォーマットに変換
exec /usr/bin/ffmpeg -i rtmp://localhost/$app/$name -c copy -map 0 -f dash -seg_duration 5 -frag_duration 5 -adaptation_sets "id=0,streams=v;id=1,streams=a" /tmp/dash/$name.mpd;
}
# FFmpegからの出力(DASHセグメント)を受け取るアプリケーションは不要(HLSのように中間RTMPを通す必要がない)
}
http {
server {
listen 80;
location /dash {
root /tmp/;
add_header Access-Control-Allow-Origin *;
}
}
}
}
“`
FFmpeg DASHコマンドの解説:
* -f dash
: 出力フォーマットとしてDASHを指定します。
* -seg_duration 5
: セグメントの長さを5秒に設定します。
* -frag_duration 5
: フラグメントの長さを5秒に設定します(DASHではセグメント内にさらにフラグメントを設けることがあります)。
* -adaptation_sets "id=0,streams=v;id=1,streams=a"
: ストリームの構成を定義します。ここでは、ID 0にビデオストリーム(v)、ID 1にオーディオストリーム(a)を割り当てています。
* /tmp/dash/$name.mpd
: MPD (Media Presentation Description) ファイルのパスを指定します。
DASHストリームは、HTTPサーバーのURL http://[サーバーIPまたはドメイン名]/dash/[ストリームキー].mpd
で視聴できるようになります。Webブラウザで再生するには、DASH.jsのようなDASH対応のWebプレイヤーを使用します。
注意点: FFmpegを使ったトランスコーディングはCPUリソースを大量に消費します。特に複数のストリームを同時に変換する場合や、複数の解像度・ビットレートに変換する(Adaptive Bitrate Streaming, ABR)場合は、高性能なサーバーが必要になります。ABRを実現するには、複数の exec
ディレクティブを使って異なるエンコード設定で複数のRTMPストリームを出力し、それらをHLSやDASHに変換する設定が必要になります。これはより複雑な設定となるため、ここでは基本的な変換方法のみを扱いました。
統計情報モジュール (rtmp_stat
)
Nginx RTMP Moduleには、現在の接続数、配信中のストリーム情報、送受信バイト数などの統計情報を取得するためのモジュールが内蔵されています。この機能を使うには、nginx.conf
に設定を追加します。
“`nginx
rtmp {
# … server ブロックなど …
server {
listen 1935;
application live {
live on;
# stat on; # アプリケーションブロックで stat on を指定しても効果は限定的
}
}
# rtmp ブロック直下に stat ブロックを追加
stat {
# 統計情報ページをHTTPで提供する
# server ブロック内に location として設定
# rtmp と同じポートを使うことはできない
# 通常はNginxのhttpブロック内に設定する
}
}
http {
server {
listen 80; # 統計情報用のポート (HTTP)
location /stat {
# rtmp統計情報を有効化
rtmp_stat all;
# 認証が必要な場合
# auth_basic "Nginx RTMP Statistics";
# auth_basic_user_file /etc/nginx/.htpasswd; # htpasswdファイルを使う
}
}
# ... その他の http server ブロック ...
}
“`
rtmp
ブロック直下に stat {}
ブロックを追加し、さらに http
ブロック内の server
の中に、統計情報を提供するURLに対応する location
ブロックを作成します。location
ブロック内で rtmp_stat all;
ディレクティブを指定します。
設定を反映してNginxを再起動し、Webブラウザで http://[サーバーIPまたはドメイン]:[統計情報用HTTPポート]/stat
にアクセスすると、XML形式の統計情報が表示されます。
例: http://your_server_ip/stat
このXMLデータをパースして、独自の監視ツールやダッシュボードを作成することも可能です。
負荷分散とスケーリング
ライブストリーミングの負荷(特に視聴者数)は急激に変動することがあります。単一のサーバーでは対応しきれない場合、複数のRTMPサーバーを使って負荷を分散したり、コンテンツデリバリーネットワーク(CDN)を利用したりする必要があります。
- 複数のRTMPサーバー:
- Push/Pull: Nginx RTMP Moduleの
push
ディレクティブを使って、受信したストリームを他のRTMPサーバーに転送できます。配信者は1台のサーバー(オリジンサーバー)にプッシュし、オリジンサーバーが複数のエッジサーバーにストリームをプッシュまたはエッジサーバーがプルすることで、視聴者は負荷分散されたエッジサーバーから視聴できます。 - DNSラウンドロビン/ロードバランサー: 複数のRTMPサーバーを用意し、DNSラウンドロビンや専用のロードバランサーを使って、視聴者のリクエストを分散させる方法もあります。ただし、RTMPは永続的なコネクションを使用するため、HTTPのような単純なラウンドロビンでは効率的でない場合もあります。
- Push/Pull: Nginx RTMP Moduleの
- CDNの利用: Akamai, Cloudflare Stream, AWS Elemental MediaLive/MediaPackage/CloudFront, Google Cloud Media CDNなどの商用CDNサービスを利用するのが、最もスケーラブルで信頼性の高い方法です。オリジンサーバーとして構築したNginx RTMPサーバーに配信者がプッシュし、CDNがそのストリームを取り込んで世界中のエッジロケーションから視聴者に配信します。Nginx RTMPサーバーはCDNへのIngestポイントとして機能します。
これらの高度な構成は、Nginx RTMP Moduleの基本的な機能と組み合わせることで実現できます。
トラブルシューティング
構築中や運用中に発生しうる一般的なトラブルとその解決策をいくつか紹介します。
- Nginxが起動しない:
sudo systemctl status nginx
コマンドで状態を確認します。エラーメッセージが表示されているはずです。/var/log/nginx/error.log
ファイルを確認します。起動に関するエラーの詳細が記録されています。sudo /usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf
で設定ファイルの構文チェックを再度行います。- ポートの競合がないか確認します。他のプロセスが1935番ポートなどを使用していないか
sudo netstat -tulnp | grep 1935
コマンドなどで確認できます。
- エンコーダーが接続できない:
- サーバーのIPアドレスまたはドメイン名、ポート番号、アプリケーション名、ストリームキーが正しいか確認します。
- サーバーのファイアウォール(ufw, firewalld, AWSセキュリティグループなど)でRTMPポート(1935/tcp)が開放されているか確認します。
- NginxのRTMP設定で
allow publish all;
またはエンコーダーのIPアドレスからの配信が許可されているか確認します。deny publish all;
となっている場合は、許可設定を追加する必要があります。 on_publish
コールバックを使用している場合、コールバックURLが正しく、コールバックサーバーが起動しており、200 OK
を返しているか確認します。コールバックサーバーのログも確認します。- Nginxのアクセスログやエラーログを確認して、接続試行の記録やエラーが出ていないか確認します。
- プレイヤーで視聴できない:
- 視聴URL(
rtmp://[サーバーIP]/[アプリケーション名]/[ストリームキー]
または HLS/DASHのURL)が正しいか確認します。 - 配信が正常に行われているか確認します。エンコーダーがNginxに接続し、ストリームを送信している必要があります。
- サーバーのファイアウォールでRTMPポート(1935/tcp)またはHTTPポート(HLS/DASHの場合の80番など)が開放されているか確認します。
- NginxのRTMP設定で
allow play all;
または視聴者のIPアドレスからの視聴が許可されているか確認します。deny play all;
となっている場合は、許可設定を追加する必要があります。 on_play
コールバックを使用している場合、コールバックURLが正しく、コールバックサーバーが起動しており、200 OK
を返しているか確認します。- HLS/DASHを視聴している場合、FFmpegが正常に起動し、セグメントファイルやプレイリストファイルが
/tmp/hls
や/tmp/dash
ディレクトリに生成されているか確認します。FFmpegのログも確認します(exec
コマンドの出力先を指定することでログを確認できます)。 - Nginxのアクセスログやエラーログを確認して、視聴試行の記録やエラーが出ていないか確認します。HTTPアクセスログ (
/var/log/nginx/access.log
) でHLS/DASHファイルのアクセス状況を確認するのも有効です。
- 視聴URL(
- ストリームが不安定・遅延が大きい:
- サーバーのCPU、メモリ、ネットワーク帯域幅に余裕があるか確認します。
top
,htop
,iftop
などのコマンドやクラウドプロバイダーの監視ツールを利用します。 - エンコーダーの設定(ビットレート、解像度、フレームレート、キーフレーム間隔、presetなど)がサーバーのスペックやネットワーク帯域幅に見合っているか確認します。
- Nginx RTMP Moduleの設定(
chunk_size
,keepalive
など)を見直すことで改善する場合がありますが、多くの場合、サーバーリソースやネットワークの問題が原因です。 - FFmpegでトランスコーディングを行っている場合、FFmpegプロセスが大量のCPUリソースを消費していないか確認します。
exec
コマンドのFFmpegオプションを調整(例:-preset fast
,-tune zerolatency
など)することで改善されることがあります。
- サーバーのCPU、メモリ、ネットワーク帯域幅に余裕があるか確認します。
セキュリティに関する考慮事項
RTMPサーバーをインターネットに公開する場合、セキュリティには特に注意が必要です。
- ファイアウォール設定: ステップ1で述べたように、RTMPポート(1935)とHTTPポート(Webサーバーとして使う場合、統計情報、HLS/DASH配信ポートなど)以外は基本的に外部からのアクセスを拒否します。SSHポートも特定のIPアドレスからのみ許可するなど制限を強化します。
- ストリームキーの管理: ストリームキーは、配信者がどのストリームにプッシュするか、視聴者がどのストリームを再生するかを識別するための重要な情報です。簡易認証やHTTPコールバック認証を導入しない場合、ストリームキーが漏洩すると誰でも勝手に配信したり視聴したりできてしまいます。推測されにくい複雑な文字列を使用し、定期的に変更することを検討します。
- 認証設定の導入: 前述のHTTPコールバック認証を導入することで、正規のユーザー(配信者や視聴者)のみがアクセスできるように制限できます。
- Nginxのセキュリティパッチ適用: Nginx本体や使用しているライブラリ(OpenSSLなど)にセキュリティ上の脆弱性が見つかることがあります。定期的にOSのパッケージアップデートを実行したり、Nginxを最新バージョンにビルドし直したりして、常に最新のセキュリティパッチを適用しておくことが重要です。
- アクセスログ、エラーログの監視: 不正なアクセス試行やエラーが発生していないか、定期的にログファイルを確認します。異常なパターンが見られる場合は、ファイアウォール設定や認証設定を見直します。
まとめ
この記事では、Nginx RTMP Moduleを使ってRTMPライブストリーミングサーバーをゼロから構築するための詳細な手順を解説しました。OSの準備から始まり、NginxとRTMP Moduleのソースビルド、設定ファイルの記述、配信・視聴テスト、さらに認証設定やHLS/DASH変換といった応用的な機能、そしてトラブルシューティングやセキュリティについても触れました。
Nginx RTMP Moduleは、オープンソースでありながら非常に高機能で柔軟なRTMPサーバーを構築できる強力なツールです。基本的な設定でシンプルなライブストリーミングサーバーとして機能させることも、FFmpegや独自の認証システムと連携させて複雑なライブ配信プラットフォームの一部として組み込むことも可能です。
ただし、RTMPプロトコル自体はFlash Playerの終焉とともにWebブラウザでの直接再生の主流からは外れつつあります。しかし、前述の通りライブ配信の「取り込み(Ingest)」プロトコルとしては依然として広く使われています。また、HLSやDASHといったHTTPベースのストリーミング形式への変換元としても重要です。
今回構築したRTMPサーバーを基盤として、さらなる機能拡張(例えば、録画機能、Adaptive Bitrate Streaming対応、DVR機能など)や、より堅牢な運用体制(監視、アラート、自動スケーリングなど)を構築していくことができます。
この記事が、あなたがライブストリーミング技術を理解し、自分自身の配信環境を構築する一助となれば幸いです。
免責事項: この記事は技術解説を目的としており、セキュリティやパフォーマンスに関する完全な保証をするものではありません。実際の運用にあたっては、利用環境や目的に応じて適切な設計、設定、セキュリティ対策、テスト、監視を行ってください。また、Nginx RTMP ModuleやFFmpegのバージョン、OS環境によっては設定やコマンドが異なる場合があります。最新の公式ドキュメントも併せてご確認ください。
これで、約5000語の詳細な記事が完成しました。各セクションでコマンド例や設定例を具体的に示し、応用的な内容やトラブルシューティング、セキュリティにも触れることで、網羅的な情報を提供できたかと思います。