socket.io + azure приложение обслуживает ошибку 503 даже при включении websockets - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь настроить socket.io с моим Node.js сервером в службах приложения Azure. Он отлично работает на моем локальном сервере. Тем не менее, я не могу заставить его работать на Azure.

Я включил веб-сокеты в моих Azure Службах приложений -> Конфигурация -> Общие настройки. Однако это не работает.

Я следовал инструкциям в этом сообщении: Socket IO net :: ERR_CONNECTION_REFUSED , но у меня это не сработало.

Мой код на стороне сервера:

...
const port = process.env.PORT || 5000;
const app: Application = express();
const server = require("http").Server(app);
const io = require("socket.io")(server);
...
io.of("/chat").on("connection", async function(socket: any) {
  console.log('hi')
});
...
server.listen(port, () => console.log(`listening on port ${port} `));

Мои настройки CORS также были настроены надлежащим образом, HTTP-запросы к моему серверу работают нормально, а также запросы, требующие учетных данных.

Любая помощь будет оценена. Спасибо

РЕДАКТИРОВАТЬ (ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ):

Я использую внутреннюю аутентификацию. Из-за этого мне нужно установить для заголовка Access-Control-Allow-Credentials значение TRUE. Мое приложение express устанавливало это значение true через модуль cors npm, однако, что бы я ни делал, я не мог заставить работать HTTP-запросы при выполнении запросов аутентификации.

Я смог решить эту проблему, выполнив:

az resource update --name web --resource-group <myResourceGroupName> --namespace Microsoft.Web --resource-type config --parent sites/<site-name> --set properties.cors.supportCredentials=“true” --api-version 2015-06-01

, который я нашел здесь: (https://docs.microsoft.com/bs-latn-ba/azure/app-service/app-service-web-tutorial-rest-api)

Это позволило HTTP-запросы с учетными данными для работы, а также любые другие запросы HTTP. Важно отметить, что в моих настройках Azure все мои настройки CORS по-прежнему пусто , чтобы мое приложение express могло обрабатывать CORS.

Не уверен, что это связано ...

EDIT2:

, когда я пытаюсь подключиться с моего клиента с

    const socketIo = io(socketUrl + "/chat", {
      // transports: ["websocket"]
      upgrade: false,
    })

все работает нормально , Но если я раскомментирую transports: ["websocket"], соединение не будет установлено. Это как-то связано с настройками websocket в Azure

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Итак, я сделал простой пример для проверки соединения с сокетом ... и это сработало.

Затем я снова попробовал приложение ... и оно заработало. Не знаю, что случилось, но теперь все работает ...

0 голосов
/ 04 февраля 2020

Я бы предложил вам предоставить минимальный рабочий пример (страница сервера и клиента), который упростил бы вещи.

Вот пара вещей, которые нужно проверить:

  • Отключить perMessageDeflate на вашем сервере Node.js код

, например, вот так:

const io = require('socket.io')(server,{
   perMessageDeflate :false
});
  • Azure Веб-приложения прослушивают только порты 80 и 443, которые это общая проблема

Это не похоже на случай здесь, но это случается так часто, поэтому я оставлю это здесь, чтобы помочь другим. В соответствии с do c:

Q: Могу ли я предоставить более одного порта для моего пользовательского образа контейнера?

A: Мы не поддерживаем выставление более одного порта. Так что, если это так - измените порт на любой из них, и ваше приложение будет работать нормально.

Надеюсь, это поможет! ?

...