Запуск Node.js в веб-приложении Azure

Я пытаюсь запустить очень простой сервер node.js в Azure Web App для обслуживания одностраничного приложения. Сервер будет обслуживать статические страницы и всегда будет использовать сервер index.html для запросов страниц, поскольку вся маршрутизация выполняется на стороне клиента.

Все работает абсолютно идеально локально, но при развертывании в Azure любые запросы страницы приводят к тому, что "искомый ресурс был удален...", что говорит о том, что сервер узла не был атакован.

Я использую Koa в качестве сервера, а server.js здесь;

var Koa = require('koa');
var convert = require('koa-convert');
var helmet = require('koa-helmet');
var historyApiFallback = require('koa-connect-history-api-fallback');
var serve = require('koa-static');
var app = new Koa();

// This rewrites all routes requests to the root /index.html file
// (ignoring file requests). If you want to implement isomorphic
// rendering, you'll want to remove this middleware.
app.use(convert(historyApiFallback({
  verbose: false
})));

// Serving ~/dist by default. Ideally these files should be served by
// the web server and not the app server, but this helps to demo the
// server in production.
app.use(convert(serve(__dirname)));
app.use(helmet());

var server = app.listen(3000);var Koa = require('koa');
var convert = require('koa-convert');
var helmet = require('koa-helmet');
var historyApiFallback = require('koa-connect-history-api-fallback');
var serve = require('koa-static');
var app = new Koa();

// This rewrites all routes requests to the root /index.html file
// (ignoring file requests). If you want to implement isomorphic
// rendering, you'll want to remove this middleware.
app.use(convert(historyApiFallback({
  verbose: false
})));

// Serving ~/dist by default. Ideally these files should be served by
// the web server and not the app server, but this helps to demo the
// server in production.
app.use(convert(serve(__dirname)));
app.use(helmet());

var server = app.listen(3000);

Я включил package.json в развертывание, так как в некоторой документации предполагалось, что требуемые пакеты узлов будут автоматически установлены (Koa и т. Д.), Но, похоже, это не сработало.

Есть идеи?

2 ответа

Решение

Веб-сайты Windows Azure используют IISNode для размещения процесса Node внутри IIS. Вашему узлу на самом деле назначается именованный канал, который получает входящие запросы, а не порт TCP, который вы использовали бы при локальном запуске или хостинге. Даже если бы вы могли открыть порт TCP, веб-сайты Azure на самом деле предназначены только для традиционных веб-сайтов и не имеют возможности открывать порты для внешнего мира.

Итак, во-первых, вам нужно изменить порт в вашем коде, например: var port = process.env.PORT||3000; //which you can run both on Azure or local var server = app.listen(process.env.PORT||3000);

И в моем тесте есть несколько дополнительных конфигураций, которые нам нужно настроить, чтобы удалить ошибки из приложения, чтобы оно работало в Azure Web App.

Похоже, что возникнет та же проблема с https://github.com/alexmingoia/koa-router/issues/177 непосредственно запускающими приложения koa в Azure, поэтому нам нужно настроить nodeProcessCommandLine:

создать файл с именем iisnode.yml с содержанием: nodeProcessCommandLine:"%programfiles%\nodejs\%WEBSITE_NODE_DEFAULT_VERSION%\node.exe" --harmony-generators настройка WEBSITE_NODE_DEFAULT_VERSION зависит от значения, которое вы задали в настройках приложения на вкладке конфигурации в портале менеджера сайта.

Как приложение node.js, работающее в веб-приложениях Azure, необходимо server.js или же app.js файл в качестве входа в корневой каталог с web.config файл для управления iis (он будет автоматически создан, если вы развернете через git или создадите сервер приложений с помощью шаблона node.js). НАПРИМЕР

<configuration>
<system.webServer>

    <handlers>
        <!-- indicates that the app.js file is a node.js application to be handled by the iisnode module -->
        <add name="iisnode" path="server.js" verb="*" modules="iisnode" />
    </handlers>

    <rewrite>
        <rules>
            <!-- Don't interfere with requests for logs -->
            <rule name="LogFile" patternSyntax="ECMAScript" stopProcessing="true">
                <match url="^[a-zA-Z0-9_\-]+\.js\.logs\/\d+\.txt$" />
            </rule>

            <!-- Don't interfere with requests for node-inspector debugging -->
            <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">                    
                <match url="^server.js\/debug[\/]?" />
            </rule>

            <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
            <rule name="StaticContent">
                <action type="Rewrite" url="public{REQUEST_URI}" />
            </rule>

            <!-- All other URLs are mapped to the Node.js application entry point -->
            <rule name="DynamicContent">
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" />
                </conditions>
                <action type="Rewrite" url="server.js" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Таким образом, вы можете поместить свои файлы SPA в public папка в корневом каталоге, например, ваш вход SPA index.html когда вы посещаете <your_site_name>.azurewebsites.net/index.html он будет переписан в "/public/index.html".

Кроме того, вы можете использовать VSO для отладки своего приложения в Azure в Интернете, см. Visual Studio 2015 и файлы синхронизации Microsoft Azure, Server/Local для получения дополнительной информации.

Я вижу дублированный код в вашем коде выше. Удалить код после var server = app.listen(3000); затем выполните действия, описанные в статье https://azure.microsoft.com/en-us/documentation/articles/web-sites-nodejs-develop-deploy-mac чтобы завершить развертывание KOA для лазури.

Другие вопросы по тегам