Свой Рестрим-Сервер (Nginx RTMP | Ubuntu 20.04 VPS | Windows Desktop) – Mikulski
Наложение сайта

Свой Рестрим-Сервер (Nginx RTMP | Ubuntu 20.04 VPS | Windows Desktop)

Что ж, бесплатные сервисы для рестриминга, о которых я писал ранее, отлично справляются со своей функцией. Но в контексте трансляций 24/7 с большим количеством платформ (например, радио, как в моем случае), все-таки это не лучший вариант: рандомные обрывы связи с сервером, роняющие транслирующий скрипт (в среднем, один раз в две недели); малое количество единовременных подключений или отсутствие поддержки нужной площадки, из-за чего приходится городить “многоножку” из сервисов, либо переходить на платные тарифы (которые еще нужно суметь оплатить).
Будучи человеком только влившимся в относительные дебри веб-технологий, я не сразу подумал о логичном шаге: поискать решения запуска собственного рестрим-сервера на VPS. А когда подумал, то решил, что простейшая конфигурация моей машины (1 CPU, 1 GB RAM) не потянет такие функции, особенно, в паре с транслирующим скриптом.
В общем, мои предрассудки значительно оттянули момент, когда я все-таки пришел к Nginx-серверу и его RTMP-модулю, которые оказались отличным решением для моего радио-потока 24/7:

  • Стабильная работа и отсутствие обрывов связи (ну кроме тех случаев, когда проблема на стороне хостера VPS).
  • Легкая и быстрая настройка без заморочек.
  • Минимальная нагрузка на процессор (буквально 1% в моем случае).
  • Возможность добавить любые площадки вставкой rtmp-адреса с ключом и в количестве, которое позволит ваш интернет-канал (например, ваша скорость 100мб/сек, битрейт стрима 3мб/сек (3000кб/с) -> вы можете ретранслировать на +/- 30 каналов).
  • Из минусов можно отметить отсутствие возможности отключать/перезапускать отдельные каналы без рестарта условного OBS (но не исключаю, что я просто не нашел способа).

На самом деле, по Nginx-RTMP достаточно много гайдов и различной информации, т.к. это весьма популярный способ ретрансляции среди стримеров (да, Nginx можно настроить и на Windows – об этом я подскажу в конце поста). Например, я, когда впервые настраивал себе сервер пользовался этими источниками:

А потому я не видел смысла в том, чтобы пересказывать изученное и не брался за этот пост. Но, поразмыслив какое-то время, передумал: все же это существенная часть моего опыта в создании 24/7 стрима, которым я решил делиться с самого начала, стараясь доступно давать информацию тем, кто как и я впервые имеет дело с VPS, Linux и прочим..

В гайде, который пойдет дальше я расскажу об установке и настройке Nginx на систему Ubuntu 20.04 и кратко о Windows.

NGINX

Первым делом нужно установить сам Nginx-сервер:

sudo apt update
sudo apt install nginx

После установки в директорию: /etc/nginx он автоматически запустится. Это можно проверить командой:

systemctl status nginx

В логе отобразится информация, где среди прочего будет строка “Active”:

Active: active (running) since ...

Еще команды для управления Nginx, которые пригодятся:

Остановить сервер

sudo systemctl stop nginx

Запустить сервер

sudo systemctl start nginx

Перезапустить сервер (остановить, затем запустить)

sudo systemctl restart nginx

Перезагрузить сервер (по сути, применить изменения после редакции конфиг-файла без обрыва соединений. Стримы не упадут! Но и не остановятся отдельные каналы, которые вы убрали из конфиг-файла).

sudo systemctl reload nginx

NGINX – RTMP

Теперь можно установить модуль RTMP:

sudo apt install libnginx-mod-rtmp

Готово! Далее необходимо отредактировать конфигурационный файл nginx.conf, в котором и будет указано откуда принимать стрим и по каким адресатам его дублировать.
Подойдет любой текстовый редактор, например nano:

sudo nano /etc/nginx/nginx.conf

Не трогая уже существующее содержимое файла, надо спуститься в самый низ и добавить туда такой блок:

rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                allow publish ваш_локальный_IP_адрес;
                deny publish all;

                application live {
                        live on;
                        record off;
#TWITCH
       push rtmp://hel03.contribute.live-video.net/app/ключ трансляции;
#YOUTUBE
       push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
          }
     }
}

О чем это все:

  • listen 1935 – порт, который будет “слушать” rtmp для подключения. 1935 – это стандартный порт.
  • chunk_size 4096 – размер блока данных, которые будет отправлять rtmp. По умолчанию, также указан стандартный.
  • allow publish – с какого адреса разрешено публиковать стримы. Здесь нужно оставить строчку 127.0.0.1 и добавить свою с IP-адресом вашего VPS (с которого будет идти поток). Можно указать и другие адреса, если нужно. Например, домашний, чтобы запустить стрим из OBS дома, а Nginx, размещенный на VPS, раздавал сигнал дальше.
  • deny publish all – запретить публикацию стрима со всех остальных адресов, кроме тех, что были указаны выше.
  • application где live можно заменить на любое другое “имя”. Проще говоря, это название/часть адреса “приемника” потока.
    Иными словами, если стримить через OBS, то строка rtmp с адресом куда отправить стрим, будет иметь вид навроде: rtmp://localhost/live или rtmp://IP_АДРЕС_VPS/live
    • live on – включение режима, при котором к потоку могут подключиться одновременно несколько пользователей.
  • record off – отключение режима записи, чтобы стримы не сохранялись на диск.
  • #ИМЯ_СЕРВИСА – символ “#” служит для комментирования и не влияет на код. А потому очень удобно проименовывать сервисы, чтобы затем не путаться в rtmp-адресах: какой адрес к какой площадке относится.
  • push rtmp:// – сюда нужно вставить URL-сервера и ключ-трансляции, которые выдает площадка.

Думаю, что в примере кода это наглядно показано и трудностей не возникнет.
Главное следить за открытием и закрытием “{}” и как ориентир помнить, что в самом низу файла, после текста должно быть три закрывающих фигурных скобки.

В любом случае, бояться не стоит: синтаксис (после сохранения файла) всегда можно проверить командой. Если выдаст ошибку, значит где-то вы пропустили “;” или “{}”.

sudo nginx -t

Также, можно добавить второй “application” с другим набором площадок для рестрима. Это удобно, если есть потребность один стрим проводить, например, только на youtube и twitch, а второй стрим уже только на vkplay и trovo:

rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                allow publish ваш_локальный_IP_адрес;
                deny publish all;
#Первый сетап:
                application live {
                        live on;
                        record off;
#TWITCH
       push rtmp://hel03.contribute.live-video.net/app/ключ трансляции;
#YOUTUBE
       push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
          }
#Второй сетап:
                application live2 {
                        live on;
                        record off;
#VKPLAY
        push rtmp://vsu.mycdn.me/app/ключ трансляции;
#TROVO
        push rtmp://livepush.trovo.live/live/ключ трансляции;
          }
     }
}

Все, файл можно сохранить и закрыть (для редактора nano Ctrl+X, подтвердить Y, enter).

Если вы используете Firewall, то надо открыть 1935 порт:

sudo ufw allow 1935/tcp

После чего следует перезагрузить Nginx, чтобы изменения конфиг-файла вступили в силу:

sudo systemctl reload nginx.service

Отлично! Теперь в условный OBS осталось вбить адрес rtmp://ip_вашего_vps/live (помним, что где live – то название, которое мы задали в первой строке application) и запустить стрим.
Поле с ключом можно оставить пустым, либо вписать что угодно, например test – это, по сути ни на что влияет. Просто подключиться к стриму можно напрямую, например, через VLC плеер, где в качестве URL будет: rtmp://ip_вашего_vps/live/test.

RTMPS?

Так как все это заточено под протокол rtmp, то встает вопрос: как рестримить на Kick или Telegram, которые принимают потоки только в rtmps?
Есть обходной путь: запускать их через экземпляр ffmpeg специальной директивой “exec_push” в конфиге Nginx.
Также это помогает в редких случаях, когда площадка поддерживает обычный rtmp, но никак не хочет “цеплять” стрим (подобное у меня было с “Платформой”).
Соответственно, в системе должен быть установлен ffmpeg. Существует масса вариантов его установки, но я полагаю, что стандартный способ тоже подходит:

sudo apt install ffmpeg

Технически, в конфиге Nginx для ffmpeg можно прописывать любые аргументы и параметры, которые он поддерживает. Если вы понимаете как этим пользоваться, то можете смело экспериментировать.
Я же дам пример с копией параметров основного источника – т.к. это проще, понятнее и создает минимальную нагрузку на ЦПУ (1-2%).
Ок. Конфиг. По сути все тоже самое, просто push заменяем на exec_push, указываем путь до исполняемого файла ffmpeg (при корректной установке он всегда одинаковый), адрес основного потока (тот же, что мы указываем при отправке через OBS на наш Nginx-сервер), параметры запуска экземпляра ffmpeg и адрес куда поток отправить:

rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                allow publish ваш_локальный_IP_адрес;
                deny publish all;

                application live {
                        live on;
                        record off;

#TWITCH
       push rtmp://hel03.contribute.live-video.net/app/ключ трансляции;
#TELEGRAM
       exec_push  /usr/bin/ffmpeg -re -i "rtmp://ip_вашего_vps/live/test" -c copy -f flv "rtmps://dc.rtmp.t.me/s/ключ";
#KICK
       exec_push  /usr/bin/ffmpeg -re -i "rtmp://ip_вашего_vps/live/test" -c copy -f flv  "rtmps://global-contribute.live-video.net/app/ключ";
          }
     }
}

“rtmp://ip_вашего_vps/live/test” – я указал для лучшей наглядности и т.к. этот пример использовался выше. Иными словами нужно указать для ffmpeg откуда ему брать копию -> с потока который приходит на указанный application в Nginx.

Обратите внимание что выдаваемый KICK’ом набор сервер + ключ трансляции не содержит в себе промежутка “/app/”, – его надо дописать вручную:
<stream_url>/app/<stream-key>

САМОЕ ГЛАВНОЕ: WINDOWS НЕ ПОДДЕРЖИВАЕТ МЕТОД EXEC_PUSH !!!
Это работает только на Linux (Ubuntu в данном случае).
Либо нужные какие-либо дополнительные манипуляции, которые мне неизвестны.

И еще один момент, который может возникнуть (впрочем, это маловероятно, но на всякий случай стоит упомянуть) – отказ ffmpeg запускать свой экземпляр. Тогда попробуйте отредактировать самую первую строчку “user” конфига Nginx, вписав туда имя того пользователя которым устанавливался ffmpeg. Или выдать право всем пользователям запускать файл /usr/bin/ffmpeg, отредактировав его аттрибуты: sudo chmod 755 /usr/bin/ffmpeg

Статистика

Также, в рамках Nginx_RTMP предусмотрена возможность вывода статистики в http-страницу, подобного вида:

На мой взгляд пользы от этого никакой нет: лишь цифры, которые ни на что не влияют. Только лишняя морока с настройкой правил Firewall’а, чтобы никто посторонний не смог зайти на эту страницу…


Для начала, в директории /etc/nginx/sites-available нужно создать файл rtmp :

sudo nano /etc/nginx/sites-available/rtmp

Наполняем этот файл следующим содержимым:

server {
    listen 8080;
    server_name  localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /var/www/html/rtmp;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }
}

Теперь нужно извлечь файл stat.xsl в определенную директорию из архива, который скачался вместе с Rtmp-модулем при его установке:

sudo mkdir /var/www/html/rtmp
sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl`

Если после ввода второй строки, отобразится пустая строка: “>”, нажмите клавишу курсора вверх, чтобы снова вызвать предыдущую команду и нажмите Enter.

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

sudo ufw allow from ваш_ip_адрес to any port 8080

Готово! Перейдя по ссылке: http://ip_вашего_vps:8080/stat можно формально отслеживать, что происходит с потоками.

Здесь только остается добавить, что в Ubuntu, по умолчанию, Firewall отключен. И я настоятельно рекомендую изучить его настройку и управление, прежде чем активировать его, и только потом подключать статистику RTMP.

Windows

Чтобы активировать сервер на Windows, нужно скачать пакет с github, который в себя уже включает Nginx и Rtmp-модуль: https://github.com/illuspas/nginx-rtmp-win32
Архив распаковывается в любое удобное место, затем в папке Conf “блокнотом” редактируется файл nginx.conf по тому же принципу, что был описан выше. Разве что в allow publish, можно ничего не добавлять кроме “127.0.0.1”, а в OBS для вывода потока указывать rtmp://localhost/live/.
Чтобы запустить сервер,в корневой папке нужно открыть файл nginx.exe (покажется, что ничего не произойдет, но на самом деле, сервер запустится) и можно начинать стрим.
Для остановки сервера используется исполняемый файл Stop.bat.
Важно понимать, что с перезагрузкой ПК, сервер прекращает свою работу и его нужно запускать снова через nginx.exe.


Если этот материал вам пригодился и у вас есть возможность,
то поддержите автора и сайт небольшим донатом:

Спасибо💛


0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии