Пример сборки Nginx'а с модулем RTPM на системе Ubuntu
Обновляем список пакетов и обновляем их:
apt update apt upgrade -y
Устанавливаем необходимые пакеты для сборки:
apt install unzip build-essential libpcre3 libpcre3-dev openssl libssl-dev zlib1g zlib1g-dev libxslt-dev libgd-dev libgeoip-dev
Список аргументов можно подсмотреть где-то на ноде с установленным Nginx с пакетного менеджера.
nginx -V nginx version: nginx/1.14.0 (Ubuntu) built with OpenSSL 1.1.0g 2 Nov 2017 TLS SNI support enabled configure arguments: --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
Если нет под рукой Nginx, то можно использовать аргументы для конфигурации ниже.
mkdir /tmp/hls cd /tmp/hls
Скачиваем исходный код модуля:
wget https://codeload.github.com/arut/nginx-rtmp-module/zip/master unzip master
Скачиваем Nginx (поменяйте на актуальную версию Nginx'а)
wget http://nginx.org/download/nginx-1.16.0.tar.gz tar -xf tar -xf nginx-1.16.0.tar.gz
Переходим в разархивированную директорию с исходниками Nginx'а:
cd nginx-1.16.0
Добавляем в список аргументов "—add-module=/tmp/hls/nginx-rtmp-module-master" и выполняем "configure"
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-module=/tmp/hls/nginx-rtmp-module-master
Собираем:
make
Можно собирать используя мультипоточность, к примеру "make -j 4", где 4 — количество потоков
Если возникла подобная ошибка:
/tmp/hls/nginx-rtmp-module-master/ngx_rtmp_stat_module.c: In function ‘ngx_rtmp_stat_handler’: /tmp/hls/nginx-rtmp-module-master/ngx_rtmp_stat_module.c:771:67: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time] NGX_RTMP_STAT_L("<built>" __DATE__ " " __TIME__ "</built>\r\n"); ^ /tmp/hls/nginx-rtmp-module-master/ngx_rtmp_stat_module.c:771:67: error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time] cc1: all warnings being treated as errors objs/Makefile:1743: recipe for target 'objs/addon/nginx-rtmp-module-master/ngx_rtmp_stat_module.o' failed make[1]: *** [objs/addon/nginx-rtmp-module-master/ngx_rtmp_stat_module.o] Error 1 make[1]: Leaving directory '/tmp/hls/nginx-1.16.0' Makefile:8: recipe for target 'build' failed make: *** [build] Error 2
То необходимо переконфигурировать без этого ключа: "-Wdate-time" в секции "—with-cc-opt=" и заново запустить "make"
Если все собралось без ошибок, то устанавливаем:
make install
Добавляем сервис:
cat <<EOF >/lib/systemd/system/nginx.service # Stop dance for nginx # ======================= # # ExecStop sends SIGSTOP (graceful stop) to the nginx process. # If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control # and sends SIGTERM (fast shutdown) to the main process. # After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends # SIGKILL to all the remaining processes in the process group (KillMode=mixed). # # nginx signals reference doc: # http://nginx.org/en/docs/control.html # [Unit] Description=A high performance web server and a reverse proxy server Documentation=man:nginx(8) After=network.target [Service] Type=forking PIDFile=/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 /run/nginx.pid TimeoutStopSec=5 KillMode=mixed [Install] WantedBy=multi-user.target EOF
Создаем пользователя:
adduser --system --no-create-home --user-group -s /sbin/nologin nginx
Или используем "nobody" в "nginx.conf"
Добавляем Nginx в автозапуск:
systemctl enable nginx
Запускаем и проверяем его статус:
systemctl start nginx systemctl status nginx
Установливаем необходимые пакеты для стриминга:
apt install ffmpeg rtmpdump
Открываем файл конфигурации Nginx'а:
vim /etc/nginx/nginx.conf
И добавляем отдельно от существующего блока "http" следующее:
rtmp { server { listen 1935; application live { live on; } } }
И перечитываем конфигурацию Nginx'а.
Попробуем стримить с мака на Nginx сервер:
brew install ffmpeg
Смотрим список устройств:
ffmpeg -f avfoundation -list_devices true -i "" [AVFoundation input device @ 0x7fc2eacc9d00] AVFoundation video devices: [AVFoundation input device @ 0x7fc2eacc9d00] [0] FaceTime HD Camera [AVFoundation input device @ 0x7fc2eacc9d00] [1] Capture screen 0 [AVFoundation input device @ 0x7fc2eacc9d00] AVFoundation audio devices: [AVFoundation input device @ 0x7fc2eacc9d00] [0] Built-in Microphone
Проверяем запись:
ffmpeg -f avfoundation -framerate 30 -i "0" out.mpg
Терминал может запросить разрешение на доступ к вебкамере
Если все ок, то в текущей директории должен появиться видеофайл с именем "out.mpg"
Запускаем стрим на сервер:
ffmpeg -f avfoundation -r 30 -i "0:0" -deinterlace -vcodec libx264 -pix_fmt yuv420p -preset medium -g 60 -b:v 2500k -acodec libmp3lame -ar 44100 -threads 6 -qscale 3 -b:a 712000 -bufsize 512k -f flv rtmp://1.2.3.4/live/stream
При использовании ключа -i "0:0" будет так же передаваться звук с микрофона, только для одного видео потока используйте -i "0"
1.2.3.4 — IP адрес или DNS имя сервера Nginx
Открываем VLC и выбираем "File" -> "Open network" и указываем наш URL:
rtmp://1.2.3.4/live/stream
Не забываем разрешить на Nginx сервере TCP порт 1935.
Я поднимал похожим образом стриминговое реле на основе nginx-rtmp (чтобы можно было стримить на ютуб и твитч одновременно). При этом кодированием видео занималась Raspberry Pi (которая имеет встроенный аппаратный кодировщик видео) на которую я слал несжатый видеопоток. Работало, но пи не всегда справлялась). Тут задача чуть другая, но могу поделиться конфигами, если интересно.