Создание RTMP сервера пошаговая инструкция

Как создать rtmp сервер

Содержание статьи

Как создать rtmp сервер

RTMP (Real-Time Messaging Protocol) остаётся одним из ключевых протоколов для стриминга видео в реальном времени. Его используют платформы вроде Twitch, YouTube Live и собственные медиасерверы для трансляций с низкой задержкой. В этой инструкции разберём, как развернуть RTMP-сервер на базе Nginx с модулем nginx-rtmp – решение, проверенное на нагрузках до 1000 одновременных подключений при задержке 1–3 секунды.

Для работы потребуется сервер с Ubuntu 22.04 LTS или Debian 11, минимум 2 ГБ ОЗУ и 2 ядра CPU. Если планируете стримить в 1080p60, выделите не менее 4 ГБ ОЗУ и SSD-накопитель. Избегайте виртуальных хостингов с общими ресурсами – RTMP чувствителен к сетевым задержкам и джиттеру. Оптимальный вариант: VPS с гарантированной пропускной способностью 1 Гбит/с (например, Hetzner, OVH или DigitalOcean).

Модуль nginx-rtmp расширяет стандартный Nginx функционалом приёма и ретрансляции потоков. Он поддерживает HLS и DASH для адаптивного стриминга, а также позволяет ограничивать доступ по ключам трансляции. В отличие от готовых решений вроде Wowza или Red5, этот подход даёт полный контроль над конфигурацией и не требует лицензионных отчислений. Однако учтите: без дополнительных модулей (например, ffmpeg для перекодирования) сервер будет только ретранслировать поток без обработки.

В инструкции рассмотрим установку с нуля, настройку базового конфига для приёма потоков с OBS Studio или vMix, а также интеграцию с HLS для воспроизведения на веб-страницах. Особое внимание уделим безопасности: отключим ненужные порты, настроим fail2ban для защиты от брутфорса и ограничим доступ к админ-панели RTMP. Если планируете использовать сервер в продакшене, сразу настройте SSL (Let’s Encrypt) для шифрования трафика.

Создание RTMP сервера: пошаговая инструкция

Создание RTMP сервера: пошаговая инструкция

Для развёртывания RTMP-сервера на базе nginx с модулем nginx-rtmp-module потребуется сервер с Ubuntu 22.04 LTS или Debian 11. Установите зависимости:

  • sudo apt update && sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev
  • Скачайте исходники nginx и модуль: wget https://nginx.org/download/nginx-1.25.3.tar.gz && wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.2.tar.gz
  • Распакуйте архивы и соберите nginx с модулем:
    tar -xzvf nginx-1.25.3.tar.gz
    tar -xzvf v1.2.2.tar.gz
    cd nginx-1.25.3
    ./configure --add-module=../nginx-rtmp-module-1.2.2 --with-http_ssl_module
    make && sudo make install
    

После установки отредактируйте конфигурационный файл /usr/local/nginx/conf/nginx.conf, добавив в секцию http блок rtmp:

rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
allow publish 127.0.0.1;
allow publish ваш_IP;
deny publish all;
}
}
}

Запустите сервер командой sudo /usr/local/nginx/sbin/nginx. Проверьте доступность порта 1935 через netstat -tulnp | grep nginx. Для стриминга используйте OBS Studio или ffmpeg с параметрами: ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://ваш_IP/live/stream_key.

Для мониторинга подключений и статистики добавьте в конфигурацию rtmp директиву on_publish http://localhost:8080/auth; и разверните простой HTTP-сервер на Python для обработки запросов. Пример скрипта:

from flask import Flask, request
app = Flask(__name__)
@app.route('/auth', methods=['POST'])
def auth():
ip = request.remote_addr
key = request.args.get('name')
print(f"Попытка публикации от {ip} с ключом {key}")
return "", 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)

Запустите скрипт и перезагрузите nginx (sudo /usr/local/nginx/sbin/nginx -s reload). Теперь все попытки публикации будут логироваться. Для ограничения битрейта добавьте в application live параметр exec ffmpeg -i rtmp://localhost/live/$name -c copy -f flv -b:v 2000k rtmp://localhost/live/${name}_low;, где 2000k – максимальный битрейт в кбит/с.

Обеспечьте безопасность сервера: закройте порт 1935 в файрволе для всех IP, кроме доверенных (sudo ufw allow from ваш_IP to any port 1935), и настройте HTTPS для админки nginx-rtmp-module. В конфигурации nginx.conf добавьте:

location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
allow ваш_IP;
deny all;
}

Скачайте stat.xsl из репозитория модуля и разместите в /usr/local/nginx/html/. Теперь статистика будет доступна по адресу http://ваш_IP/stat только с разрешенных IP. Для автоматического перезапуска nginx при падении используйте systemd:

sudo nano /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target

Активируйте сервис: sudo systemctl enable --now nginx. Проверьте статус: sudo systemctl status nginx.

Выбор и подготовка серверного оборудования для потоковой передачи

Выбор и подготовка серверного оборудования для потоковой передачи

Для RTMP-сервера критически важны три параметра: процессор, сетевая пропускная способность и дисковая подсистема. Минимальные требования начинаются с 4-ядерного CPU с тактовой частотой от 3 ГГц (например, Intel Xeon E-2236 или AMD Ryzen 5 5600X), но для одновременной обработки 10+ потоков в 1080p потребуется 8–12 ядер. При выборе процессора обращайте внимание на поддержку аппаратного ускорения кодирования: Intel Quick Sync (для FFmpeg) или NVIDIA NVENC (если планируется транскодирование). Для тестов используйте stress-ng --cpu 4 --cpu-method matrixprod, чтобы проверить стабильность под нагрузкой.

Сетевой интерфейс должен обеспечивать пропускную способность не менее 1 Гбит/с, а для масштабирования – 10 Гбит/с. Проверьте реальную скорость с помощью iperf3 -c <сервер> -t 60 -P 10; при 10 потоках по 5 Мбит/с суммарный трафик составит ~50 Мбит/с, но пиковые нагрузки могут достигать 200–300 Мбит/с. Используйте сетевые карты с поддержкой TCP Offload Engine (TOE) и Jumbo Frames (MTU 9000), чтобы снизить нагрузку на CPU. Для облачных решений выбирайте провайдеров с гарантированной пропускной способностью (например, Hetzner AX или OVH Advance).

Дисковая подсистема влияет на задержки при записи потоков. Для временного хранения (кеширования) используйте NVMe SSD с IOPS от 50 000 (например, Samsung 980 Pro или WD Black SN850X). Если планируется длительное хранение записей, добавьте HDD в RAID 10 (например, 4× Seagate Exos 7E8) с контроллером, поддерживающим кэширование записи. Избегайте программных RAID – они увеличивают задержки на 15–20%. Для мониторинга дисковой нагрузки используйте iostat -x 1; значения %util выше 70% указывают на необходимость оптимизации.

При подготовке сервера выполните следующие шаги:

  1. Установите ОС на базе Linux (Ubuntu 22.04 LTS или Debian 12) с минимальным набором пакетов (sudo apt install --no-install-recommends).
  2. Отключите ненужные сервисы: systemctl disable --now cups avahi-daemon apport.
  3. Настройте сетевой стек: увеличьте размер буферов TCP (net.core.rmem_max=16777216, net.core.wmem_max=16777216) и отключите IPv6, если не используется.
  4. Обновите микрокод процессора (sudo apt install intel-microcode или amd64-microcode) и включите энергосберегающие режимы (cpupower frequency-set -g performance).
  5. Настройте брандмауэр: разрешите порты 1935 (RTMP), 80/443 (HTTP/HTTPS) и 1936 (RTMPT), если требуется туннелирование.

Перед запуском сервера протестируйте оборудование с помощью sysbench cpu --threads=8 run и fio --name=test --ioengine=libaio --rw=randwrite --bs=4k --numjobs=4 --size=1G --runtime=60 для проверки дисковой подсистемы.

Установка и настройка операционной системы под RTMP сервер

После установки обновите систему: sudo apt update && sudo apt upgrade -y. Установите необходимые зависимости: sudo apt install -y build-essential git curl wget openssl libssl-dev zlib1g-dev libpcre3 libpcre3-dev libbz2-dev libxml2-dev libxslt1-dev libgd-dev libgeoip-dev. Настройте firewall с помощью ufw: sudo ufw allow 1935/tcp (RTMP по умолчанию) и sudo ufw allow 22/tcp для SSH, затем активируйте его.

Отключите ненужные сервисы для снижения нагрузки: sudo systemctl disable --now apport cups bluetooth avahi-daemon. Настройте параметры ядра для работы с высокой сетевой нагрузкой, добавив в /etc/sysctl.conf следующие строки:

net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_tw_reuse=1
net.ipv4.ip_local_port_range=1024 65535
fs.file-max=100000

Примените изменения: sudo sysctl -p. Увеличьте лимиты открытых файлов для пользователя, от имени которого будет запущен сервер, добавив в /etc/security/limits.conf:

* soft nofile 100000
* hard nofile 100000

Настройте автоматическое обновление безопасности: sudo apt install -y unattended-upgrades, затем отредактируйте /etc/apt/apt.conf.d/50unattended-upgrades, раскомментировав и указав:

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";

Для мониторинга производительности установите sudo apt install -y htop iotop iftop nload. Настройте логирование с ротацией логов, отредактировав /etc/logrotate.conf:

rotate 7
daily
compress
missingok
notifempty

Создайте отдельного пользователя для RTMP сервера: sudo adduser --system --group --shell /bin/false rtmp. Настройте SSH-доступ только по ключам, отключив аутентификацию по паролю в /etc/ssh/sshd_config:

PasswordAuthentication no
PermitRootLogin no

Перезапустите SSH: sudo systemctl restart sshd. Проверьте сетевые настройки: ip a и ss -tulnp – убедитесь, что на сервере нет открытых портов, кроме необходимых. Для серверов с высокой нагрузкой рекомендуется использовать сетевой интерфейс в режиме mtu 1500 и отключить IPv6, если он не требуется.

Скачивание и компиляция исходного кода NGINX с модулем RTMP

Скачивание и компиляция исходного кода NGINX с модулем RTMP

Для сборки NGINX с поддержкой RTMP потребуется исходный код сервера и модуль nginx-rtmp-module. Начните с установки зависимостей: build-essential, libpcre3, libpcre3-dev, zlib1g, zlib1g-dev и libssl-dev. Выполните команду для Debian/Ubuntu: sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev. На CentOS/RHEL используйте: sudo yum groupinstall "Development Tools" && sudo yum install -y pcre pcre-devel zlib zlib-devel openssl-devel.

Скачайте последнюю стабильную версию NGINX с официального сайта. Например, для версии 1.25.3: wget https://nginx.org/download/nginx-1.25.3.tar.gz && tar -xzvf nginx-1.25.3.tar.gz. Параллельно клонируйте репозиторий модуля RTMP: git clone https://github.com/arut/nginx-rtmp-module.git. Убедитесь, что оба архива распакованы в одном каталоге, например, /opt/nginx-rtmp.

Перейдите в директорию с исходным кодом NGINX: cd nginx-1.25.3. Запустите конфигурацию сборки с указанием пути к модулю RTMP: ./configure --add-module=../nginx-rtmp-module --with-http_ssl_module --with-http_v2_module. Флаги --with-http_ssl_module и --with-http_v2_module обязательны для поддержки HTTPS и HTTP/2, что критично для современных стриминговых решений.

Если конфигурация завершилась без ошибок, выполните компиляцию: make. Процесс займет 2–5 минут в зависимости от производительности системы. После успешной сборки установите NGINX: sudo make install. По умолчанию бинарные файлы и конфигурации будут размещены в /usr/local/nginx. Проверьте корректность установки: /usr/local/nginx/sbin/nginx -v.

Модуль RTMP требует настройки в конфигурационном файле NGINX. Откройте /usr/local/nginx/conf/nginx.conf и добавьте блок rtmp { ... } в основной раздел. Пример минимальной конфигурации для приема потоков: rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; } } }. Параметр chunk_size оптимизирует передачу данных для низколатентных соединений.

Запустите NGINX: sudo /usr/local/nginx/sbin/nginx. Проверьте работу RTMP-сервера с помощью OBS Studio или FFmpeg. Для тестового стрима используйте команду: ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -c:a aac -f flv rtmp://localhost/live/streamkey. Логи NGINX доступны в /usr/local/nginx/logs/error.log – анализируйте их при возникновении ошибок.

Для автоматического запуска NGINX при загрузке системы создайте unit-файл systemd: sudo nano /etc/systemd/system/nginx.service. Вставьте конфигурацию: [Unit]

Description=The NGINX HTTP and reverse proxy server

After=network.target

[Service]

Type=forking

ExecStart=/usr/local/nginx/sbin/nginx

ExecReload=/usr/local/nginx/sbin/nginx -s reload

ExecStop=/usr/local/nginx/sbin/nginx -s quit

PrivateTmp=true

[Install]

WantedBy=multi-user.target. Активируйте сервис: sudo systemctl enable --now nginx. Убедитесь, что порт 1935 открыт в брандмауэре: sudo ufw allow 1935/tcp.

Конфигурирование основных параметров RTMP в файле nginx.conf

Конфигурирование основных параметров RTMP в файле nginx.conf

Файл nginx.conf – центральный элемент настройки RTMP-модуля в Nginx. Располагается он обычно в директории /etc/nginx/ или /usr/local/nginx/conf/. Перед редактированием создайте резервную копию оригинального файла. Основной блок конфигурации RTMP начинается с директивы rtmp {}, внутри которой задаются все параметры потоковой передачи.

Первым шагом определите порт для RTMP-сервера. По умолчанию используется 1935, но его можно изменить на любой свободный, например 1936. Укажите это в секции listen:

rtmp {
server {
listen 1935;
chunk_size 4096;
}
}

Значение chunk_size влияет на размер пакетов данных – 4096 байт оптимально для большинства сценариев, но при высоких нагрузках можно увеличить до 8192.

Для обработки входящих потоков создайте блок application с уникальным именем, например live. Внутри него настройте параметры публикации и воспроизведения:

application live {
live on;
record off;
allow publish 127.0.0.1;
deny publish all;
allow play all;
}

Директива live on включает режим реального времени, а record off отключает запись потоков на диск. Ограничьте публикацию только доверенными IP-адресами с помощью allow publish и deny publish.

Для транскодирования или ретрансляции потоков используйте exec или push. Пример ретрансляции на другой сервер:

application relay {
live on;
push rtmp://backup-server/live;
}

Это полезно для балансировки нагрузки или создания резервных копий потоков. Учтите, что каждый push увеличивает нагрузку на сервер.

Настройте буферизацию для стабилизации потока. Параметр buflen определяет размер буфера в миллисекундах:

rtmp {
server {
buflen 1000;
}
}

Значение 1000 мс подходит для большинства случаев. При высоких задержках сети увеличьте до 2000-3000, но это повысит общую задержку вещания.

Для защиты от перегрузок ограничьте количество одновременных подключений. Используйте директивы max_connections и max_watchers:

application secure {
live on;
max_connections 1000;
max_watchers 500;
}

Здесь max_connections ограничивает общее число подключений, а max_watchers – только зрителей. Превышение лимитов приведет к отказу в подключении.

Логирование событий RTMP настраивается отдельно от основного лога Nginx. Добавьте блок access_log в секцию application:

application log_example {
live on;
access_log /var/log/nginx/rtmp_access.log;
}

Формат лога можно кастомизировать с помощью переменных, например $remote_addr для IP-адреса клиента или $name для имени потока. Включите ротацию логов, чтобы избежать переполнения диска.

После внесения изменений проверьте синтаксис конфигурации командой nginx -t. Если ошибок нет, перезагрузите Nginx: systemctl reload nginx или nginx -s reload. Для мониторинга активных потоков используйте встроенный HTTP-интерфейс RTMP:

rtmp {
server {
listen 1935;
notify_method get;
on_publish http://127.0.0.1:8080/publish;
on_play http://127.0.0.1:8080/play;
}
}

Эти уведомления позволяют отслеживать события публикации и воспроизведения в реальном времени через внешний обработчик.

Вопрос-ответ:

Ссылка на основную публикацию