Как использовать nginx для обратного проксирования потока mjpeg с IP-камеры?

Я использую nginx на OpenWRT для обратного проксирования потока в формате JPEG с IP-камеры, но я испытываю задержку до 10-15 секунд даже при довольно низких размерах кадров и скорости. Когда устройство OpenWRT удалено с пути, к камере можно получить доступ без каких-либо задержек.

Из-за продолжительности задержки (и того факта, что она увеличивается со временем) это выглядит как проблема с буферизацией/кэшированием. Я уже установил proxy_buffering off, но есть ли что-то еще, на что мне следует обратить внимание?

Спасибо.


person mikepurvis    schedule 08.07.2011    source источник
comment
См. также serverfault.com/questions/788173/   -  person Cameron Tacklind    schedule 24.03.2020


Ответы (3)


Я установил mjpg-streamer на Arduino Yun, а затем в настройках маршрутизатора настроил переадресацию портов, внесенных в белый список только для моего веб-сервера.

Вот моя конфигурация Nginx, которая находится в каталоге с поддержкой сайтов.

server {
  listen      80;
  server_name cam.example.com;
  error_log /var/log/nginx/error.cam.log;
  access_log /var/log/nginx/access.cam.log;

  location    / {
    set $pp_d http://99.99.99.99:9999/stream_simple.html;
    if ( $args = 'action=stream' ) {
      set $pp_d http://99.99.99.99:9999/$is_args$args;
    }
    if ( $args = 'action=snapshot' ) {
      set $pp_d http://99.99.99.99:9999/$is_args$args;
    }

    proxy_pass $pp_d;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
}
person stenius    schedule 20.07.2014

Я никогда не получал этого удовлетворения от nginx. В зависимости от ваших конкретных потребностей, два решения, которые могут быть адекватными:

  • если вы можете допустить, чтобы поток находился на другом порту, пропустите его, используя функцию переадресации портов встроенного брандмауэра OpenWRT.

  • используйте возможности обратного прокси-сервера tinyproxy. В пакете по умолчанию возможности обратного прокси-сервера отключены флажком, поэтому вам должно быть удобно проверить и собрать его самостоятельно. Этот метод, безусловно, более сложен, но также работает.

Мне все еще было бы интересно услышать о ком-нибудь, кто работает с nginx.

person mikepurvis    schedule 02.11.2011

У меня есть Nginx на Openwrt BB (wndr3800) с обратным проксированием на IP-камеру dlink 932LB1, и он работает хорошо. Никаких существенных задержек, даже до того, как я отключил proxy_buffering. Если у меня много вещей, передаваемых по сети, видео может стать прерывистым, но не больше, чем при прямой ссылке на камеру из браузера (или из любого из моих приложений IP-камеры). Так что можно.

Мне подошел Nginx. Я попробовал tinyproxy и lighttpd для обратного проксирования, но у каждого из них отсутствуют функции OpenWrt. И tinyproxy, и lighttpd требуют пользовательской компиляции для всех функций обратного прокси, и (насколько мне известно) lighttpd не будет принимать полные доменные имена в директиве прокси.

Вот что у меня происходит:

  • Базовая или дайджест-аутентификация на общедоступном Nginx обеспечивает контроль доступа на всем сайте.
  • Я проксирую свои CGI-скрипты (shell, haserl и т. д.) на uhttpd Openwrt.
  • Жестко контролируемый обратный прокси-сервер для камеры mjpeg и jpeg API, никакие другие функции камеры не доступны публике.
  • Базовая аутентификация камеры обрабатывается Nginx (proxy_set_header), поэтому внутренний код авторизации не раскрывается.
  • Относительно небольшой размер (без perl, apache, ruby ​​и т. д.).

Я бы включил сюда свой nginx.conf, за исключением того, что в нем нет ничего необычного... просто прокси-сервер. Вы можете попробовать tcpdump или wireshark, чтобы увидеть, что загромождает вашу локальную сеть, если трафик действительно является вашим виновником.

Но похоже, что что-то в вашем маршрутизаторе является причиной задержки. Возможно, аппаратное обеспечение просто не справляется с нагрузкой процессора/трафика, или в вашей установке Openwrt может быть что-то еще, что перегружает шоссе. Ваше видео плавное и просто задерживается? Или вы видите серьезно прерывистое видео? Упомянутая вами задержка удлинения звучит как буфер/кеш... но я не знаю, что бы это делало.

person wbr    schedule 03.06.2015