NGINX + nginx-rtmp-module — трансляция видео с веб-сервера
Вещание видео будет осуществляться с помощью модуля для nginx — nginx-rtmp-module.
Для этого необходимо собрать веб-сервер nginx из исходников, включив вышеназванный модуль.
Содержание:
Сборка NGINX + nginx-rtmp-module
Для удобства работы с nginx, сначала мы установим его из пакетов, хотя бы, чтобы создались скрипты автозапуска.
Установка nginx и пакетов для сборки
Ubuntu:
apt-get install nginx libpcre++-dev libssl-dev libxslt1-dev libgd2-xpm-dev libgeoip-dev
CentOS:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
yum install nginx pcre-devel openssl-devel
Сборка из исходников
Смотрим версию установленного пакета:
Теперь переходим по ссылке https://nginx.org/download и копируем ссылку на установленную версию nginx (архив tar.gz). В моем случае, это была версия 1.10.0.
* обратите внимание, что в данном списке версии идут не по порядку — ориентируйтесь по дате (средняя колонка).
Распаковываем исходник nginx и модуль:
tar xzf nginx-1.10.0.tar.gz
tar xzf master.tar.gz
И переходим в распакованный каталог nginx:
Смотрим, с какими опциями собран уже установленный nginx:
Копируем текст, который идет после configure arguments:
Теперь конфигурируем nginx со скопированными опциями + —add-module=../nginx-rtmp-module-master. Получиться что-то на вроде:
Nginx windows nginx rtmp module
Краткая инструкция по созданию рестрима при помощи Nginx.
1) Скачиваем
Сам Nginx уже с модулем rtmp
WEB морда для отслеживание потоков
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
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.
Все теперь готово, запускаем сервер 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
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;
>
>
В общем на это все.
Это моя первая статья, извините если есть какие то недочеты, надеюсь эта статья вам поможет.
Краткая инструкция по созданию рестрима при помощи Nginx.
1) Скачиваем
Сам Nginx уже с модулем rtmp
WEB морда для отслеживание потоков
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
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.
Все теперь готово, запускаем сервер 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
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;
>
>
В общем на это все.
Это моя первая статья, извините если есть какие то недочеты, надеюсь эта статья вам поможет.