Я пытаюсь настроить NGINX для прокси-трафика веб-сокетов. Я запускаю веб-страницу на NGINX (порт 80), которая имеет канал MJPEG с порта 8080, а также принимает трафик веб-сокетов через порт 8090. Я могу проксировать поток MJPEG, но не веб-сокеты. На моей веб-странице javascript на стороне клиента нормально подключался без прокси, используя эту строку:
var conn = new WebSocket ('ws: //192.168.0.14: 8989 / ws');
Чтобы проксировать это, я попытался настроить следующую конфигурацию NGINX:
#Proxy the Web Socket Traffic
#----------------------------------------------
location /sock/ {
proxy_pass ws://localhost:8989/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
#Proxy the MJPEG Streamer feed
#----------------------------------------------
location /mjpeg/ {
proxy_pass http://localhost:8080/;
}
А затем изменил javascript на стороне клиента на следующее:
var conn = new WebSocket ('http://192.168.0.14/sock/');
Однако, когда я перезапускаю NGINX, получается:
Не удалось выполнить задание для службы nginx. См. «Systemctl status nginx.service» и «journalctl -xn» для подробностей.
Если я изменю строку прохода прокси на «proxy_pass http: // локальный: 8989 / WS; "тогда служба NGINX успешно перезапускается, но я больше не могу подключаться к веб-сокету.
Есть ли что-то еще, что мне нужно настроить, чтобы NGINX выполнял прокси для адресов ws: //? Является ли http: // эквивалентным, если он обновляет протокол? Если последнее верно, то почему это не работает?
В этом посте я заметил, что они используют ws: // в инструкции передачи прокси. Но у меня это не работает NGINX: как проксировать http (s) трафик на один сервер и ws (s) трафик на другой?
В документации по nginx нет упоминания ws://
схема, доступная для использования в config. Неудивительно, что nginx не запускается, держу пари, что это ошибка конфигурации, на которую он жалуется.
И у тебя определенно есть правильная конфигурация для прокси веб-сокетов. Что касается того, почему это не работает - это еще предстоит определить, это может быть связано с большим набором причин: на самом деле никто не слушает tcp / 8989 или происходит какая-то ошибка приложения в слушателе.