Как создать свой стриминг сервер на VPS

Для создания своего стриминг сервиса вам потребуется 2 компонента: RTMP сервер, и сервер раздачи контента. Сделать все это позволяет nginx-rtmp-module. Этот RTMP модуль для сервера nginx позволяет вам создать RTMP сервер, который затем превращает видео поток в чанки например HLS или DASH, которые можно проигрывать в любимом плеере.

Для хостинга рекомендуется использовать VPS сервер, тк потоковое видео создаёт большую нагрузку на сеть.

Установка

Код ниже можно просто скопировать и вставить в терминал тк комментарии игнорируются башем.
# Установка зависмостей
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
# Скачивание nginx
wget http://nginx.org/download/nginx-1.15.1.tar.gz
# Распаковка tar
tar -zxvf nginx-1.15.1.tar.gz
# Заходим в папку с исходниками nginx
cd nginx-1.15.1
# Теперь скачаем плагин
wget https://github.com/sergey-dryabzhinsky/nginx-rtmp-module/archive/dev.tar.gz
tar -zxvf dev.tar.gz # Распаковка плагина
# Создаем Makefile
./configure --with-http_ssl_module --add-module=nginx-rtmp-module-dev
# Компилируем и ставим на систему
make
sudo make install

cp objs/nginx /usr/sbin/nginx
Теперь нужно настроить nginx, и запустить. Сразу удалим заводской конфиг nginx, тк нам придется сейчас много что переписывать: rm /usr/local/nginx/conf/nginx.conf 

Далее нужно создать сервис файл для nginx в systemd, чтобы можно было настроить nginx как демон. Создаем этот файл /lib/systemd/system/nginx.service:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

После создания демон-файла нужно обновить регистр демонов Systemd: sudo systemctl daemon-reload

Настройка

Открываем /usr/local/nginx/conf/nginx.conf в любимом текстовом редакторе и вводим этот конфиг:
events {}

rtmp {

    server {

        listen 1935;

        chunk_size 4000;

        application mytv {
            live on;

            allow publish 127.0.0.1; # Здесь нужно ввести свой IP, который можно получить из 2ip.ru.
            deny publish all;

            allow play all;

            hls on;
            hls_path /tmp/hls;
        }

    }
}

http {

    server {

        listen 8080;

        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}
В большинстве статей которые я находил забывают добавить events{} в конфиге, из-за чего nginx не запускался. Теперь разберемся что делает наш конфиг: Конфиг создаёт RTMP стрим с именем mytv, где указывается что стрим можно принимать только от 127.0.0.1 так сделано чтобы неизвесные люди из интернета не могли перехватить ваш стрим. Далее мы настраиваем директорию /tmp/hls как место для хранения кусков вашего стрима, которые будут развадатся через протоков HLS. Тк файлы находятся в /tmp, то файлы находятся в оперативной памяти. Это позволяет быстрее образатся к ним, и раздать клиентам. Ниже мы настраиваем уже http сервер который просто раздаёт все файлы находящиеся в директории /tmp.

Так же нужно использовать SSH тунелирование, чтобы вы могли от имени 127.0.0.1 подключится к порту 1935:

ssh -f -N -L 1935:192.168.0.10:1935 nameuser@88.77.66.55

Так-же желательно запретить доступ к порту 1935 из внешней сети. Но это уже можно делать на ваше усмотрение.

Теперь нужно запустить nginx через Systemd:
sudo service nginx start

Если у вас пояились какие-либо ошибки, отпишитесь пожалуйста в комментариях, я вам обязательно помогу. 

Стриминг через OBS

Чтобы стримить на свой стриминг серис вам нужно зайти на вкладку Stream в OBS, и нажать "Custom". Как URL стрима нужно ввести: rtmp://127.0.0.1:1935/mytv ключа трансляции нету.

Затем нажмите "Начать стрим", и не должно быть dropped frames, и индикатор должен быть зеленым:

Теперь если вы зайдете в директорию ls -la /tmp/hls то увидите чати стрима, и HLS плейлист:
Если вы зайдёте на страницу http://localhost:8080/hls/.m3u8, то увидите плейлист:
Его можно использовать в веб плеерах вроде videojshttps://flowplayer.com/ VLC, и многих других.

Чтобы сделать стрим более масштабируемым можно использовать CDN вроде clouflare. Никогда такого не делал, но скорее всего в следующих статьях попробую сделать.

У nginx-rtmp-module так-же есть поддержка вебхуков. Позже я так же напишу пост про их интеграцию для рассылок уведомлений о начале трансляции итд. Пишите в комментариях вопросы, я обязательно на них отвечу и помогу вам.

Комментарии

  1. Какая пропускная способность должна быть у VPS, чтобы стримить в качестве 1080р на одного человека?

    ОтветитьУдалить
    Ответы
    1. На одного человека думаю любой vps подойдёт с парой ядер и 100 мегабайт.

      Удалить
  2. А можем перейти в месенждер

    ОтветитьУдалить
  3. Какие характеристики сервера должны быть для стрима на 10-20к зрителей ? У меня на 250 человек плеер умирает)

    ОтветитьУдалить
    Ответы
    1. Все очень индивдуально и нужно бенчмаркать. Если умирает значит скорее всего не хватает ширины канала. Надо настроить кеш сеть.

      Удалить

Отправить комментарий

Популярные сообщения из этого блога

DOS атака при помощи Python

Ведем телеграм канал через питон

Django migrations не видит изменения моделей