nginx + RTMP 모듈을 통한 라이브 스트리밍(통계 및 로깅)



nginx + RTMP 모듈을 통한 라이브 스트리밍은 사례가 많으며 실험적으로 배포하는 곳까지는 다닐 수 있습니다.
그러나 실제로 불특정 다수에 공개하기 전에는 몇 가지 파악해 두는 것이 좋을 수 있습니다.
  • 제대로 동작하고 있는지, 움직이지 않는 경우에는, 어떤 에러 로그를 보면 좋은 것인가?
  • 통계 정보를 확인할 수 있습니까?
  • 얼마나 접근할 수 있을까?

  • 여기에서는 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 
    

    /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(시작 스크립트) 에서 복사하여 배치

  • # 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>
    
    

    로그 확인



    액세스 로그



  • 로그 형식
  • PUBLISH : 배달 장치 (PC)에서 배달이 시작되었습니다
  • PLAY : 브라우저에서 액세스되어 배달이 시작되었습니다


  • 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)

  • 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에 대응하는 파기라는 의미인가…


  • 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)

  • 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
    

  • 일시정지, 재개
  • 정보 레벨 로그에 출력되지 않음


  • 브라우저 닫기, 다시 로드
  • 스트리밍의 경우 중지 작업이 없으므로 브라우저를 닫거나 동일한 클라이언트에서 다시 액세스 할 때 연결을 버리는 것으로 보입니다.


  • 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(시작 스크립트)
  • nginx-rtmp-module
  • Open Broadcaster Software
  • 좋은 웹페이지 즐겨찾기