Вопрос или проблема
Я получаю следующую ошибку в блоке RTMP моего nginx.conf, когда пытаюсь запустить его в контейнере Docker.
[emerg] 1#1: хост не найден в URL
“api-servers/api/livevideostreams/startlivevideostream;
Когда Nginx пытается прочитать строки one_publish и on_publish_done части блока rtmp :
rtmp {
server {
listen 1935;
on_publish http://api-servers/api/livevideostreams/startlivevideostream;
on_publish_done http://api-servers/api/livevideostreams/stoplivevideostream;
}
}
Блок upstream определён как
upstream api-servers {
# Здесь мы можем указать несколько upstream серверов django api для балансировки нагрузки.
server 172.16.16.6:7575;# сервер балансировки нагрузки 1
server 172.16.16.7:8585;# сервер балансировки нагрузки 2
}
HTTP блок, который проксирует upstream сервер:
http {
server{
listen 8080;
location / {
proxy_pass http://api-servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering on;
proxy_cache my_zone;
add_header X-Proxy-Cache $upstream_cache_status;
# Поддержка WebSocket (nginx 1.4)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
}
}
}
Примечание: Я создаю приложение для живой трансляции, используя модуль nginx rtmp. Я приложил только соответствующий код.
Я также протестировал вышеуказанный nginx.conf без блока rtmp и смог успешно достучаться до upstream блоков. Сделал 4 запроса, 3 из них попали на 1-й сервер балансировки нагрузки, а 4-й на 2-й сервер балансировки нагрузки после проверки логов доступа. Есть какая-то проблема с разрешением части rtmp upstream серверов.
Спасибо заранее.
Ответ или решение
Проблема, с которой вы столкнулись, связана с ошибкой поиска хоста в конфигурации RTMP блока вашего файла nginx.conf
. Ошибка, которую вы получили, указывает на то, что Nginx не может разрешить указанный URL в директивах on_publish
и on_publish_done
. Рассмотрим это более подробно.
Анализ проблемы
Ваши настройки RTMP выглядят следующим образом:
rtmp {
server {
listen 1935;
on_publish http://api-servers/api/livevideostreams/startlivevideostream;
on_publish_done http://api-servers/api/livevideostreams/stoplivevideostream;
}
}
В этом блоке вы указываете URL, который начинается с http://
и имеет следующий вид: api-servers/api/livevideostreams/startlivevideostream
. Ваша конфигурация имеет определение upstream для сервера api-servers
, однако, это неразрешимая адресация для Nginx в контексте RTMP блока.
Корректировка конфигурации
-
Используйте IP-адреса или полные URL для RTMP: В конфигурации RTMP вам необходимо указывать либо IP-адреса, либо полностью разрешенные доменные имена. Nginx требуется полностью разрешенный хост или IP, чтобы правильно выполнить указанные HTTP-запросы.
Измените строки
on_publish
иon_publish_done
на что-то подобное:on_publish http://172.16.16.6:7575/api/livevideostreams/startlivevideostream; on_publish_done http://172.16.16.6:7575/api/livevideostreams/stoplivevideostream;
Либо, если у вас есть доменное имя, укажите его:
on_publish http://yourdomain.com/api/livevideostreams/startlivevideostream; on_publish_done http://yourdomain.com/api/livevideostreams/stoplivevideostream;
-
Проверка доступности сервисов: Убедитесь, что сервисы по указанным адресам действительно доступны из контейнера, в котором работает Nginx. Вы можете использовать команды вроде
curl
для проверки доступности HTTP-методов.
Дополнительные рекомендации
-
Проверка сетевых соединений: Убедитесь, что ваш Docker-контейнер имеет доступ к сети, где находятся API-серверы. Возможно, потребуется настроить
docker-compose
или другие сетевые настройки для обеспечения связи между контейнерами. -
Логи Nginx: Проверьте логи Nginx, чтобы разобраться в возможных дополнительных причинах ошибки и убедиться, что запросы действительно обрабатываются корректно.
-
Документация Nginx: Ознакомьтесь с официальной документацией Nginx по RTMP, чтобы убедиться в правильности других директив и настройках.
Заключение
Ошибка, с которой вы столкнулись, связана с неправильной адресацией в конфигурационном файле Nginx для блока RTMP. Исправьте URL, указав полные адреса серверов, и убедитесь, что они доступны из вашего окружения. Это должно решить вашу проблему с Nginx и RTMP. Удачи в разработке вашего приложения для потоковой передачи!