NodeJS应用部署指南

入门指南

准备工作

首先,我们从github上clone一个nodejs的示例程序。

$ git clone https://github.com/sinacloud/nodejs-getting-started.git
$ cd nodejs-getting-started
$ ls
README.md    index.js     package.json

示例代码中包含了三个文件,其中 index.js 是代码文件, package.jsonnpm 的包管理描述文件。

index.js 的代码如下,这是一个简单的 Express 应用,注意代码的最后一行,所有的NodeJS应用都需要监听环境变量的 PORT 指定的端口(默认为5050),并处理这个端口收到的所有HTTP请求。

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World')
})

app.listen(process.env.PORT || 5050)

下面是 package.json 的代码,其中的 dependencies 指定了本示例程序的依赖包, scripts/start 里指定了如何运行本示例代码。(新浪云在部署应用的时候会根据这个文件来安装应用相关的依赖以及来启动应用程序)。

{
  "name": "nodejs-getting-started",
  "description": "getting started with nodejs on sinacloud platform",
  "version": "0.0.1",
  "private": true,
  "author": {
    "name": "sae",
    "email": "saemail@sina.cn"
  },
  "dependencies": {
    "express": "^4.13.3"
  },
  "engines": {
    "node": "0.10.36"
  },
  "scripts": {
    "start": "node index.js"
  }
}

我们执行 npm install && npm start ,在本地运行这个示例程序,现在我们可以通过 http://localhost:5050 来访问我们的应用了。

$ npm install && npm start
express@4.13.3 node_modules/express
├── escape-html@1.0.2
...
└── send@0.13.0 (destroy@1.0.3, statuses@1.2.1, ms@0.7.1, mime@1.3.4, http-errors@1.3.1)

> nodejs-getting-started@0.0.1 start /private/tmp/nodejs_helloworld
> node index.js

创建应用

登录『新浪云控制台』,点击『创建新应用』,运行环境选择『语言/云容器』,应用名为 helloworld

../../_images/docker-getting-started-create.png

根据您的应用需求,选择你想要的规格的容器。

../../_images/docker-getting-started-spec.png

点击创建,创建一个新的容器应用。

部署应用

应用创建完后,会显示你的应用的 git 仓库地址以及如何将代码提交到该 git 仓库,按照说明提交代码。

$ git remote add sinacloud https://git.sinacloud.com/helloworld
$ git push sinacloud master
...
remote: Exporting git code...
remote: Uploading...
-----> Xxx app detected
-----> Creating runtime environment
...
remote: Deploy and waiting for app to be ready .....
To https://git.sinacloud.com/ymp9vm2385
 + 74d7d50...470cb46 master -> master

部署的时候,git 会显示当前的进度,如果部署失败,会提示相应的错误信息(比如 package.json 格式问题等)。

部署完成后,我们就可以通过 http://helloworld.applinzi.com 来访问我们的应用了。

容器管理

在应用页面的左侧导航栏选择[容器管理],在这个页面可以管理您刚才部署的容器实例,并查看容器的实时运行状态信息。

../../_images/docker-getting-started-container-management.png

构建和运行说明

如何识别应用是NodeJS应用?

新浪云容器通过通过判断应用根目录下是否存在 package.json 文件来判断一个应用是否是NodeJS应用。

指定NodeJS版本

部署应用的时候,最好指定你需要用到的NodeJS版本(使用和你本地测试用的版本一致)。如果不指定,容器云构建的时候默认会使用目前版本最高的stable版本。

$ node --version
v4.1.1

你可以在 package.json 中指定你要使用的NodeJS版本(删掉上面最前面的‘v’,只保留版本号)。

{
  "name": "myapp",
  "description": "a really cool app",
  "version": "1.0.0",
  "engines": {
    "node": "4.1.1"
  }
}

指定Npm版本

大部分时候,你不需要单独指定npm版本,使用NodeJS自带的npm就可以了。

Npm 2.1.x 以前的版本有很多已知的问题,如果你使用的NodeJS版本的npm比较老,你可以通过以下方法指定你要使用的npm版本。

{
  "name": "myapp",
  "description": "a really cool app",
  "version": "0.0.1",
  "engines": {
    "npm": "2.1.x"
  }
}

自定义构建过程

如果你有一些自定义的脚本需要在构建的时候运行,你可以使用npm的postinstall脚本,该脚本会在所有构建动作完成后最后执行,例:

{
  "scripts": {
    "start": "node index.js",
    "test": "mocha",
    "postinstall": "bower install && grunt build"
  }
}

Runtime说明

服务端最终调用 npm start 来启动应用。

常见问题

确保应用的依赖模块在package.json中有定义

当使用 npm install 安装模块的时候,模块会被安装到依赖的 node_modules 目录下,但是这个依赖模块却并没有被添加到 package.json 文件中。这个时候应用在本地可以运行,但是部署到服务器上时会因为缺少依赖的关系而运行失败。

所以,安装模块的时候最好使用 npm install --save 来安装模块, --save 会在安装模块的同时将依赖添加到 package.json 文件里。

同理,不要依赖全局的模块。