Ошибка при рукопожатии WebSocket: неожиданный код ответа: 301

Я уже изучил ответ на RoR 5.0.0 ActionCable wss WebSocket рукопожатие: неожиданный код ответа: 301, но это не применимо к моему случаю.

Я использую nginx-proxy в качестве прикрытия для нескольких веб-серверов, работающих в docker-контейнерах. Я использую шаблон nginx-config из https://github.com/jwilder/nginx-proxy

Теперь в моем docker-контейнере есть еще один nginx со следующей конфигурацией:

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

upstream websocket {
    server my-websocket-docker-container:8080;
}

server {
    root /src/html;


    location /websocket/ {
        resolver 127.0.0.11 ipv6=off;
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }

    ...

}

При попытке подключиться к wss: //example.com/websocket я получаю вышеупомянутую ошибку о неожиданном коде ответа 301. Когда я вручную скручиваю URL-адрес websocket, я вижу ответ nginx, говорящий мне: «301 перемещен постоянно ". Но почему? Откуда это взялось?

Кто-нибудь может помочь? Спасибо!


person Tobias Gassmann    schedule 11.08.2018    source источник
comment
Ваш location /websocket/ имеет завершающий /, но вы подключаетесь к /websocket без завершающего /. Изменение любого из них может удалить перенаправление.   -  person Richard Smith    schedule 12.08.2018
comment
да, спасибо большое! :-)   -  person Tobias Gassmann    schedule 12.08.2018
comment
Я, конечно, попробовал добавить косую черту в конце перед тем, как задать вопрос, но в то время у меня была другая ошибка, вызывающая тайм-аут 504. О, какие выходные ...   -  person Tobias Gassmann    schedule 12.08.2018
comment
Я с радостью проголосую и приму ваше решение, если вы захотите опубликовать его как обычный ответ. Спасибо за помощь! :-)   -  person Tobias Gassmann    schedule 12.08.2018
comment
@RichardSmith: Ты рок-звезда. Спасибо, вот и все.   -  person TheMonkWhoSoldHisCode    schedule 07.07.2021


Ответы (1)


Сегодня я столкнулся с аналогичной проблемой. Я использовал классический WebSocket API и NGINX для проверки соединения между некоторыми сервисами. Я пришел к следующему решению:

Создание экземпляра WebSocket:

const websocket = new WebSocket('ws://' + window.location.host + '/path');

Конфигурация Nginx:

location /path {
    proxy_pass http://websocket:port;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Где:

  1. path - это путь, который нужно перенаправить
  2. websocket - это имя хоста или IP-адрес хоста
  3. порт - это порт, на котором приложение обслуживается на хосте
person LoolKovsky    schedule 12.01.2021