Socket.io/Hapi не работает служба приложений Azure (Linux) - PullRequest
0 голосов
/ 01 октября 2019

Недавно я переключился в нашей тестовой среде с Windows Azure App Services на Linux. Все работает так, как было раньше, кроме наших сокетных соединений. Похоже, что есть много устаревшей информации, касающейся службы приложений Linux, и документация довольно скудная. Однако, согласно этим примечаниям к выпуску , доступна поддержка веб-сокетов в службе приложений Azure Linux.

В некоторых документах службы приложений Azure для Linux говорится, чточто вы должны отключить perMessageDeflate, чтобы веб-сокеты работали со службой приложений Linux и NodeJS. Я полагаю, что я сделал это в моем коде сервера HapiJS ниже. С помощью console.log(io) я подтвердил, что для параметра perMessageDeflate установлено значение false.

import Server from 'socket.io';
import socketioJwt from 'socketio-jwt';

const myHapiJSPlugin = {
  name: 'myPluginName',
  version: '2.0.0',
  register: function (server, options) {

    const io = new Server(server.listener, {
      perMessageDeflate: false,
      transports: ['websocket'],
      origins: '*:*'
    });

    io.use(socketioJwt.authorize({
      secret: JWT_SECRET_KEY,
      handshake: true
    }));

    io.on('connection', socket => {
      console.log(io);
      // more code here
    };
  };
};

Когда я открываю сетевую страницу консоли Chrome при использовании своего веб-клиента, я получаю 101код ответа с сервера. I console.log подключается / отключается от обратных вызовов клиента socket.io. Я вижу, что он постоянно подключается / отключается, несмотря на получение подтверждения от сервера (101 ответ). Состояние соединений говорит «остановлено» в консоли. Кажется, я подписываюсь на определенный маршрут в порядке, так как обратный вызов срабатывает.

Я не внес никаких других изменений кода с момента перехода с Windows Azure App Services, несмотря на приведенную ниже конфигурацию для добавления perMessageDeflate и origins для тестирования socket.io docs . Я думаю, что что-то идет не так во время рукопожатия или аутентификации.

Status Code: 101 Switching Protocols
Access-Control-Allow-Origin: *
Connection: Upgrade
Date: Tue, 01 Oct 2019 18:04:57 GMT
Sec-WebSocket-Accept: <HASH>
Server: Kestrel
Upgrade: websocket

Я также добавил perMessageDeflate к моему клиентскому коду. Это не имело значения.

const client = new io(URL, {
  query: 'token=' + jwt,
  perMessageDeflate: false,
  transports: ['websocket'],
  upgrade: false
});

Что еще мне не хватает? Как включить веб-сокеты в службе приложений Azure Linux? Я проверил настройки конфигурации, как с Windows. Похоже, что для этого нет настройки, так как веб-сокеты включены по умолчанию. Я проверил в журналах, что веб-сервер не перезапускается постоянно, вызывая соединение / отключение.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

tl; dr

Отключите CORS и AUTH через портал в службе приложений Linux.

Отключите CORS, перейдя в службу приложений, выберите CORS в левой части меню в разделе API,удалите все записи там. Удаляя все записи, вы отключаете реализацию Azure CORS для службы приложений.

Отключите AUTH, перейдя в раздел Аутентификация / Авторизация под заголовком «Настройки» в левой части меню. Установите переключатель в положение «off».

Это позволит веб-сокетам работать должным образом со службой приложений Linux. Тем не менее, вам необходимо настроить CORS и AUTH для вашей платформы веб-сервера.

Длинная форма

Получив ответ от моего представителя службы поддержки MS, она подтвердила, что при включении CORS или AUTH происходит сбой. Реализации сокетов Linux App Service. Служба приложений Linux Функции CORS и AUTH еще не реализованы Microsoft.

Чтобы использовать службу приложений Linux и использовать функции CORS или AUTH, вы просто не можете этого сделать, поскольку она не реализована. Официальное рекомендуемое решение - перейти на службу приложений Windows.

Несмотря на то, что указано в документации Azure, perMessageDeflate не требуется для работы WebSockets с socket.io. У меня это работает без него правильно. Чтобы настроить CORS для службы приложений с портала, он такой же, как и для Windows. Вы можете перейти к службе приложений на портале, выбрать CORS в меню слева в меню API. Удалите все записи, чтобы отключить функцию CORS службы приложений. У меня была только одна запись (*), которую я использовал во время тестирования, так как перед тем, как перейти на Linux, я правильно настроил CORS со своей службой приложений Windows.

Если вы удалите все записи, у вас должны быть работающие веб-сокетыбез CORS. Однако имейте в виду, что из соображений безопасности вы должны настроить CORS на ваш веб-сервер. Если он экспресс с socket.io, вам нужно сделать что-то вроде this . Большинство веб-фреймворков придерживаются аналогичной парадигмы, указывая ее на объекте вашего сервера в качестве опции.

В этой теме на GitHub есть еще немного информации об этом.

0 голосов
/ 04 октября 2019

Работают ли ваши WebSockets, если аутентификация отключена?

Проблемы с WebSockets, использующими приложения для Linux, возникают только при включении функций аутентификации.

Я полагаю, это связано с плохой реализацией прокси EasyAuth и тем, что MS трудно решить эту проблему.

...