nginx + RTMPモジュールによるライブストリーミング（統計とロギング）


![スクリーンショット 2016-05-04 16.20.08.png](https://qiita-image-store.s3.amazonaws.com/0/92038/e0a4feda-4aad-cb32-c874-4289b6ded8e9.png "スクリーンショット 2016-05-04 16.20.08.png")

nginx + RTMPモジュールによるライブストリーミングは事例が多く、実験的に配信する所までは辿り着くことができます。
しかし、実際に不特定多数に公開する前には、いくつか把握しておいたほうが良いことがあります。

1. きちんと動作しているのか、動かない場合には、どのエラーログを見ればよいのか？
2. 統計情報を確認することはできるのか？
3. どのくらいのアクセスまで捌くことができるのか？

ここでは、1,2に関して記載します。
（3は準備中）

## 環境
* CentOS 6.7
* nginx 1.9.15
 * nginx-rtmp-module 

## インストール
* rtmpモジュールを組み込んだnginxのインストール

```
# yum install -y pcre zlib openssl
```
```
# cd /usr/local/src/
# wget http://nginx.org/download/nginx-1.9.15.tar.gz
# tar xvf nginx-1.9.15.tar.gz

# wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
# unzip master.zip 

# cd nginx-1.9.15
# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --with-http_ssl_module --add-module=../nginx-rtmp-module-master --with-debug 
# make
# make install
# nginx -v
```
* ドキュメントルート ログディレクトリの作成（ここら辺は、好きな所へ……）

```
# mkdir /home/www
# mkdir /home/logs
```

* 設定ファイルの配置（nginx.conf） 

```
# mkdir /etc/nginx
# cp /usr/local/src/nginx-1.9.15/conf/nginx.conf /etc/nginx/
```

* 設定ファイルの編集（nginx.conf） 

```
# vi /etc/nginx/nginx.conf 
``` 
```bash:/etc/nginx/nginx.conf
# デバッグ用のログ取得（warn,notice,info,debugのレベルがある.infoぐらいのレベルが丁度良い）
error_log  /home/logs/error.log  info;

http {
    # http(プロトコル用)アクセスログ
    access_log  /home/logs/access.log  main;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /home/www;
            index  index.html index.htm;
        }
        
        # 統計情報表示設定
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet /stat.xsl;
        }

        location /stat.xsl {
            root /home/www/stats;
        }
    }
}

# rtmpモジュールの設定ブロックを追加
rtmp {
   server {
      listen 1935;
      chunk_size 4096;
      
      # rtmp(プロトコル用)アクセスログ
      access_log  /home/logs/rtmp.access.log combined

      application live {
         live on;
         record off;
      }
   }
}

```

* 起動スクリプトの配置
 * [Red Hat NGINX Init Script（起動スクリプト）](https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/)からコピーして配置

```
# vi /etc/init.d/nginx
# chmod 755 /etc/init.d/nginx
# /etc/init.d/nginx configtest 
# /etc/init.d/nginx start
```

## 配信準備
* 再生用ページ

```index.html
<!DOCTYPE html>
<html lang="en" class="">
<head>
  <link href="http://vjs.zencdn.net/4.2.0/video-js.css" rel="stylesheet">
  <script src="http://vjs.zencdn.net/4.2.0/video.js"></script>
</head>
<body>
  <video id="rtmp live test" class="video-js vjs-default-skin" controls
   preload="auto" width="640" height="264" data-setup='{}'>
    <source src="rtmp://***.***.***.***/live/test" type='rtmp/mp4'>
    <p class="vjs-no-js">
      To view this video please enable JavaScript, and consider upgrading to a web browser
      that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
    </p>
  </video>
</body>
</html>

```

## ログの確認
### アクセスログ
* [ログフォーマット](https://github.com/arut/nginx-rtmp-module/wiki/Directives#log_format)
 * PUBLISH: 配信用デバイス（PC）から配信が開始された
 * PLAY: ブラウザからアクセスされ配信が始まった

```bash:rtmp.access.log
***.***.***.*** [04/May/2016:16:04:38 +0900] PUBLISH "live" "test" "" - 45828392 529 "" "FMLE/3.0 (compatible; obs-studi" (2m 18s)
***.***.***.*** [04/May/2016:15:10:22 +0900] PLAY "live" "test" "" - 627 54573547 "http://***.***.***.***/" "MAC 21,0,0,216" (2m 46s)
```

### エラーログ
 * 配信開始（client connected -> connect -> createStream -> publish）
 
```bash:error.log
[info] 1572#0: *2 client connected '***.***.***.**'
[info] 1572#0: *2 connect: app='live' args='' flashver='FMLE/3.0 (compatible; obs-studi' swf_url='rtmp://***.***.***.***/live' tc_url='rtmp://***.***.***.***/live' page_url='' acodecs=0 vcodecs=0 object_encoding=0, client: ***.***.***.***, server: 0.0.0.0:1935
[info] 1572#0: *2 createStream, client: ***.***.***.***, server: 0.0.0.0:1935
[info] 1572#0: *2 publish: name='test' args='' type=live silent=0, client: ***.***.***.***, server: 0.0.0.0:1935
```

* 配信終了（deleteStream -> disconnect -> deleteStream）
 * deleteStreamが二回ある謎。配信開始のclient connectedに対応する破棄という意味なのか……？

```bash:error.log
[info] 1572#0: *2 deleteStream, client: ***.***.***.***, server: 0.0.0.0:1935
[info] 1572#0: *2 disconnect, client: ***.***.***.***, server: 0.0.0.0:1935
[info] 1572#0: *2 deleteStream, client: ***.***.***.***, server: 0.0.0.0:1935
```

* 再生（client connected -> connect -> createStream -> play）

```bash:error.log
[info] 1572#0: *6 client connected '***.***.***.***'
[info] 1572#0: *6 connect: app='live' args='' flashver='MAC 21,0,0,216' swf_url='http://vjs.zencdn.net/4.2/video-js.swf' tc_url='rtmp://192.168.100.102/live/' page_url='http://bash:error.log/' acodecs=3575 vcodecs=252 object_encoding=3, client: ***.***.***.***, server: 0.0.0.0:1935
[info] 1572#0: *6 createStream, client: ***.***.***.***, server: 0.0.0.0:1935
[info] 1572#0: *6 play: name='test' args='' start=0 duration=0 reset=0 silent=0, client: ***.***.***.***, server: 0.0.0.0:1935
```

* 一時停止、再開
 * infoレベルのログには出力されない 

* ブラウザを閉じる、再読み込み
 * ストリーミングの場合、停止操作がないので、ブラウザを閉じた場合や、同じクライアントから再アクセスがあった場合に、コネクションを破棄していると思われる

```bash:error.log
[info] 1572#0: *6 disconnect, client: ***.***.***.***, server: 0.0.0.0:1935
[info] 1572#0: *6 deleteStream, client: ***.***.***.***, server: 0.0.0.0:1935
```

## 統計情報の表示
* 統計用テンプレートの配置

```
# cp /usr/local/src/nginx-rtmp-module-master/stat.xsl /home/www/stats/
```

* 統計画面へアクセス
 * http://***.***.***.***/stats/
 * 前述の統計画面が表示される
 * アクセス制限は、必要に応じて

## その他
### 用語
* RTMP(RealTimeMessageProtocol)
 * 音声:64バイト, 動画:128バイト 
 * Flashで再生
* HLS(HTTP Live Streaming)
 * iOS/Androidで再生
* OBS(OpenBroadcastSoftware)
 * 配信用ソフト（カメラとマイクが付いているPC/Macであればよい）

### configureオプション
| モジュール名 | 用途 | |
|:-----------|:-----------|:-----------|
| ngx_http_ssl_module | SSLサポート | --with-http_ssl_module |
| nginx-rtmp-module-master | rtmp拡張モジュール | --add-module=../nginx-rtmp-module-master |
| -- | rtmp拡張モジュールのデバッグモード | --with-debug |


## 参照
* [Red Hat NGINX Init Script（起動スクリプト）](https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/)
* [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module/wiki/Directives)
* [Open Broadcaster Software](https://obsproject.com/)