Azure WebSockets + NodeBB + Node.js Proxy - PullRequest
0 голосов
/ 26 июня 2019

У меня есть 2 веб-приложения, работающих на Azure (серверы Linux).

В одном веб-приложении работает NodeBB (v1.12.1) - https://my -forum.azurewebsites.net

К этому приложению нельзя обращаться напрямую, вместо этого оно проксируется во второе веб-приложение, работающее в Azure.

Конфигурация NodeBB настроена так, чтобы 'url' был 'https://my -website.azurewebsites.net / forums / '

Я добавил URL-адреса в socket.io:origins nconf, чтобы можно было отправлять запросы WebSocket с других URL-адресов. Значения выглядят так: http://my-website.azurewebsites.net:* https://my-website.azurewebsites.net:* https://my-forum.azurewebsites.net:* https://localhost:*


Основной веб-сайт (https://my -website.azurewebsites.net ) представляет собой приложение Node.js & Express с некоторыми внешними маршрутами, маршрутами API и использует модуль http-proxy-middleware для прокси-запросов к Форум. Настройка и конфигурация выглядит следующим образом:

...

const proxy = require('http-proxy-middleware');
const forumProxy = proxy({
    target: process.env.FORUM_URL,
    changeOrigin: true,
    ws: true,
    secure: true,
    xfwd: true,
    logLevel: 'debug'
});
app.use('/forums', forumProxy);

const mainserver = http.createServer(app);
... other config
mainserver.on('upgrade', forumProxy.upgrade);

Когда я запускаю основной веб-сайт локально (https://localhost:3000) и Proxy на форуме NodeBB, я вижу, что WebSockets установлены правильно и обмен сообщениями происходит между локальной версией веб-сайта и форумом NodeBB, размещенным в Azure.

Тем не менее, когда веб-сайт находится на Azure, он использует URL-адреса прокси-сервера и веб-сайт прекрасно, но соединение WebSocket не работает. Сообщение «2probe» отправляется главным веб-сайтом, но соединение никогда не устанавливается и сообщения не обмениваются.

Доступ к URL форума напрямую работает, как и ожидалось, включая обмен сообщениями WebSocket.


На основном сайте и форуме есть файл web.config, который содержит:

<system.webServer>
    <webSocket enabled="false"/>
</system.webServer>

Оба приложения также имеют на сервере значение --web-sockets-enabled = true (которое было установлено с помощью PowerShell).

Насколько я понимаю, это делает WebSocket включенным на сервере, и значение 'false' в файле web.config отключает iis WebSockets и позволяет Node.js обрабатывать его.


Кажется, проблема в том, что 2 сервера Azure общаются друг с другом через WebSockets. Локально в Azure работает нормально.

Почему «https://my -website.azurewebsites.net » не может установить WebSocket на «https://my -forum.azurewebsites.net »? а Local to Azure может?

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Я решил проблему и хотел указать, что проблема не связана с Azure.


Однако, если кто-то еще читает это и использует WebSockets с Node.js, вынеобходимо включить этот параметр в конфигурации веб-приложения, а затем отключить iis WebSockets с помощью файла web.config в вашем проекте.

0 голосов
/ 26 июня 2019

Azure WebApps работают в безопасной среде, которая называется песочницей. Единственный способ получить доступ к приложению через Интернет - через уже выставленные порты HTTP (80) и HTTPS (443); приложения могут не прослушивать на других портах пакеты, поступающие из Интернета. Однако приложения могут создать сокет, который может прослушивать соединения из песочницы. Например, два процесса в одном приложении могут связываться друг с другом через сокеты TCP; Попытки подключения, поступающие извне «песочницы», хотя они и находятся на одной машине, завершатся неудачей.

Попытки соединения с локальными адресами (например, localhost, 127.0.0.1) и собственным IP-адресом машины не будут выполнены, за исключением случаев, когда другой процесс в той же песочнице создал сокет прослушивания на порте назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...