NGINX RTMP : Ошибка разрешений на запись, за которой следует сбой pwrite “recorded”

Вопрос или проблема

Я настроил модуль NGINX rtmp для прямой трансляции. Прямая трансляция работает, запись – нет. Директории, указанные для прямых и записанных потоков, следующие внутри dockerFile, который построен с использованием образа alpine 3.16.1

#Создать папку для прямых видеопотоков.
RUN mkdir -p /var/www/live
RUN mkdir -p /var/www/live/hlsvideobroadcast
RUN mkdir -p /var/www/live/dashvideobroadcast

#Создать папку для записанных видеопотоков.
RUN mkdir -p /var/www/recorded
RUN mkdir -p /var/www/recorded/hlsvideobroadcast
Так как записанные потоки должны храниться в формате flv, я только указал запись всех как директиву внутри hls-live-video-broadcast в блоке rtmp в nginx.conf

Обе папки для прямых и записанных потоков находятся внутри /var/www

Пользователь, указанный в nginx.conf, - www-data

Вот что видно в логах nginx. Файл длинный –>11.6 МБ, поэтому я вставлю соответствующие строки с начала.

2024/12/19 09:44:12 [crit] 12#12: *7 record:  не удалось открыть файл '/var/www/recorded/hlsvideobroadcast/mynewlivestream.flv' (13: Доступ запрещён), клиент: 172.16.16.8, сервер: 0.0.0.0:2935
2024/12/19 09:44:12 [crit] 12#12: *8 pwrite() "recorded" не удалось (9: Неверный дескриптор файла), клиент: 172.16.16.8, сервер: 0.0.0.0:2935
2024/12/19 09:44:12 [crit] 12#12: *7 pwrite() "recorded" не удалось (9: Неверный дескриптор файла), клиент: 172.16.16.8, сервер: 0.0.0.0:2935
2024/12/19 09:44:13 [crit] 12#12: *7 record:  не удалось открыть файл '/var/www/recorded/hlsvideobroadcast/mynewlivestream.flv' (13: Доступ запрещён), клиент: 172.16.16.8, сервер: 0.0.0.0:2935
2024/12/19 09:44:13 [crit] 12#12: *7 pwrite() "recorded" не удалось (9: Неверный дескриптор файла), клиент: 172.16.16.8, сервер: 0.0.0.0:2935

Что я пробовал

Внутри dockerFile сразу после создания папок для прямых и записанных потоков :

# Создать группу и пользователя без прав root www-data
RUN addgroup -S nginxmediaservergroup && adduser -S -s /bin/false www-data -G nginxmediaservergroup

# Дать права пользователю на доступ к конкретным директориям
RUN chown www-data:nginxmediaservergroup /var/www
это не сработало. Хотя прямая трансляция работает, запись в конечном итоге не происходит.

Блок приложения rtmp сервера nginx.conf :

application hls-live-video-broadcast {
    live on;

    allow publish all;

    deny play all;

    # Упаковать потоки как HLS
    hls on;
    hls_path /var/www/live/hlsvideobroadcast;
    hls_nested on;
    hls_fragment_naming system;

    # Запись
    record all;
    record_interval 60s;
    record_path /var/www/recorded/hlsvideobroadcast;

}

Блок записанного местоположения :

# Обслуживать записанные HLS видеопотоки
        location /recorded/hlsvideobroadcast/ {
            expires max;
            types {
                video/flv flv;
            }
            root /var/www;
            add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
        }

Я также использую следующий пакет конфигураций для nginx :

https://github.com/h5bp/server-configs-nginx

Я понимаю, что это может быть связано с форматом файла flv, как указано в блоке местоположения (возможно, я что-то упускаю) и меньше с правами доступа?

Буду признателен за помощь!

Ответ или решение

Ошибка разрешений записи в NGINX RTMP и решение проблемы

Ваша проблема с NGINX RTMP связана с невозможностью записывать файлы в указанный путь из-за ограничений прав доступа. Давайте разберем ошибки и предложим решение.

Описание проблемы

Вы столкнулись с ошибками:

failed to open file '/var/www/recorded/hlsvideobroadcast/mynewlivestream.flv' (13: Permission denied)

и

pwrite() "recorded" failed (9: Bad file descriptor)

Эти сообщения свидетельствуют о том, что пользователь, от имени которого работает NGINX, не имеет права на запись в директорию /var/www/recorded/hlsvideobroadcast. Вы правильно определили, что это связано с правами доступа, а не с самим форматом файла FLV.

Убедитесь в правильности настроек прав доступа

Проверим, что директории созданы и имеют правильные права доступа:

  1. Создание директорий и установка прав: В вашем Dockerfile вы создаете директории и назначаете права. Убедитесь, что после создания директорий вы сначала меняете владельца, а затем устанавливаете права.
# Создание групп и пользователя
RUN addgroup -S nginxmediaservergroup && adduser -S -s /bin/false www-data -G nginxmediaservergroup

# Создание директорий
RUN mkdir -p /var/www/live/hlsvideobroadcast && \
    mkdir -p /var/www/recorded/hlsvideobroadcast

# Назначение прав на директории
RUN chown -R www-data:nginxmediaservergroup /var/www/live /var/www/recorded && \
    chmod -R 755 /var/www
  1. Проверьте права на уровень директорий: Важно не только изменить владельца на уровне /var/www, но и убедиться, что все промежуточные директории имеют нужные права. Это можно проверить с помощью команды:
ls -ld /var/www
ls -ld /var/www/recorded
ls -ld /var/www/recorded/hlsvideobroadcast

Убедитесь, что для всех этих директорий установлен правильный владелец и группа, а также что права на запись для пользователя www-data доступны.

Корректировки в конфигурации NGINX

  1. Настройка конфигурации NGINX: Убедитесь, что в вашем конфигурационном файле NGINX используется правильная запись для записи:
application hls-live-video-broadcast {
    live on;

    allow publish all;

    deny play all;

    # Запись потоков
    record all;
    record_path /var/www/recorded/hlsvideobroadcast;
    record_interval 60s;
}

Убедитесь, что record_path совпадает с фактическим путем.

Логирование и диагностика

  1. Проверка логов: Продолжайте следить за логами NGINX после внесения изменений. Если возникают новые ошибки, они могут указать на иные проблемы, связанные с конфигурацией.

Заключительные советы

  • После любых изменений не забудьте перезапустить контейнер с NGINX для применения новых настроек.
  • Убедитесь, что нет других контейнеров или процессов, которые могут блокировать доступ к директориям записи.
  • Если вы используете Docker в режиме "host", проверьте, не влияет ли это на разрешения на уровне хоста.

Если после всех проверок и изменений проблема остается, рекомендуется проверить настройки Docker и возможностей файловой системы, чтобы убедиться, что нет иных ограничений, мешающих записи.

Оцените материал
Добавить комментарий

Капча загружается...