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

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-сервера на базе 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% указывают на необходимость оптимизации.
При подготовке сервера выполните следующие шаги:
- Установите ОС на базе Linux (Ubuntu 22.04 LTS или Debian 12) с минимальным набором пакетов (
sudo apt install --no-install-recommends). - Отключите ненужные сервисы:
systemctl disable --now cups avahi-daemon apport. - Настройте сетевой стек: увеличьте размер буферов TCP (
net.core.rmem_max=16777216,net.core.wmem_max=16777216) и отключите IPv6, если не используется. - Обновите микрокод процессора (
sudo apt install intel-microcodeилиamd64-microcode) и включите энергосберегающие режимы (cpupower frequency-set -g performance). - Настройте брандмауэр: разрешите порты 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-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

Файл 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;
}
}
Эти уведомления позволяют отслеживать события публикации и воспроизведения в реальном времени через внешний обработчик.
