Запуск 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 для лазури.