ストリーミングサーバーの構築:1 本のアップロードで視聴者は何人でも

公開日 読了時間 17 分

サーバーへ送るストリームは 1 本だけで、そのサーバーがすべての視聴者に配信します。視聴者が 10 人でも 1,000 人でも、自分の回線が運ぶのは常にアップロード 1 本だけです。本記事では構成、プロトコル、その背後にある帯域の計算を解説します。

自前のサーバーを使わずに配信すると、映像は視聴者 1 人ずつに個別に送られます。視聴者が 10 人なら同じデータを 10 回、100 人なら 100 回送ることになります。自宅やオフィスのアップロードは視聴者が数人増えただけで詰まり、パソコンには余裕があるのに映像が途切れ始めます。

ストリーミングサーバーはこれを逆にします。サーバーへ送るストリームはちょうど 1 本だけで、そのサーバーがすべての視聴者に配信します。これにより、自分の回線が運ぶのは常にアップロード 1 本だけになり、視聴者が 10 人でも 1 万人でもまったく変わりません。本記事では、なぜこの仕組みがこれほどうまく働くのか、そうしたサーバーをどう構築するのか、どのプロトコルがどれだけの遅延を伴うのか、そして実際にどれだけのトラフィックが発生するのかを解説します。

問題:アップロードがボトルネックになる

映像は途切れることのない流れです。1080p で 1 秒あたり 60 フレームのストリームは、内容によって 4.5 から 8 Mbit/s、720p なら 3 から 5 Mbit/s を必要とします。このビットレートが視聴者 1 人ごとに、配信中ずっと、休みなく流れます。

ドイツの平均的な家庭用回線のアップロードは 10 から 50 Mbit/s で、光回線でもアップロードは 50 から 100 Mbit/s にとどまるものが多くあります。そのため計算はすぐに行き詰まります。

視聴者3 Mbit/s の場合6 Mbit/s の場合家庭用回線で足りるか
515 Mbit/s30 Mbit/sぎりぎり
2060 Mbit/s120 Mbit/sいいえ
100300 Mbit/s600 Mbit/sいいえ
10003 Gbit/s6 Gbit/sいいえ

さらに、見落とされがちな 2 つ目の問題があります。お使いの回線は、家庭やオフィスのほかのすべての通信とこの帯域を分け合っています。誰かが大きなファイルをアップロードしたり、バックアップが走り出したりすれば、その瞬間にストリームは崩れます。データセンターのサーバーにこの問題はなく、回線は自分だけのものです。

仕組み:1 回送って、何度でも配る

構成は 3 つの部分からできています。

  • 送信側、つまり OBS、ffmpeg、ハードウェアエンコーダーが、ストリームをサーバーへ送ります。これをインジェストと呼びます。
  • サーバーはこの 1 本のストリームを受け取り、目的の配信形式に変換して待機させます。
  • 視聴者はサーバーからストリームを受け取ります。これをエグレスと呼び、視聴者数に応じて増えていく部分です。

決定的なのは非対称性です。自分からサーバーまでの経路は1 回だけ通りますが、サーバーから視聴者までの経路は何千回も通ります。だからこそ、自分の回線に必要なアップロードはストリーム 1 本分だけで、サーバーには視聴者数に見合う回線が必要になります。

実際に発生するトラフィック量

帯域は計算の半分にすぎません。より重要なのは転送量です。多くの事業者はこれを基準に課金するからです。式は単純です。

GB 単位の転送量 = Mbit/s 単位のビットレート × 秒数 × 視聴者数 ÷ 8000

現実的な例をいくつか挙げます。

シナリオビットレート時間視聴者転送量
週 1 回の講演3 Mbit/s2 時間50135 GB
毎日の配信6 Mbit/s3 時間2001 日あたり 1.6 TB
24 時間稼働のチャンネル4 Mbit/s24 時間301 日あたり 1.3 TB
一度だけの大規模イベント6 Mbit/s4 時間200021.6 TB

最後の列の数字は、ストリーミングと従量課金が相性の悪い理由そのものです。来場の多い配信が 1 回あるだけで 1 か月分の無料枠を使い切ることがあり、そこから先は 1 TB ごとに追加で請求されます。無制限トラフィックのプランなら、この計算は完全に不要です。回線を 200 GB 通ろうと 50 TB 通ろうと、月額は変わりません。

どのソフトウェアが向いているか

ソフトウェア強み向いている用途
nginx と RTMP モジュール軽量で安定、RTMP と HLS を同時に扱える定番の入り口、プラットフォームへの転送
MediaMTXバイナリ 1 つで完結、SRT と WebRTC を標準搭載手間をかけずに低遅延
SRS機能が非常に多く、クラスタ構成にも対応複数ノードの大きな構成
OwncastWeb 画面とチャットを備えたオールインワン自分の小さな配信サイト

最初に選ぶなら、nginx と RTMP モジュールが最も自然です。どこでも入手でき、資料も豊富で、同じサーバーを後から手を加えることなく視聴ページ用の Web サーバーとしても使えます。

nginx と RTMP でストリーミングサーバーを構築する

インストールする

Debian と Ubuntu では、パッケージ libnginx-mod-rtmp にモジュールが含まれているので、自分でビルドする必要はありません。

apt update
apt install -y nginx libnginx-mod-rtmp ffmpeg

AlmaLinux と Rocky Linux では、モジュールは EPEL リポジトリから入ります。

dnf install -y epel-release
dnf install -y nginx nginx-mod-rtmp ffmpeg

設定する

RTMP の設定は nginx.conf の http ブロックの外側に書きます。ここが最初につまずく点として最も多いところです。動作する最小構成は次のとおりです。

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            # 通常の視聴者向けの HLS
            hls on;
            hls_path /var/www/stream/hls;
            hls_fragment 2s;
            hls_playlist_length 12s;

            # 配信は自分のアドレスからのみ許可する
            allow publish 203.0.113.10;
            deny publish all;

            # 視聴は誰でもできる
            allow play all;
        }
    }
}

HLS のファイルは、その後は通常の Web サーバーが配信します。そのためには http 側に小さなブロックを置くだけで足ります。

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

    location /hls {
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        root /var/www/stream;
        add_header Cache-Control no-cache;
        add_header Access-Control-Allow-Origin *;
    }
}

ディレクトリを作成し、設定を検証して、再読み込みします。

mkdir -p /var/www/stream/hls
chown -R www-data:www-data /var/www/stream
nginx -t && systemctl reload nginx

ポートを開放する

RTMP はポート 1935 を、配信は 80 と 443 を使います。nftables または ufw では次のようにします。

ufw allow from 203.0.113.10 to any port 1935 proto tcp
ufw allow 80/tcp
ufw allow 443/tcp

1 行目に注意してください。配信用のポートは自分のアドレスだけに開いています。世界に開いた RTMP ポートは、アドレス帯が丸ごと自動的に調べられているため数日のうちに見つかり、そうなると他人が自分の回線を使って配信を始めます。

OBS から配信する

OBS の設定、配信の順に開き、サービスに「カスタム」を指定します。

項目値
サーバーrtmp://stream.example.com/live
ストリームキー自分で決めた名前、たとえば kanal1

「出力」でビットレートを設定します。目安は、1080p60 で 6000 kbit/s、1080p30 で 4500 kbit/s、720p30 で 3000 kbit/s です。キーフレーム間隔は 2 秒にしてください。そうしないと HLS のセグメント長が不均一になり、切り替えのときにプレーヤーが引っかかります。

視聴する

ストリームはその後 https://stream.example.com/hls/kanal1.m3u8 に置かれ、HLS に対応したどのプレーヤーでも開けます。ブラウザーなら hls.js や Video.js などです。手早く確認するだけなら、VLC の「ネットワークストリームを開く」で足ります。

複数のプラットフォームへ同時に配信する

これが自前のサーバーの 2 つ目の大きな利点です。3 本のアップロードを並行させて自分の回線を破裂させる代わりに、サーバーへ 1 回送り、そこから先を配り分けます。そのために application ブロックへ配信先ごとに 1 行を追加します。

application live {
    live on;
    record off;

    push rtmp://live.plattform-a.example/app/STREAM_KEY;
    push rtmp://live.plattform-b.example/app/STREAM_KEY;
}

このときアップロードはストリーム 1 本のままです。複製を担うのはサーバーで、サーバーにとって帯域はまさに本来の役目です。

遅延:どのプロトコルを何に使うか

遅延はほぼすべて配信側で生まれ、送信側では生まれません。多くの人が見当違いの場所を探すので、ここを理解しておくことが大切です。

配信方式遅延向いている用途
HLS、初期設定20 から 30 秒講演、礼拝、賭けのないスポーツ
セグメントを短くした HLS6 から 10 秒一般的な折り合い
Low-Latency HLS2 から 5 秒チャット付きの配信
SRT1 秒未満拠点間の伝送
WebRTC0.5 秒未満対話、オークション、遠隔操作

遅延が小さくなるほど、視聴者 1 人あたりの費用は上がります。HLS は単純なファイルの集まりで、どの Web サーバーもどのキャッシュも配信できるため、最も安く済みます。一方 WebRTC は視聴者ごとに専用の接続を維持するため、処理能力の消費がはるかに大きくなります。低遅延は本当に必要な場面だけで採用してください。

トランスコード:どこから見合うか

サーバーがストリームをそのまま中継しているだけなら、処理能力はほとんど要りません。この方式なら最新の 1 コアで数百人の視聴者に対応でき、ボトルネックは回線だけです。

回線の弱い視聴者も見られるように複数の画質を用意し始めると、状況が変わります。画質の段階が増えるたびに、その分の計算が必要になります。

ffmpeg -i rtmp://127.0.0.1/live/kanal1 \
  -c:v libx264 -preset veryfast -b:v 3000k -s 1280x720 -c:a copy -f flv rtmp://127.0.0.1/live/kanal1_720 \
  -c:v libx264 -preset veryfast -b:v 1200k -s 854x480  -c:a copy -f flv rtmp://127.0.0.1/live/kanal1_480

1 段階あたり 2 から 4 コアを見込んでください。3 段階なら、それだけで 8 から 12 コアを常に占有します。だからこそ、本当に必要かをよく考えてください。パソコンや Wi-Fi で見る人が大半の視聴者層なら、よく選んだ 1 段階だけで足りることも多くあります。

対策:誰が配信できるか

ストリーミングサーバーは外から見えるので、必ず見つけられます。日常の運用なら 3 つの対策で足ります。

  • 配信用ポートのファイアウォール。1935 に到達できるのは自分のアドレスだけにします。自分のアドレスが変わる環境なら、代わりにサーバーへの VPN 接続を使ってください。
  • ストリームキーの検証。on_publish を使うと、配信が試みられるたびに nginx が小さなスクリプトを呼び出し、キーを一覧と照合して、一致しなければ拒否します。
  • 過負荷に対する基本的な保護。ストリーミングサーバーは停止がすぐ目に見えるため、狙われやすい対象です。KernelHost では 3.2 Tbps の処理能力を持つフラッド対策がすべてのサーバーに入っており、自分で設定する必要はありません。詳しくは DDoS 対策のページをご覧ください。

設置場所の選び方と複数台の構成

サーバーを置くべきなのは自分の近くではなく、視聴者の近くです。自分からサーバーへの接続は一度確立すれば、大陸の半分を越えても安定して流れ続けます。一方、視聴者への接続は読み込み時間と離脱率を左右します。

視聴者の大半がヨーロッパにいるなら、ドイツの拠点が正解です。複数の大陸に分かれているなら、2 台目のサーバーと DNS による振り分けが見合い、各視聴者は最も近い拠点にたどり着きます。KernelHost はそのためにドイツ、米国西海岸、米国東海岸、シンガポール、韓国に拠点を用意しています。一覧はサーバー拠点でご確認いただけます。

配信するのが生の映像ではなくファイル、つまり更新データ、画像、動画アーカイブである場合は、適した道具はストリーミングサーバーではなく、その前に置くキャッシュです。その仕組みは記事「自前の CDN サーバーを構築する」で解説しています。

どのサーバーが向いているか

ストリーミングサーバーでは、Web サーバーとは重要度の順序が違います。

  1. 回線とトラフィック。ここが常にボトルネックです。絞られていない本物のギガビット回線は、6 Mbit/s で約 160 人の視聴者を支えます。
  2. 無制限トラフィック。従量課金のプランはストリーミングではほとんど見積もれません。盛り上がった夜が 1 回あるだけで 1 か月分の転送量を使い切るからです。
  3. CPU。トランスコードをしない限り二番目の問題です。トランスコードを始めると、ここが 2 つ目のボトルネックになります。
  4. RAM とディスク。最も影響が小さい部分です。録画を残すようになって初めて、ディスク容量が課題になります。

まさにこの用途に合わせているのが、当社の無制限トラフィックのルートサーバーです。1 台ごとに実測の 2 × 1 Gbit/s 回線、絞りのない無制限の転送量、転送した量に左右されない固定の月額、そして 3.2 Tbps のフラッド対策を標準で備えています。サーバーは 30 秒未満で用意され、完全な root 権限、IPv4、/64 の IPv6 ネットワークが付きます。料金はプリペイド方式で月単位の解約ができるので、小さなプランから始めて、視聴者が増えたら合わせて大きくできます。

よくあるご質問

そもそもなぜストリーミングサーバーが必要なのですか?
サーバーがないと、お使いのパソコンがストリームを視聴者 1 人ずつに個別に送ることになります。視聴者 10 人で 6 Mbit/s なら、アップロードは 60 Mbit/s、100 人なら 600 Mbit/s です。一般的な家庭用回線のアップロードは 10 から 50 Mbit/s しかありません。ストリーミングサーバーがあれば、送信はちょうど 1 回だけで、配信はサーバーが引き受けます。
サーバーにはどれくらいの帯域が必要ですか?
ビットレートに同時視聴者数を掛けてください。6 Mbit/s で 500 人なら 3 Gbit/s です。ただしピーク値よりも重要なのは月間の転送量です。同じ 500 人でも、2 時間で約 2.7 TB になります。ストリーミングで決定的な条件が CPU ではなく無制限トラフィックなのは、このためです。
ソフトウェアは何を選べばよいですか?
最初は nginx と RTMP モジュールの組み合わせが向いています。軽量で、RTMP と HLS を同時に扱えるからです。MediaMTX はより新しい選択肢で、SRT と WebRTC を標準で備えています。SRS は機能が最も豊富ですが、習得に手間がかかります。Owncast は Web 画面とチャットを備えたオールインワンです。
遅延はどれくらいですか?
サーバーへ送る RTMP の遅延は 1 秒未満です。遅延のほとんどは配信側で生まれます。HLS は初期設定で 20 から 30 秒、セグメントを短くすれば 6 から 10 秒、Low-Latency HLS では 2 から 5 秒です。SRT と WebRTC は 1 秒未満になりますが、視聴者 1 人あたりの処理能力はその分多く必要になります。
トランスコードは必要ですか。費用はどれくらいかかりますか?
複数の画質を用意したい場合だけ必要です。変換せずにそのまま中継するだけなら CPU はほとんど使わず、1 コアで数百人の視聴者に対応できます。1080p のストリームに加えて 720p と 480p も出力するなら、画質 1 段階あたり最新の CPU コアが 2 から 4 個必要です。トランスコードは本当に必要になってから計画してください。
Twitch と YouTube へ同時に配信できますか?
はい、サーバーが得意とするのはまさにその用途です。自分のサーバーへ 1 回送れば、サーバーが同じストリームをいくつものプラットフォームへ転送します。nginx-RTMP なら、配信先ごとに push の行を 1 行書くだけで足ります。それでも自分の回線が運ぶのはアップロード 1 本だけです。
第三者が自分のサーバーへ配信するのを防ぐには?
ファイアウォールで取り込み用のポートを自分のアドレスだけに制限し、さらに on_publish でストリームキーを検証してください。どちらも行わないと、アドレス帯が丸ごとスキャンされているため、開いたままの RTMP サーバーは数日のうちに他人のストリームを載せられます。
サーバーはどこに置くべきですか?
自分の近くではなく、視聴者の近くです。自分からサーバーまでの経路は 1 回だけ通りますが、サーバーから視聴者までの経路は何千回も通ります。視聴者がヨーロッパにいるなら、サーバーもヨーロッパに置きます。視聴者が複数の大陸に分かれている場合は、2 台目のサーバーと DNS による振り分けが見合います。
VPS で足りますか、それとも専用サーバーが必要ですか?
トランスコードなしの中継だけなら、コア数の少ない VPS でも問題なく足ります。ボトルネックは回線であって処理能力ではありません。複数画質のトランスコードや、多数のチャンネルを並行して扱う場合に初めて、専用ハードウェアが見合うようになります。
サーバーが負荷に耐えられるかはどうテストしますか?
ストリームを開始し、複数のツールで同時に受信してください。たとえば ffmpeg を出力なしで動かす方法があります。その間、ネットワークのスループットと使用率を観察します。CPU が温まる前に回線の上限へ達したなら計算どおりで、必要なのはコア数ではなく帯域です。

Streaming RTMP HLS SRT nginx OBS Restream Unlimited Traffic