我正在尝试在Azure Web Appp上运行一个非常简单的node.js服务器来为单个页面应用程序提供服务。服务器将提供静态页面,并且总是服务器'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等),但它似乎并没有起作用。
有什么想法吗?
答案 0 :(得分:13)
Windows Azure网站使用IISNode在IIS内部托管Node进程。您的Node站点实际上是一个命名管道,它接收传入的请求,而不是像在本地运行或自己托管时使用的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直接运行Azure上的koa应用程序时引发同样的问题,因此我们需要配置 nodeProcessCommandLine
:
使用以下内容创建名为iisnode.yml
的文件:
nodeProcessCommandLine:"%programfiles%\nodejs\%WEBSITE_NODE_DEFAULT_VERSION%\node.exe" --harmony-generators
设置 WEBSITE_NODE_DEFAULT_VERSION 与您在站点管理器门户网站的配置标签中应用设置中设置的值相关。
作为在Azure Web Apps上运行的node.js应用程序,需要server.js
或app.js
文件作为根目录中的入口,并使用web.config
文件来控制iis(它如果您通过git部署或通过node.js模板构建应用服务器,将自动创建)。 E.G。
<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 and Microsoft Azure syncing files, Server/Local。
答案 1 :(得分:0)
我可以在上面的代码中看到重复的代码。删除var server = app.listen(3000);
后的代码,然后按照文章https://azure.microsoft.com/en-us/documentation/articles/web-sites-nodejs-develop-deploy-mac中的步骤完成将您的KOA解散为azure。