Конфигурация nginx при использовании websocket и http? - PullRequest
0 голосов
/ 26 октября 2018

Я хочу сделать балансировку нагрузки websocket с Nginx. Сервер (MyServer) написан на C #, а порт 8080 открыт как для запросов websocket, так и для запросов http:

        app.Use(async (context, next) =>
        {
            if (context.Request.Path == "/wsDataImport")
            {
                if (context.WebSockets.IsWebSocketRequest)
                {
                    WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false);
                    await WebSocketHandler.DataImportHandler(context, webSocket).ConfigureAwait(false);
                }
                else
                {
                    context.Response.StatusCode = 400;
                }
            }
            else if (context.Request.Path == "/wsBroadcast")
            {
                if (context.WebSockets.IsWebSocketRequest)
                {
                    WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false);
                    await WebSocketHandler.BroadcastHandler(context, webSocket).ConfigureAwait(false);
                }
                else
                {
                    context.Response.StatusCode = 400;
                }
            }
            else
            {
                await next().ConfigureAwait(false);
            }
        });

Без Nginx я могу запустить соединение через веб-сокет во внешнем интерфейсе (файл js) следующим образом, и тест в порядке:

        const ws1 = new WebSocket("ws://{IP}:8080/wsDataImport")
        const ws2 = new WebSocket("ws://{IP}:8080/wsBroadcast")

С Nginx я изменяю его на:

        const ws1 = new WebSocket("ws://ws/wsDataImport")
        const ws2 = new WebSocket("ws://ws/wsBroadcast")

И часть конфигурации nginx:

location /ws/ {
    proxy_pass http://{IP}:8080/;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Но я получаю эту ошибку:

WebSocket connection to 'ws://ws/wsBroadcast' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT

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

1 Ответ

0 голосов
/ 29 октября 2018

О, я знаю причину ... Поскольку Nginx прослушивает порт 80, я должен отправить запрос к {localIP}: 80 в коде. Таким образом, во внешнем интерфейсе (файл js) должно быть:

const ws1 = new WebSocket("ws://" + location.host + "/ws/wsDataImport")
const ws2 = new WebSocket("ws://" + location.host + "/ws/wsBroadcast")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...