Вопрос или проблема
Я настроил модуль 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.
Убедитесь в правильности настроек прав доступа
Проверим, что директории созданы и имеют правильные права доступа:
- Создание директорий и установка прав: В вашем 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
- Проверьте права на уровень директорий: Важно не только изменить владельца на уровне
/var/www
, но и убедиться, что все промежуточные директории имеют нужные права. Это можно проверить с помощью команды:
ls -ld /var/www
ls -ld /var/www/recorded
ls -ld /var/www/recorded/hlsvideobroadcast
Убедитесь, что для всех этих директорий установлен правильный владелец и группа, а также что права на запись для пользователя www-data
доступны.
Корректировки в конфигурации NGINX
- Настройка конфигурации 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
совпадает с фактическим путем.
Логирование и диагностика
- Проверка логов: Продолжайте следить за логами NGINX после внесения изменений. Если возникают новые ошибки, они могут указать на иные проблемы, связанные с конфигурацией.
Заключительные советы
- После любых изменений не забудьте перезапустить контейнер с NGINX для применения новых настроек.
- Убедитесь, что нет других контейнеров или процессов, которые могут блокировать доступ к директориям записи.
- Если вы используете Docker в режиме "host", проверьте, не влияет ли это на разрешения на уровне хоста.
Если после всех проверок и изменений проблема остается, рекомендуется проверить настройки Docker и возможностей файловой системы, чтобы убедиться, что нет иных ограничений, мешающих записи.