如何将NodeJs应用程序部署到Azure Web应用程序

时间:2019-01-18 20:23:21

标签: node.js azure azure-devops web-config azure-web-app-service

我被赋予了将Node.js应用程序部署到Azure Web应用程序的任务,但我无法使其正常工作。

我遵循了link的指示,一切似乎都非常简单。

唯一的区别是我的package.json启动脚本如下所示。

"scripts": {
   "start": "node ./node_modules/@samplescope/samplefolder/sample_service.js"
  },

在指令链接的示例源代码中,它具有一个指向server.js的web.config,因此我将该部分修改为我的启动文件的位置,即“。/node_modules / @ samplescope / samplefolder / sample_service.js“

从此

    <rule name="DynamicContent">
         <match url="/*" />
         <action type="Rewrite" url="server.js"/>
    </rule>

像这样

    <rule name="DynamicContent">
         <match url="/*" />
         <action type="Rewrite" url="./node_modules/@samplescope/samplefolder/sample_service.js"/>
    </rule>

我还尝试删除了我创建的web.config,因为根据此link,kudu会尝试根据您的package.json为您生成一个,但仍然无法正常工作。

我知道我做错了什么,有人可以指出我正确的方向。

此外,如何在azure Web应用程序中调用“ npm install”?

是的,当被“ npm start”调用时,它可以在本地工作

2 个答案:

答案 0 :(得分:1)

我能够解决此问题,现在能够将我的nodejs应用程序成功部署到Azure Web应用程序。

Iam对kudu部署了解非常多,可以帮助我解决此问题的几个要点,所以我对此并不熟悉。

  1. 您可以通过以下方式获取kudu日志文件: https:// {site} .scm.azurewebsites.net />“工具”标签>“诊断转储”

  2. 在下面网站的“总体流程”部分下,您将看到kudu流程有效。此链接还帮助我充分了解了kudu进程。 https://blog.lifeishao.com/2017/03/24/custom-nodejs-deployment-on-azure-web-app/

  3. 同步应用程序,清理文件并将其复制到目标文件夹后,kudu将尝试生成web.config。 在我们的例子中,.js位于私有节点模块之一中,因此它需要在kudu生成web.config之前就存在。

  4. 还建议创建自己的deploy.cmd,以便您可以控制部署步骤。您也可以参考此链接以获取更多信息。 https://github.com/projectkudu/kudu/wiki/Custom-Deployment-Script#custom-deployment-script-generator

  5. 如果要使用私有模块部署应用程序,则可以参考此链接以获取指南。 https://www.jeff.wilcox.name/2017/02/azure-private-npm/ 另外,即使在本地文件夹中已经有.npmrc,在进行npm安装时也要明确指出注册表。

  6. 最后,如果要在Azure Devops中使用Azure Service App部署进行部署,请不要让它为您生成web.config,而让kudu来生成它。

答案 1 :(得分:0)

一旦在推送请求中检测到package.json文件,Azure Web应用就会调用

“ npm install”。它安装“依赖项”中列出的软件包。

但是,这并不完美。我的一个项目需要SQLite,但没有安装。我通过在本地安装所有软件包,然后使用本地Git将整个“ node_modules”文件夹推送到Azure来解决此问题

我不建议将“ sample_service.js”放入“ node_modules”中,因为该文件夹是由npm根据“ package.json”中列出的依赖关系创建和修改的。尝试将“ sample_services.js”放置在“ node_modules”之外的同一文件夹中。

如果“ sample_services.js”是后端Javascript服务器,则在部署时,由于naming restrictions,您需要将其重命名为“ server.js”或“ app.js”。在“ package.json”中将其指定为“ main”,以便Azure在Windows Powershell中将其作为“ node server.js”的等效项运行,以使后端运行并在“ server.js”中包含以下代码: / p>

const port = process.env.PORT || 3000; 

生成的“ package.json”文件应如下所示:

{
  "name": "myProject",
  "version": "1.0.0",
  "engines": {
    "node": "8.10.0",
    "npm": "5.6.0"
  },
  "description": "Project X",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "me",
  "license": "ISC",
  "dependencies": {
    "express": "4.16.3",
    "sqlite3": "4.0.2"
  }
}

Azure自动选择要使用的Node.js和npm版本。如果您遇到兼容性问题,请像我一样指定Node.js和npm的版本

此外,如果像以前的项目一样使用Express进行路由,则“ server.js”中的以下代码将运行以加载默认的onload HTML页面:

app.get('/', function(req,res){
    console.log('default html loading');
    res.render('./public/index.html');
});

同样,由于相同的命名限制,我将主HTML页面命名为index.html

如果您想尝试完整的示例或比较代码,我发现本指南很有帮助:https://www.codeproject.com/Articles/1133660/Deploy-Node-js-in-Microsoft-Azure

干杯!