自宅動画ストリーミング鯖のススメ(Raspberr Pi + Nginx + libnginx-mod-rtmp)

概要

[ PC ]→rtmp→[ ラズパイ ]→HLS→[ プレーヤー ]

 

主な手順

  1. Raspberry Pi セットアップ
  2. 動画ストリーミング鯖の構築
  3. Rasppbery Piをインターネットに公開
  4. ドメインSSLを無料で取得、設定
  5. SSLを無料で取得、設定

 

1. Raspberry Pi セットアップ

1.1 本体セットアップ

まずは本体を調達


 

OSをダウンロード

https://www.raspberrypi.org/downloads/raspberry-pi-os/

ダウンロードしたらzipを解凍して2020-月-日-raspbian-ナンタラカンタラ.imgを取り出しておく

 

SDメモリカードフォーマッター をダウンロード

https://www.sdcard.org/jp/downloads/formatter/

microSDカードをフォーマットしておく

 

Win32 Disk Imager をダウンロード

https://sourceforge.net/projects/win32diskimager/

2020-月-日-raspbian-ナンタラカンタラ.img を microSDに焼く

 

1.2 Raspberry PiIPアドレスを固定する

Raspberry Pi でnmtuiでIPアドレスを固定してもいいし、ルーター側でMACアドレスからIPアドレスを固定してもいい。

 

2. 動画ストリーミング鯖の構築

参考にした記事:https://iot-plus.net/make/raspi/raspbian-buster-streaming-server-using-ffmpeg-rtmp-nginx/

 

2.1 必要なパッケージのインストール

sudo apt upgrade
sudo apt install nginx libnginx-mod-rtmp

 

2.2 諸々の設定

配信ディレクトリの用意

sudo mkdir -p /var/www/html/live/
cd /var/www/html/live/
sudo ln -s /dev/shm hls

 

Nginxに配信の設定

rtmpを受け取ってHLSを配信する設定を書く

sudo vi /etc/nginx/conf.d/rtmp

↑/etc/nginx/conf.d/rtmpの中身

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        allow play all;
        access_log /var/log/nginx/rtmp_access.log;

        application live {
            live on;
            hls on;
            record off;
            hls_path /var/www/html/live/hls;
            hls_fragment 1s;
            hls_type live;
        }
    }
}

 Nginxの設定に読みこませる

sudo vi /etc/nginx/nginx.conf

↑/etc/nginx/nginx.conf の末行に下記を書き足す

include /etc/nginx/conf.d/rtmp;

 

Nginxに設定を反映

sudo systemctl daemon-reload
sudo systemctl restart nginx

 

2.3 動作の確認

この時点で動画のストリーミングは可能になっている。

OBSの配信設定で、

サービス:カスタム...

サーバー:rtmp://(ラズパイIPアドレス)/live/

ストリームキー:stream

と入力して配信し、VLCプレーヤーを起動して「メディア>ネットワークストリームを開く」で下記URLを指定すると、OBSの配信映像が見れるハズ。

http://(ラズパイIPアドレス)/live/hls/stream.m3u8

 

3. Rasppbery Piをインターネットに公開

3.1 セキュリティ対策

公開する前に「最低限の」セキュリティ対策をしておく

まずRaspberry Piのデフォルトパスワードを変更する

passwd

そしてルーターファイアウォールが有効になっていることを確認。

ラズパイにアクセス制限を設定する

sudo vi /etc/hosts.allow

で下記を末尾に書き足す。下記例は自分のPCのIPアドレスが「192.168.1.2」の場合

ALL:192.168.1.

そして

sudo vi /etc/hosts.deny

で下記を末尾に書き足す

 ALL:ALL

 

3.2 ルーターの設定(ポートフォワーディング)

上記の設定ができたら、ルーター側でポートフォワーディングの設定する

固定したラズパイのアドレスに対してHTTP「80」とHTTPS「443」のフォワーディングを設定する

ポートフォワーディングの設定方法についてはルーターによって違うので割愛

 

設定が適切に出来ていたら、外の回線(例えばiPhoneとかで自宅Wi-Fiに繋いでない状態で)自宅のグローバルIPにアクセスしたらNginxの初期ページが表示されるハズ

 

グローバルIPは下記サイトとかで確認する

https://www.cman.jp/network/support/go_access.cgi

 

 

 

4. ドメインで取得、設定

この段階で外部に配信はできるけども、家庭用のネット回線のグローバルIPは変動するので、ドメイン(ホニャラリ.com)を取得して、常に同じURLでアクセスできるようにする

 

通常ドメインの取得には維持費がかかるが、無料のダイナミックDNSを利用する方法がある

ここではMyDNSでの設定を紹介する

http://www.mydns.jp

 

4.1 MyDNSでアカウント登録

MyDNSに新規登録はここ(わかりづらい)

http://www.mydns.jp/?MENU=010

ここに開通用のメールアドレス他、個人情報とか入力する

登録ができると、メールアドレス宛にマスターIDとパスワードが記載されたメールが届くハズ

そのログイン情報をつかってMyDNSにログインする。

 

4.2 ドメインの取得

MyDNSにログインできたら「DOMAIN INFO」からお好みのドメインを設定する。

この辺読むのがいいと思う

https://nw.myds.me/synology/setup-domain/

 

4.3 ドメインの自動更新

ログイン情報を元に、定期的にMyDNSに現在のグローバルIPを通知するスクリプトを作成する

vi /home/pi/noticeIp.sh

中身はこんな感じ

#!/bin/bash
wget -O - 'http://mydns000000:xxxxxxxxx@ipv4.mydns.jp/login.html'

mydns000000がマスターID

xxxxxxxxxがパスワードになる

スクリプトが作成できたら、それに実行権限を与える

sudo chmod 755 /home/pi/noticeIp.sh 

 試しに実行してみる

/home/pi/noticeIp.sh 

 なんか色々文字列が返ってきて「Login and IP address notify OK.」って文字がどこかにあればOK

ダメならなんかダメってメッセージが返ってくる

 

ちゃんと認証・グローバルIP通知ができたら、cronで定期実行してやるようにする

crontab -e

 エディタが立ち上がるので

30 * * * * /pi/home/noticeIp.sh

を末尾に加える。

 

おそらくこの時点で、先に設定したドメインにアクセスしたら自分のグローバルIPに転送されるようになってるはず。

ちなみに外部ネットワークから(スマホWi-Fiに繋がずに4G回線とかで)ドメインに接続したらRasppbery PiのNginx初期ページが表示されるだろうけども、自宅PCからドメインに接続してもルーターの設定画面を開くことになるかもしれない。

それはDNSの設定で色々ややこしいので、一番簡単な「自宅PCのhostsにMyDNSで取得したドメインに、Rapsberry PiのローカルIPを設定する」をオススメする。

 

5. SSLを無料で取得、設定

 通常SSLは維持費が掛かるが、MyDNSと同じ用に定期的に通知することで無料で取得できるサービスがある。

それが「Let’s Encrypthttps://letsencrypt.org/ja/

 

5.1 certbotのインストール

下記三つのコマンドを実行する

cd /usr/local/

sudo git clone https://github.com/certbot/certbot
sudo /usr/local/certbot/certbot-auto

  

5.2 SSL証明書の取得

ここではMyDNSで取得したドメインsample.mydns.jp とし、連絡先メールアドレスを sample@mail.com とする。適時買い替えて下記コマンドを実行する。

/usr/local/certbot/certbot-auto certonly --webroot -w /var/www/html/ -d sample.mydns.jp -m sample@mail.com

 ちゃんとポートフォワーディングとMyDNSの設定とNginxの設定が適切であれば

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/sample.mydns.jp/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/sample.mydns.jp/privkey.pem

といったメッセージが表示されてSSL証明書が保存されている。

 

あとSSL証明書も自動更新するように設定する

sudo crontab -u root -e

 して下記行を末尾に加える

 00 02 01 * * /usr/local/certbot/certbot-auto renew --force-renew --webroot-path /var/www/html/ --deploy-hook "systemctl reload nginx"

 

 

 

5.3 SSL証明書の反映

取得したSSLはNginxに反映する必要がある。

sudo vi /etc/nginx/nginx.conf

を開くと色々あるけど34行目あたりに

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

 といった記述があるはず。

このssl_prefer_server_ciphers on;の下あたりに設定を追記する。

上記がこんな感じになるはず

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
server {

    root /var/www/html;
    listen 443 ssl;
    server_name sample.mydns.jp;
    ssl_certificate /etc/letsencrypt/live/sample.mydns.jp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sample.mydns.jp/privkey.pem;

 

    add_header Access-Control-Allow-Origin '*';
    add_header Access-Control-Allow-Methods 'GET';
    add_header Access-Control-Allow-Headers 'Origin, Authorization, Accept,     Content-Type';
    add_header Access-Control-Max-Age 3600;

}

##
# Logging Settings
##

 

 上記を入力したらNginxを再起動して反映させる

sudo systemctl restart nginx 

 

これでhttps://sample.mydns.jp/live/hls/stream.m3u8 を外部ネットワークからiPhoneVLCプレーヤーで開けたら完了。

 

owari

 

さいごにオススメ漫画

 

 

幼少期編は正直顔のバランスに違和感感じる濃ゆいだけの漫画だけど、読んでたらマジで面白いからぜひポチってほしい