Гид по технологиям

Установка и настройка Nginx с модулем RTMP на CentOS 7

6 min read Видеостриминг Обновлено 26 Nov 2025
Nginx с RTMP на CentOS 7 — установка и настройка
Nginx с RTMP на CentOS 7 — установка и настройка

Иллюстрация RTMP и Nginx

Кратко

В этом руководстве показано, как собрать, установить и настроить Nginx с модулем nginx-rtmp на сервере CentOS 7 для живой трансляции (RTMP/HLS) и видео по запросу (VOD). Вы получите рабочий поток: сборка из исходников, служба systemd, конфигурация RTMP/HLS, тесты через VLC и OBS. Включены рекомендации по безопасности, проверке и альтернативные варианты развёртывания.

Введение

RTMP (Real Time Messaging Protocol) — высокопроизводительный протокол для передачи данных, аудио и видео по сети, исторически связанный с Flash и используемый для стриминга в реальном времени. Модуль nginx-rtmp расширяет Nginx возможностями приема RTMP-потоков, подготовки HLS и поддержки VOD.

Этот материал шаг за шагом показывает установку из исходников на CentOS 7, настройку службы systemd, базовую конфигурацию RTMP/HLS, организацию VOD, тестирование с VLC и OBS, а также практические рекомендации по безопасности, отказоустойчивости и проверке работоспособности.

Важно: инструкция предполагает работу под root или эквивалентными правами. Следуйте корпоративным политикам по безопасности при открытии портов и хранении медиа.

Основные требования

  • Сервер с CentOS 7
  • Root-привилегии или sudo
  • Доступ в интернет для загрузки исходников

Что будет сделано

  1. Установка зависимостей
  2. Загрузка исходников Nginx и модулей (pcre, zlib, OpenSSL, nginx-rtmp)
  3. Компиляция Nginx с модулем RTMP
  4. Создание systemd unit для Nginx
  5. Конфигурация nginx.conf с RTMP и HLS
  6. Настройка VOD и live-приложений
  7. Тестирование через VLC и OBS

Преимущества и ограничения

  • Преимущества:

    • Полный контроль над сборкой (опции, модули, отладка).
    • Малые накладные расходы, производительный потоковый сервер.
    • Поддержка RTMP, HLS, MPEG-DASH (через дополнительные модули).
  • Ограничения:

    • Поддержка RTMP требует сборки из исходников, если вам нужен нестандартный набор модулей.
    • Для масштабирования реального времени потребуется балансировка и распределённое хранение сегментов HLS.

Факто-бокс: ключевые настройки

  • Порт RTMP: 1935
  • Порт HTTP для HLS по умолчанию в примере: 8080
  • Путь HLS в примере: /mnt/hls/
  • Путь VOD (mp4): /mnt/mp4s

Шаг 1 — установка зависимостей

Устанавливаем инструменты сборки и зависимости. В примерах используются команды для CentOS 7.

sudo yum -y groupinstall 'Development Tools'

Добавляем репозиторий EPEL:

sudo yum -y install epel-release

Устанавливаем дополнительные пакеты:

sudo yum install -y  wget git unzip perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel pcre-devel GeoIP GeoIP-devel

Ожидайте завершения установки всех пакетов.

Установка зависимостей для Nginx и RTMP

Шаг 2 — загрузка исходников Nginx и модуля RTMP

Работаем в каталоге /usr/local/src:

cd /usr/local/src

Загружаем Nginx 1.14.0 и распаковываем:

wget https://nginx.org/download/nginx-1.14.0.tar.gz  
tar -xzvf nginx-1.14.0.tar.gz

Загружаем и распаковываем pcre, zlib, OpenSSL:

wget https://ftp.pcre.org/pub/pcre/pcre-8.42.zip  
unzip pcre-8.42.zip

wget https://www.zlib.net/zlib-1.2.11.tar.gz  
tar -xzvf zlib-1.2.11.tar.gz

wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz  
tar -xzvf openssl-1.1.0h.tar.gz

Клонируем nginx-rtmp-module:

git clone https://github.com/sergey-dryabzhinsky/nginx-rtmp-module.git

Очищаем архивы:

rm -f *.tar.gz *.zip

Проверяем каталоги:

ls -lah

Исходники Nginx и модулей загружены

Шаг 3 — компиляция и установка Nginx с модулем RTMP

Переходим в каталог исходников и конфигурируем сборку с набором опций и подключением модулей:

cd nginx-1.14.0/

Запускаем configure с параметрами (копируйте и используйте как есть):

./configure --prefix=/etc/nginx \  
            --sbin-path=/usr/sbin/nginx \  
            --modules-path=/usr/lib64/nginx/modules \  
            --conf-path=/etc/nginx/nginx.conf \  
            --error-log-path=/var/log/nginx/error.log \  
            --pid-path=/var/run/nginx.pid \  
            --lock-path=/var/run/nginx.lock \  
            --user=nginx \  
            --group=nginx \  
            --build=CentOS \  
            --builddir=nginx-1.14.0 \  
            --with-select_module \  
            --with-poll_module \  
            --with-threads \  
            --with-file-aio \  
            --with-http_ssl_module \  
            --with-http_v2_module \  
            --with-http_realip_module \  
            --with-http_addition_module \  
            --with-http_xslt_module=dynamic \  
            --with-http_image_filter_module=dynamic \  
            --with-http_geoip_module=dynamic \  
            --with-http_sub_module \  
            --with-http_dav_module \  
            --with-http_flv_module \  
            --with-http_mp4_module \  
            --with-http_gunzip_module \  
            --with-http_gzip_static_module \  
            --with-http_auth_request_module \  
            --with-http_random_index_module \  
            --with-http_secure_link_module \  
            --with-http_degradation_module \  
            --with-http_slice_module \  
            --with-http_stub_status_module \  
            --http-log-path=/var/log/nginx/access.log \  
            --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 \  
            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \  
            --http-scgi-temp-path=/var/cache/nginx/scgi_temp \  
            --with-mail=dynamic \  
            --with-mail_ssl_module \  
            --with-stream=dynamic \  
            --with-stream_ssl_module \  
            --with-stream_realip_module \  
            --with-stream_geoip_module=dynamic \  
            --with-stream_ssl_preread_module \  
            --with-compat \  
            --with-pcre=../pcre-8.42 \  
            --with-pcre-jit \  
            --with-zlib=../zlib-1.2.11 \  
            --with-openssl=../openssl-1.1.0h \  
            --with-openssl-opt=no-nextprotoneg \  
            --add-module=../nginx-rtmp-module \  
            --with-debug

Собираем и устанавливаем:

sudo make  
sudo make install

Далее создаём символьную ссылку на папку модулей, пользователя nginx и кэш-директорию:

sudo ln -s /usr/lib64/nginx/modules /etc/nginx/modules

sudo useradd -r -d /var/cache/nginx/ -s /sbin/nologin -U nginx

mkdir -p /var/cache/nginx/  
chown -R nginx:nginx /var/cache/nginx/

Проверяем конфигурацию и версию Nginx:

nginx -t  
nginx -V

Nginx успешно скомпилирован

Шаг 4 — запуск Nginx как systemd-сервиса

Создаём unit-файл systemd для управления сервисом.

cd /lib/systemd/system/  
vim nginx.service

Вставьте следующий блок и сохраните файл:

[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

Применяем изменения systemd и запускаем сервис:

systemctl daemon-reload

systemctl start nginx  
systemctl enable nginx

Сервер Nginx теперь работает как служба systemd.

systemd unit Nginx

Шаг 5 — конфигурация модуля Nginx RTMP

Делаем резервную копию оригинального nginx.conf и создаём собственный конфиг.

cd /etc/nginx/  
mv nginx.conf nginx.conf.asli

vim nginx.conf

Вставьте конфигурацию RTMP + HTTP (HLS):

worker_processes  auto;
events {
    worker_connections  1024;
}

# RTMP configuration
rtmp {
    server {
        listen 1935; # Listen on standard RTMP port
        chunk_size 4000;

# Define the Application
        application show {
            live on;
            # Turn on HLS
            hls on;
            hls_path /mnt/hls/;
            hls_fragment 3;
            hls_playlist_length 60;
            # disable consuming the stream from nginx as rtmp
            deny play all;
        }

    }
}

http {
    sendfile off;
    tcp_nopush on;
    aio on;
    directio 512;
    default_type application/octet-stream;

    server {
        listen 8080;

        location / {
            # Disable cache
            add_header 'Cache-Control' 'no-cache';

            # CORS setup
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length';

            # allow CORS preflight requests
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                return 204;
            }

            types {
                application/dash+xml mpd;
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }

            root /mnt/;
        }
    }
}

Сохраняем и создаём директорию для HLS, назначаем владельца:

mkdir -p /mnt/hls  
chown -R nginx:nginx /mnt/hls

Проверяем конфигурацию и перезапускаем сервис:

nginx -t  
systemctl restart nginx

Конфигурация Nginx для RTMP

Шаг 6 — настройка первого live-потока и VOD

Добавим в секцию rtmp дополнительные приложения для VOD и live. Откройте /etc/nginx/nginx.conf и измените/дополните блок rtmp:

        # RTMP video on demand for mp4 files
        application vod {
            play /mnt/mp4s;
        }

        # RTMP stream using OBS
        application stream {
            live on;
        }

Создаём каталог для mp4 и назначаем владельца:

mkdir -p /mnt/mp4s  
chown -R nginx:nginx /mnt/mp4s

Проверяем и перезапускаем Nginx:

nginx -t  
systemctl restart nginx

Теперь у вас есть:

  • VOD: rtmp://:1935/vod/
  • Live (приём от OBS): rtmp://:1935/stream/

Настройка live-потока

Шаг 7 — тестирование

Тест VOD в VLC

  1. Откройте VLC.
  2. Меню “Файл” → “Открыть сеть” (Open Network).
  3. Введите URL VOD: rtmp://192.168.1.10:1935/vod/file.mp4
  4. Нажмите “Открыть”.

Настройка клиента RTMP

Результат: видео воспроизводится в медиаплеере.

RTMP: воспроизведение видео

Тест live-потока через OBS + VLC

  1. В OBS настройте поток: тип сервера = Custom, URL = rtmp://192.168.1.10:1935/stream, Stream Key — по желанию.
  2. Начните трансляцию в OBS.
  3. В VLC откройте сеть и введите rtmp://192.168.1.10:1935/stream/

Конфигурация OBS для live-потока

Если всё настроено верно, VLC начнёт получать поток.

Live-поток в медиаплеере

Результат live-стрима через nginx-rtmp

Безопасность и жёсткая настройка

  • Ограничьте доступ к RTMP-порту (1935) через firewall, разрешая только доверенные IP.
  • Настройте authentication/ключи на стороне приложения (например, проверка ключа в URL или внешняя HTTP-аутентификация через on_publish/on_play callbacks).
  • Храните HLS/MP4 в защищённых разделах с корректными правами, периодически очищайте временные файлы.
  • Отключите ненужные модули в сборке для уменьшения поверхности атаки.
  • Используйте HTTPS/TLS (сборка с OpenSSL) для защиты управления и HLS-over-HTTPS.

Пример iptables (простой):

# Разрешить доступ к RTMP только из подсети 10.0.0.0/24
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="1935" accept'
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

Альтернативные подходы

  • Установить предварительно собранный пакет nginx с уже включённым модулем (например, nginx-extras в других дистрибутивах) — быстрее, но дает меньше контроля.
  • Использовать специализированные потоковые продукты (Wowza, Red5, Flussonic) — больше фич, коммерческая поддержка, но выше стоимость.
  • Запустить nginx с RTMP в контейнере (Docker) — упрощает деплой и обновления, требует управления хранением сегментов HLS.

Мини-методология (шаблон действий)

  1. Подготовка сервера: обновление, установка зависимостей.
  2. Загрузка исходников и модулей.
  3. Конфигурация сборки в соответствии с требованиями безопасности и функциональности.
  4. Сборка, установка, проверка bin и модулей.
  5. Создание systemd unit и настройка автозапуска.
  6. Настройка RTMP/HLS/VOD, права на каталоги.
  7. Тестирование клиентами (VLC, OBS), мониторинг логов.
  8. Жёсткая настройка firewall и механизмов аутентификации.

Чек-листы по ролям

Администратор сервера:

  • Обновить OS и установить зависимости.
  • Настроить firewall и SELinux (при использовании).
  • Создать пользователя nginx и задать права файлов.
  • Настроить systemd unit и мониторинг.

Инженер стриминга / оператор:

  • Настроить OBS/Encoder на передачу в rtmp:///stream.
  • Проверить HLS-плейлист и сегменты в /mnt/hls.
  • Загружать mp4 в /mnt/mp4s и проверять VOD-поток.

DevOps / CI:

  • Автоматизировать сборку и деплой конфигураций.
  • Настроить бэкапы конфигов и ротацию логов.
  • Включить алерты на ошибочные публ и on_publish failures.

Критерии приёмки

  • Nginx запущен как служба systemd и автозапуск включён.
  • Приём RTMP-потоков на порт 1935 работает.
  • HLS-плейлисты генерируются в /mnt/hls и доступны по HTTP.
  • VOD mp4 воспроизводится через rtmp://:1935/vod/ в VLC.
  • Live-поток из OBS виден в VLC.
  • Firewall настроен и доступ ограничен по политике.

Тестовые случаи и проверка

  1. Положительный: отправить тестовый поток с OBS → ожидать видимость в VLC.
  2. Верификация VOD: поместить test.mp4 в /mnt/mp4s → воспроизвести rtmp://…/vod/test.mp4.
  3. Негативный: попытка воспроизвести несуществующий файл → корректный код ошибки и запись в лог.
  4. Security: попытка подключения с незадекларированного IP (если firewall настроен) → должно блокироваться.

Отказ и откат

  • Если после сборки Nginx не запускается: восстановите nginx.conf из nginx.conf.asli и запустите systemctl restart nginx.
  • Если модуль RTMP вызывает критические ошибки, остановите сервис и проверьте журнал: journalctl -u nginx –no-pager.

Частые ошибки и решения

  • Ошибка конфигурации nginx -t → внимательно проверьте синтаксис nginx.conf (особенно пути к каталогам и директивы rtmp).
  • Проблемы с правами доступа к /mnt/hls или /mnt/mp4s → chown -R nginx:nginx <каталог>.
  • Невидимый поток в VLC при OBS → проверить адрес сервера, firewall, и что OBS успешно устанавливает соединение (лог OBS).

Сопровождение и масштабирование

Для увеличения нагрузки:

  • Используйте балансировщик (NGINX или специализированный LB) перед нодами приёма RTMP.
  • Разделите хранение сегментов HLS на отдельные файловые серверы или CDN.
  • Используйте репликацию/кэширование HLS для уменьшения нагрузки на origin.

Краткое резюме

Установка Nginx с модулем RTMP на CentOS 7 даёт гибкую платформу для собственной инфраструктуры стриминга. Собирая из исходников, вы получаете контроль над опциями и безопасность. После базовой настройки проверьте VOD и live-трансляции, ограничьте доступ и добавьте monitoring для стабильной эксплуатации.

Источники

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как сделать правый клик на Chromebook
Chromebook

Как сделать правый клик на Chromebook

Не удалось инициализировать Direct3D — решения
Техподдержка

Не удалось инициализировать Direct3D — решения

Исправить Data Retrieval в Diablo 4 на Steam
Игры

Исправить Data Retrieval в Diablo 4 на Steam

Open Graph в WordPress — настройка мета‑тегов
WordPress SEO

Open Graph в WordPress — настройка мета‑тегов

getconf: адаптивные скрипты для разных Linux
Linux

getconf: адаптивные скрипты для разных Linux

Проверка входов в Windows — успешные и неудачные попытки
Безопасность Windows

Проверка входов в Windows — успешные и неудачные попытки