Хост не найден в upstream во время чтения блока кода rtmp Nginx

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

Я получаю следующую ошибку в блоке 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 блока.

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

  1. Используйте 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;
  2. Проверка доступности сервисов: Убедитесь, что сервисы по указанным адресам действительно доступны из контейнера, в котором работает Nginx. Вы можете использовать команды вроде curl для проверки доступности HTTP-методов.

Дополнительные рекомендации

  • Проверка сетевых соединений: Убедитесь, что ваш Docker-контейнер имеет доступ к сети, где находятся API-серверы. Возможно, потребуется настроить docker-compose или другие сетевые настройки для обеспечения связи между контейнерами.

  • Логи Nginx: Проверьте логи Nginx, чтобы разобраться в возможных дополнительных причинах ошибки и убедиться, что запросы действительно обрабатываются корректно.

  • Документация Nginx: Ознакомьтесь с официальной документацией Nginx по RTMP, чтобы убедиться в правильности других директив и настройках.

Заключение

Ошибка, с которой вы столкнулись, связана с неправильной адресацией в конфигурационном файле Nginx для блока RTMP. Исправьте URL, указав полные адреса серверов, и убедитесь, что они доступны из вашего окружения. Это должно решить вашу проблему с Nginx и RTMP. Удачи в разработке вашего приложения для потоковой передачи!

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

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