自宅動画ストリーミング鯖のススメ(Raspberr Pi + Nginx + libnginx-mod-rtmp)
概要
[ PC ]→rtmp→[ ラズパイ ]→HLS→[ プレーヤー ]
主な手順
- Raspberry Pi セットアップ
- 動画ストリーミング鯖の構築
- Rasppbery Piをインターネットに公開
- ドメイン・SSLを無料で取得、設定
- 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 Pi のIPアドレスを固定する
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
上記の設定ができたら、ルーター側でポートフォワーディングの設定する
固定したラズパイのアドレスに対して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での設定を紹介する
4.1 MyDNSでアカウント登録
MyDNSに新規登録はここ(わかりづらい)
ここに開通用のメールアドレス他、個人情報とか入力する
登録ができると、メールアドレス宛にマスター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 Encrypt」https://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 を外部ネットワークからiPhoneやVLCプレーヤーで開けたら完了。
owari
さいごにオススメ漫画
幼少期編は正直顔のバランスに違和感感じる濃ゆいだけの漫画だけど、読んでたらマジで面白いからぜひポチってほしい