Устанавливаем NGINX + RTMP модуль, для стримов

Операционный системы семейства Unix/Linux
Аватара пользователя
ustim
Администратор
Сообщения: 152
Зарегистрирован: 17 янв 2017, 13:11
Откуда: Сочи
Контактная информация:

Устанавливаем NGINX + RTMP модуль, для стримов

Непрочитанное сообщение ustim »

Всем привет, появилась идея создать потоковое видео (видео онлайн) например себе на сайт, или к примеру запустить стрим на youtube, twitch, goodgame и.т.п. В интернет очень много информации про бесплатный модуль nginx-rtmp-module, НО вся информация устаревшая, в процессе вы в любом случае будете спотыкаться, получать ошибки, материться и разводить руками... впрочем как это было и у меня.
После долгих мучений, я пришел к выводу, что каждая подобная установка сводится к индивидуальному подходу. Попробую выложить свой вариант установки, надеюсь он вам поможет!
Итак, установлена чистая наисвежайшая (а данный момент конечно) Debian 9.2, теперь поехали:

Для начала нам необходимо все подготовить и установить необходимые пакеты. Например, для сборки Nginx понадобится Perl библиотека регулярных выражений и заголовки OpenSSL:

Код: Выделить всё

apt-get install libpcre3 libpcre3-dev libssl-dev
Устанавливаем все пакеты, необходимые для сборки

Код: Выделить всё

apt-get install build-dep nginx
Так же поставим утилиту rtmpdump, которая позволит нам понять, работает ли у нас rtmp или нет (я ставил на всякий случай, мне не пригодилась):

Код: Выделить всё

apt-get install rtmpdump
Так же дополнительно я всегда ставлю файловый менеджер MC и утилиту HTOP для просмотра процессов и загрузки

Код: Выделить всё

app-get install htop mc
Далее скачаем сами исходники Nginx, стабильной версии, на данный момент была 1.10.3 и распакуем их:
Иногда загрузка работает только через https://, а иногда только через http://

Код: Выделить всё

wget http://nginx.org/download/nginx-1.10.3.tar.gz

Код: Выделить всё

tar -xzvf nginx-1.10.3.tar.gz
Тоже самое сделаем и с модулем, с которым нам нужно будет скомпилировать Nginx:

Код: Выделить всё

wget https://github.com/arut/nginx-rtmp-module/zipball/master -O nginx-rtmp-module-master.zip

Код: Выделить всё

unzip nginx-rtmp-module-master.zip -d nginx-rtmp-module-master
Видим примерно такую картину
Изображение

Теперь приступим к сборке.
Для начала нужно сконфигурировать Nginx:
Для начала переходим в папку nginx

Код: Выделить всё

cd nginx-1.10.3
А теперь внимательно смотрим имя вложенной папки /nginx-rtmp-module-master/arut-nginx-rtmp-module-0bb2323. У вас оно будет другое!!! Поэтому обязательно в коде поменяйте на свое!!!.
В моем случае имя папки было такое
Изображение
Теперь конфигурируем
Вариант 1Показать

Код: Выделить всё

./configure --prefix=/usr --add-module=../nginx-rtmp-module-master/arut-nginx-rtmp-module-0bb2323/ --pid-path=/var/run/nginx.pid --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module
Вариант 2Показать

Код: Выделить всё

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --user=nginx --group=nginx --without-http_autoindex_module --without-http_ssi_module --without-http_scgi_module --without-http_uwsgi_module --without-http_geo_module --without-http_split_clients_module --without-http_empty_gif_module --without-http_browser_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --with-http_stub_status_module --with-http_random_index_module --with-http_gunzip_module --with-threads --add-module=../nginx-rtmp-module-master/arut-nginx-rtmp-module-0bb2323/
Вариант 3 (наиболее правильный)Показать

Код: Выделить всё

./configure --prefix=/usr --add-module=../nginx-rtmp-module-master/arut-nginx-rtmp-module-791b613/ --pid-path=/var/run/nginx.pid --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module
Важно, чтобы сам rtmp модуль подключился и пути к логам, конфигам и бинарнику были верными. Если все хорошо, то компилируем и устанавливаем:

Код: Выделить всё

make install
Теперь скопируем файл stat.xsl из папки с исходниками в папку nginx:
ВНИМАНИЕ!!! Тут так же меняем имя папки (arut-nginx-rtmp-module-0bb2323) на ваше!

Код: Выделить всё

cp nginx-rtmp-module-master/arut-nginx-rtmp-module-0bb2323/stat.xsl /etc/nginx/
И проверим работу самого nginx.

Код: Выделить всё

service nginx start
Если при запуске сервиса nginx у вас выдает ошибку, что такого сервиса не существует, то делаем следующее:
Открываем в редакторе конфигурационный файл, а точнее создаем новый:

Код: Выделить всё

nano /lib/systemd/system/nginx.service
И вставляем в него этот код
Вариант 1Показать

Код: Выделить всё

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
Вариант 2Показать

Код: Выделить всё

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
 
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /var/run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
 
[Install]
WantedBy=multi-user.target
Сохраняем файл и выполняем следующие команды:

Код: Выделить всё

systemctl unmask nginx.service

Код: Выделить всё

systemctl enable nginx

Код: Выделить всё

systemctl daemon-reload
Ну а теперь можно запускать, останавливать, рестартовать через service, например

Код: Выделить всё

service nginx start

Код: Выделить всё

service nginx stop

Код: Выделить всё

service nginx restart
Либо вообще так

Код: Выделить всё

systemctl restart nginx
Ну и конечно же, при перезагрузки вашего компьютера, либо сервера, ваш nginx будет автоматом стартовать.

В общем-то и все, теперь все работает чудесно! Если у вас все заработало, то обязательно напишите об этом ниже!

Аватара пользователя
ustim
Администратор
Сообщения: 152
Зарегистрирован: 17 янв 2017, 13:11
Откуда: Сочи
Контактная информация:

Конфигурационный файл NGINX

Непрочитанное сообщение ustim »

После всех вышеописанных действий, когда наш NGINX с нашим чудо модулем RTMP работает исправно, мы будет править наш файл конфигурации, по умолчанию он выглядит так:
Файл конфигурации по умолчаниюПоказать

Код: Выделить всё

#user  nobody;
worker_processes  1;

#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;
}


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;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #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;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # 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 {
        server {
                listen 1935;
                chunk_size 4096;
                notify_method get;

                application live {
                        live on;
                        record off;
                        push rtmp://live-fra.twitch.tv/app/ключ потока;
                        push rtmp://a.rtmp.youtube.com/live2/ключ потока;
                }
        }
}
Конечно же не забываем указать ключ вашего потока.

Аватара пользователя
ustim
Администратор
Сообщения: 152
Зарегистрирован: 17 янв 2017, 13:11
Откуда: Сочи
Контактная информация:

Настройка OBS

Непрочитанное сообщение ustim »

Да про настройку OBS и рассказывать даже не стоит... Поскольку мой сервер на Debian имеет постоянный адрес 192.168.1.10, и в конфиге мы указали наш поток - LIVE, то в программе OBS пишем следующее:

Изображение

Аватара пользователя
6014351
Сообщения: 1
Зарегистрирован: 09 мар 2019, 18:10

Re: Устанавливаем NGINX + RTMP модуль, для стримов

Непрочитанное сообщение 6014351 »

Быстро и легко все установилось и заработало благодаря вашему грамотному мануалу (коих в сети мало). Спасибо.
Есть пару ip-камер транслирующих rtsp. Vlc-плеер rtsp-потоки с камер просматривает. Подскажите пожалуйста, как вывести rtsp-потоки, например на веб-страницу? Спасибо.

Аватара пользователя
ustim
Администратор
Сообщения: 152
Зарегистрирован: 17 янв 2017, 13:11
Откуда: Сочи
Контактная информация:

Re: Устанавливаем NGINX + RTMP модуль, для стримов

Непрочитанное сообщение ustim »

6014351 писал(а):
09 мар 2019, 18:16
Быстро и легко все установилось и заработало благодаря вашему грамотному мануалу (коих в сети мало). Спасибо.
Есть пару ip-камер транслирующих rtsp. Vlc-плеер rtsp-потоки с камер просматривает. Подскажите пожалуйста, как вывести rtsp-потоки, например на веб-страницу? Спасибо.
Рад, что помог хоть как-то-)
А для воспроизведения например HLS потока на веб странице можно использовать к примеру jwplayer плеер. Но если хотите транслировать в открытом виде в интернете, то поверье, лучше всего ретранслировать через какой-либо сервис, иначе быстро загнется ваш сайт от нагрузки. Для ретрансляции, как вариант можете использовать либо ютуб, либо goodgame, либо другой аналогичный сервис.

Аватара пользователя
Dimas
Сообщения: 1
Зарегистрирован: 19 июл 2019, 08:28

Re: Устанавливаем NGINX + RTMP модуль, для стримов

Непрочитанное сообщение Dimas »

Впринципи все понятно расписали, все работает отлично, спасибо.

Аватара пользователя
romingood
Сообщения: 1
Зарегистрирован: 11 окт 2019, 16:35

Re: Устанавливаем NGINX + RTMP модуль, для стримов

Непрочитанное сообщение romingood »

Спасибо за подробную инструкцию!
Не подскажете, как лучше реализовать авторизацию при трансляции с компьютера или телефона (посредством токена или в OBS это кажется называется Имя потока).

Не могу понять, как передать из OBS (или любой другой проги для вещания) токен и потом его поймать на сервере.
В принципе, можно просто создавать рандомно имя потока из 8 символов, но это имя потока видно в URL проги для вещания. Не хочется, чтобы прям так открыто было. А пот поле Стрим Id (кажется оно так называется) закрыто звездочками - как раз то, что нужно.

Спасибо заранее!

Ответить