离线环境下Node.js应用部署方法

离线环境下Node.js应用部署时需要解决以下三个基本问题:

  1. Node.js应用的进程管理,如性能监控、自动重启、负载均衡等
  2. Node.js应用开机如何自启动
  3. 离线环境下如何部署Node.js应用

下面以在Windows Server 2012上离线部署Node.js应用为例,记录上述问题的解决方案:

Node.js应用的进程管理

在生产环境中运行 Express 应用程序时,使用进程管理器对于完成以下任务很有帮助[1]

  • 在应用程序崩溃后将其重新启动。
  • 获得对运行时性能和资源消耗的洞察。
  • 动态修改设置以改善性能。
  • 控制集群。

进程管理器有点类似于应用程序服务器:它是应用程序的“容器”,可促进部署,提供高可用性并使您可以在运行时管理应用程序。

用于 Express 和其他 Node.js 应用程序的最流行的进程管理器包括:

  • StrongLoop Process Manager
  • PM2
  • Forever

上述三种工具的比较请参阅http://strong-pm.io/compare/。其中,StrongLoop Process Manager无法在Windows平台工作,再综合比较PM2和Forever,由于Forever没有操作系统自启动的脚本,故选择PM2作为Windows平台Node.js应用的进程管理器。

Node.js应用开机如何自启动

选择PM2作为Node.js应用的进程管理器后,Node.js应用开机自启动的问题就变为如何开机自启动PM2。Windows平台存在两个自启动PM2的脚本:

  • pm2-windows-service
  • pm2-windows-startup

pm2-windows-service基于 node-windows将PM2注册为Windows服务,从而实现自启动。pm2-windows-startup则基于start-on-windows-boot在注册表中将PM2设为自启动程序,从而实现自启动。两种方案经测试,只有pm2-windows-startup在Windows Server 2012上可行,故选择pm2-windows-startup作为解决Node.js应用开机自启动的方案。

离线环境下如何部署Node.js应用

PM2和pm2-windows-startup必须全局安装,如何简单方便地在离线环境下全局安装这两个模块是一个问题。网上搜到的方法有:

  • npm link
  • npm-bundle

npm link[2]是npm的一个命令,可将本地包链接成全局包,但实际测试过程中,无法解决PM2包的依赖问题,故放弃。而npm-bundle[3]则能很好的解决PM2的依赖问题。具体过程为:

1
2
3
4
5
6
\\在线环境下全局安装
npm install -g pm2
npm install -g pm2-windows-startup
npm install -g npm-bundle
npm-bundle pm2
npm-bundle pm2-windows-startup

离线部署Nodejs Express应用

1
2
3
4
5
6
7
@echo off
SET NODE_ENV=production
call npm install .\pm2-2.10.3.tgz -g
call npm install .\pm2-windows-startup-1.0.3.tgz -g
call pm2-startup install
call pm2 start ./bin/www -i 0
call pm2 save

离线卸载Nodejs Express应用

1
2
3
4
5
@echo off
call pm2 stop all
call pm2-startup uninstall
call npm uninstall pm2 -g
call npm uninstall pm2-windows-startup -g

参考链接

  1. Express 应用程序的进程管理器, by Express
  2. npm离线安装全局包,内网安装npm中的包, by 爱死费崇政
  3. What exact command is to install pm2 on offline RHEL, by stackoverflow.
  4. NodeJS: PM2 Startup on Windows,by Walter Accantelli.
  5. bat脚本%cd%和%~dp0获取当前目录区别,by dmfrm