본문 바로가기
Server

Live & VOD Streaming Media Server 구축 (5) - Nginx + rtmp module 설치 (rtmp to hls)

by 오늘도 깨달았다 2022. 3. 23.
반응형

이제 실제로 Nginx 웹서버와 rtmp 소스를 push, pull 로 쉽게 받을 수 있게 지원하는 open source 를 활용해 미디어서버를 구축해보겠다. 

 

서버는 ubuntu 20.04인 AWS의 EC2이다. 

 

내가 임대한 서버는 CentOS7 기반이라 패키지 설치를 진행할 때는 apt-get 말고 yum 으로 진행하도록 한다. 

(ubuntu20.04 코드들은 맨 밑에 참고자료 있음)

 

 

1. Nginx 컴파일 설치를 위한 의존성 도구들 설치 

 

sudo yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel -y
sudo yum groupinstall "Development Tools" -y

 

 

2. Nginx 웹서버와 rtmp module  // tar 압축파일 다운로드할 폴더 생성 & tar 압축파일 다운로드

 

mkdir /usr/local/nginx-rtmp
cd /usr/local/nginx-rtmp

wget https://nginx.org/download/nginx-1.14.0.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
tar -zxvf nginx-1.14.0.tar.gz
unzip master.zip

** 차근차근 하나씩 명령어를 실행해주세요

 

3. nginx와 rtmp module 컴파일 설치

cd nginx-1.14.0

sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module --add-module=../nginx-rtmp-module-master --user=nginx --group=nginx

sudo make

sudo make install

 

1) ./configure : 컴파일 설치를 하기 위한 설정

 

2) --prefix='경로' : nginx가 설치될 때 모든 것의 기본적인 정보가 저장되는 경로

 

3) --sbin-path='경로' : nginx의 실행파일이 설치되는 경로

 

4) --conf-path='경로' : nginx의 설정 파일(nginx.conf)이 저장되는 경로

 

5) --pid-path='경로' : nginx의 프로세스 ID값이 있는 파일의 경로

 

6) --error, --http-log : nginx의 로그 파일이 저장되는 경로

 

7) --with--http_ssl_module 등.. : 기본적으로 nginx설치 파일에 들어있으나 설치되지 않는 모듈들.. 그러나 내가 with로 설정할 때 설치할 수 있는 모듈들

 

8) --add-module='경로' : 서드파티의 모듈(라이브러리, Nginx-rtmp 모듈 등)을 설치할 수 있는 명령어

 

9) --user=nginx --group=nginx: nginx사용자의 권한으로 Nginx를 실행 함. conf에서 바꿀 수 있음. 

 

 

 

 

4. Nginx 사용자 등록 및 Nginx 실행

sudo useradd --shell /sbin/nologin nginx

sudo ps aux | grep nginx 로 nginx가 worker process로 등록 된 것을 확인한다.

 

** 서비스에 등록하지 않고 매번 명령어를 쳐서 실행할꺼면 다음 명령어로 실행한다 .

sudo /usr/sbin/nginx

 

 

5. Nginx를 서비스에 등록하기 

script.txt
0.00MB

다음 파일을 다운로드 한 후 

 

sudo vi /etc/init.d/nginx

 

편집기를 오픈해서 붙여넣는다. 마우스로 할 경우 Ctrl + C -> vi 안에 오른쪽마우스 클릭 하면 붙여넣기 됨 

 

저장 했으면, 서비스 실행파일 권한 설정(644->744)

 

sudo chmod +x /etc/init.d/nginx

 

 

6. 나의 경우 rtmp 소스를 hls로 바꾸기 위한 환경설정 

vi /etc/nginx/nginx.conf
user nginx;
worker_processes auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
events
{
  worker_connections 1024;
}
rtmp
{
  server
  {
    listen 1935;
    # Listen on standard RTMP port
    chunk_size 4000;

    application show
    {
      on_publish http://127.0.0.1/chat//publisher;
      on_done http://127.0.0.1/chat//publisher-end;
      live on;
      hls on;
      hls_path /mnt/hls/;
      hls_fragment 1;
      hls_playlist_length 6s;
      hls_continuous on;
      # Turn on HLS
      #   -c:a aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost/hls/$name_hi;

      exec ffmpeg -i rtmp://localhost/show/$name
      -c:a aac -b:a 32k -s 720*1280 -c:v libx264 -b:v 3000K -f flv rtmp://localhost/hls/$name_mid
      -c:a aac -b:a 64k -s 1080*1920 -c:v libx264 -b:v 4500K -f flv rtmp://localhost/hls/$name_hi;

    }
    application hls
    {
      live on;

      hls on;
      hls_path /tmp/hls/;
      hls_fragment 1;
      hls_playlist_length 6s;
      deny play all;
      hls_continuous on;
      hls_nested on;

      # hls_variant _low BANDWIDTH=3200000;
      hls_variant _mid BANDWIDTH=3200000;
      hls_variant _hi BANDWIDTH=6400000;
    }


  }
}
http
{
  include mime.types;
  default_type application/octet-stream;
  #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  #                  '$status $body_bytes_sent "$http_referer" '
  #                  '"$http_user_agent" "$http_x_forwarded_for"';

  #access_log  logs/access.log  main;

  sendfile on;
  #tcp_nopush     on;

  #keepalive_timeout  0;
  keepalive_timeout 65;

  #gzip  on;

  server
  {
    listen 80;
    server_name localhost;
    add_header 'Access-Control-Allow-Origin' '*';
    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location /
    {
      root html;
      index index.html index.htm ;
      add_header 'Access-Control-Allow-Origin' '*';
    }

    # location ~ \.php$ {
    #     include        fastcgi_params;
    #     fastcgi_pass 127.0.0.1:9000;
    #     fastcgi_index index.php;
    #     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    # }

    location /live
    {
      add_header Cache-Control no-cache;
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Expose-Headers' 'Content-Length';


      types
      {
        application/vnd.apple.mpegurl m3u8;
      }
      alias /tmp/hls/;
    }
    location /live-origin
    {
      add_header Cache-Control no-cache;
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Expose-Headers' 'Content-Length';


      types
      {
        application/vnd.apple.mpegurl m3u8;
      }
      alias /mnt/hls/;
    }
    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html
    {
      root html;
    }
    location /chat
    {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;

      add_header 'Access-Control-Allow-Origin' '*';

      proxy_pass http://localhost:3000/;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }

  }


  # another virtual host using mix of IP-, name-, and port-based configuration
  #
  #server {
  #    listen       8000;
  #    listen       somename:8080;
  #    server_name  somename  alias  another.alias;
  #    location / {
  #        root   html;
  #        index  index.html index.htm;
  #    }
  #}
  # HTTPS server
  #
  #server {
  #    listen       443 ssl;
  #    server_name  localhost;
  #    ssl_certificate      cert.pem;
  #    ssl_certificate_key  cert.key;
  #    ssl_session_cache    shared:SSL:1m;
  #    ssl_session_timeout  5m;
  #    ssl_ciphers  HIGH:!aNULL:!MD5;
  #    ssl_prefer_server_ciphers  on;
  #    location / {
  #        root   html;
  #        index  index.html index.htm;
  #    }
  #}
}

 

rtmp 소스를 hls 로 변환해서 웹사이트에서 라이브 스트리밍이 되는 부분까지 테스트 완료한 서버 설정 코드이다.

 

저장 후 nginx 재시작 

 

service nginx restart

 

 

서버설정은 여기까지해서 완료했다.

 

**혹시 ubuntu 궁금해하시는분들 있을까봐 

https://www.digitalocean.com/community/tutorials/how-to-set-up-a-video-streaming-server-using-nginx-rtmp-on-ubuntu-20-04

 

How To Set Up a Video Streaming Server using Nginx-RTMP on Ubuntu 20.04 | DigitalOcean

 

www.digitalocean.com

 

해당 블로그를 참고했고, nginx.conf는 위의 CentOS 부분을 가져가도 무방하다. 

 

궁금한점이나, 다른부분에 대해 질문있으면 댓글남겨주세요!

 

 

 

service nginx restart 등 service 관련 명령어가 동작하지 않을 때 

 

/usr/local/nginx/sbin/nginx // 서비스 시작
/usr/local/nginx/sbin/nginx -s stop // 서비스 정지
/usr/local/nginx/sbin/nginx -s reload // 서비스 재시작
/usr/local/nginx/sbin/nginx -t // 설정 파일 syntax 테스트

반응형

댓글