Рестрим через Nginx

Краткая инструкция по созданию рестрима при помощи Nginx.

 

1) Скачиваем 

Сам Nginx уже с модулем rtmp

https://github.com/illuspas/nginx-rtmp-win32

1.jpg

WEB морда для отслеживание потоков 

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

 

2) Необходимо все разархивировать

например:

nginx-rtmp-win32-master.zip в папку C:\Nginx\nginx-rtmp-win32-master

nginx-rtmp-module-master.zip в папку C:\Nginx\nginx-rtmp-win32-master\www2

 

3) Настраиваем Nginx

для этого необходимо отредактировать C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf

 

worker_processes  1;

error_log  logs/error.log debug;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;

        application live {
            live on;
        }
        
        application hls {
            live on;
            hls on;  
            hls_path temp/hls;  
            hls_fragment 8s;  
        }
    }
}

http {
    server {
        listen      8080;
        
        location / {
            root www;
        }
        
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root www;
        }
        
        location /hls {  
           #server hls fragments  
            types{  
                application/vnd.apple.mpegurl m3u8;  
                video/mp2t ts;  
            }  
            alias temp/hls;  
            expires -1;  
        }  

    }
}

меняем следующее.

в секции rtmp:

rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;

        application myapp {
            live on;
            push rtmp://localhost/GG;
            push rtmp://localhost/YOUTUBE;
            push rtmp://localhost/YOUTUBEBACKUP;
            push rtmp://localhost/TWITCH;
            push rtmp://localhost/CYBERGAME;

        }

        application GG {
                    live on;
                    record off;
                    push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
        }
        application YOUTUBE {
                    live on;
                    record off;
                    push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
        }
        application YOUTUBEBACKUP {
                    live on;
                    record off;
                    push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
        }

        application TWITCH {
                    live on;
                    record off;
                    push rtmp://live-fra.twitch.tv/app/Ключ трансляции;
        }
        application CYBERGAME {
                    live on;
                    record off;
                    push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
        }


    }
}

с начало создаем сервис на который мы будем стриметь и который будет рестриметь на другие источники "application myapp {", где  myapp его название, которое будем в бивать в настройки OBS или XSplit.

Далее описываем куда будем рестриметь что бы было все красиво 

"push rtmp://localhost/'имя сервиса' "

Теперь создаем сами потоки рестрима для примера GG

        application GG {
                    live on;
                    record off;
                    push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
        }

где самое главное это push rtmp://rtmp сервер/ключ трансляции;

Должно быть все понятно, тут нечего сложного.

 

в секции http:

http {
    server {
        listen      8080;
        
        location / {
            root www;
        }
        
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root www;
        }
        
        location /hls {  
           #server hls fragments  
            types{  
                application/vnd.apple.mpegurl m3u8;  
                video/mp2t ts;  
            }  
            alias temp/hls;  
            expires -1;  
        }  

    }
}

тут кому как удобно, можно добавить новые настройки или заменить старые, я оставил старые на всякий случай и добавил дополнительную секцию 

    server {
        listen       8081;
        server_name  localhost;
        root    www2;
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            # you can move stat.xsl to a different location
            root www2;
        }

        # rtmp control
        location /control {
            rtmp_control all;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

где самое главное поменять порт, я поставил  "listen       8081;"

пусть к корневому каталогу "root    www2;" где указывается папка создаваемая в самом начале "nginx-rtmp-module-master.zip в папку C:\Nginx\nginx-rtmp-win32-master\www2"

остальное можно не трогать.

 

4) Проверяем настройки

запускаем командную строку, для этого необходимо нажать на "Пуск" и в поле поиска вбить "cmd", или "Пуск/Все программы/Стандартные/Командная строка" после чего появляется окно.

Далее переходим в каталог с Nginx, для этого набираем "cd Путь", в моем случае cd C:\Nginx\nginx-rtmp-win32-master

Далее пишем nginx -t и должны увидеть следующее

nginx: the configuration file C:\nginx/conf/nginx.conf syntax is ok
nginx: configuration file C:\nginx/conf/nginx.conf test is successful

Если выводит нечто другое - вчитываемся в ошибку, пытаемся исправить (обычно это не поставленная точка с запятой или забытая скобка).

Если все верно то запускаем nginx: набираем nginx, жмем Enter. Командная строка зависнет - это нормально, значит все нормально запустилось и что бы точно убедится открываем браузер и запускаем http://localhost:8081/stat , должны увидеть табличку

Теперь можно остановить nginx, для этого запускаем опять командную строку, так же переходим в папку с Nginx, "cd C:\Nginx\nginx-rtmp-win32-master" и что бы сотановить сервер нам надо набрать nginx -s stop. Или просто некорректно вырубить из диспетчера задач процесс.

 

5) Настраиваем стрим-программу.

Для примера покажу настройки OBS.

Тут все совсем просто: нужно указать в качестве сервера наш компьютер.

Для этого лезем в настройки и в настройках Трансляции выбираем Сервер вещания "Custom" и в FMS URL: rtmp://localhost/myapp

где "myapp" это название которое мы указывали в настройках nginx в секции rtmp.

2.jpg

 

Все теперь готово, запускаем сервер Nginx и запускаем трансляцию, о состоянии рестримов можно отслеживать через WEB морду http://localhost:8081/stat

есть еще WEB морда изначальная http://localhost:8080/ , но я в ней не разбирался и мне она не нужна была.

 

6) Для удобства запуска и остановки сервера

Для этого создадим 3 bat файлика

nginx-start.bat - для старта

@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
start nginx.exe

 

nginx-reload.bat - для применения изменения   конфигов

@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
nginx.exe -s reload

 

nginx-stop.bat - для остановки

@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
nginx.exe -s stop

При этом, nginx-start.bat можно положить в автозагрузку.

 

где "set root=C:\Nginx\nginx-rtmp-win32-master" пусть до Nginx сервера, куда мы все разархивировали.

 

7) Безопасность

Теперь когда все работает, надо подумать о безопасности, что бы не кто не мог стриметь кроме вас на ваш сервер.

Для этого создадим белые IP адреса, с которых можно стриметь 

для этого в секции в настройках Nginx (C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf) в секции rtmp нам нужно кое что дописать.

В каждом application нудно добавить следующие настройки:

                    allow publish 127.0.0.1; # локальный адрес
                    allow publish 192.168.1.13; # ip адрес ПК с которого будет идти стрим
                    allow publish 83.153.39.122; # адрес с которого будет идти стрим в не дома
                    deny publish all; # Запретить все остальные

вот так выглядят полностью мои настройки C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf

worker_processes  1;

error_log  logs/error.log debug;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;

        application myapp {
            live on;
            allow publish 127.0.0.1;
            allow publish 192.168.1.13;
            allow publish 83.153.39.122;
            deny publish all;

            push rtmp://localhost/GG;
            push rtmp://localhost/YOUTUBE;
            push rtmp://localhost/YOUTUBEBACKUP;
            push rtmp://localhost/TWITCH;
            push rtmp://localhost/CYBERGAME;

        }

        application GG {
                    live on;
                    record off;
                    allow publish 127.0.0.1;
                    allow publish 192.168.1.13;
                    allow publish 83.153.39.122;
                    deny publish all;                    
                    push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
        }
        application YOUTUBE {
                    live on;
                    record off;
                    allow publish 127.0.0.1;
                    allow publish 192.168.1.13;
                    allow publish 83.153.39.122;
                    deny publish all;                        
                    push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
        }
        application YOUTUBEBACKUP {
                    live on;
                    record off;
                    allow publish 127.0.0.1;
                    allow publish 192.168.1.13;
                    allow publish 83.153.39.122;
                    deny publish all;                        
                    push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
        }
        application TWITCH {
                    live on;
                    record off;
                    allow publish 127.0.0.1;
                    allow publish 192.168.1.13;
                    allow publish 83.153.39.122;
                    deny publish all;                        
                    push rtmp://live-fra.twitch.tv/app/Ключ трансляции;
        }
        application CYBERGAME {
                    live on;
                    record off;
                    allow publish 127.0.0.1;
                    allow publish 192.168.1.13;
                    allow publish 83.153.39.122;
                    deny publish all;                        
                    push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
        }


    }
}
        
        

http {
    server {
        listen      8080;
        
        location / {
            root www;
        }
        
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root www;
        }
        
        location /hls {  
           #server hls fragments  
            types{  
                application/vnd.apple.mpegurl m3u8;  
                video/mp2t ts;  
            }  
            alias temp/hls;  
            expires -1;  
        }  

    }
    server {
        listen       8081;
        server_name  localhost;
        root    www2;
       location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            # you can move stat.xsl to a different location
            root www2;
        }

        # rtmp control
        location /control {
            rtmp_control all;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

В общем на это все.

Это моя первая статья, извините если есть какие то недочеты, надеюсь эта статья вам поможет.