为什么需要进程管理器
做过服务端开发的同学应该比较清楚,在生产环境运行一个web服务,并不是只是简单的把服务启动起来就可以。为了确保服务质量,至少需要完成下面事情:
- 服务异常重启
- 服务资源占用情况监控
- 配置灵活更改(加自动重启生效)
- 集群部署(性能相关)
这个时候,进程管理器显得非常重要。目前常用的node进程管理器有pm2、forever等。
笔者两者都用过,个人更喜欢pm2。下文就简单围绕pm2展开。更多更详尽的总结,可以参考笔者之前的总结文章《PM2实用入门指南》。
pm2安装
方便起见,一般都采取全局安装。
npm install -g pm2
启动服务
假设我们通过 express 的脚手架初始化项目
express demo
然后,启动项目。-w 表示,当项目文件发生变化时,服务自动重启。
➜ demo pm2 start -w ./bin/www
[PM2] Starting ./bin/www in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ www │ 0 │ fork │ 84743 │ online │ 0 │ 0s │ 14.969 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
查看当前运行的服务
pm2 list
重启服务
有的时候,服务运行久了,资源占用比较厉害。这个时候,可以适时重启服务。
以下三种方式都可以,其中,wwww 是服务的名称,0 是服务的id。
pm2 restart ./bin/www
pm2 restart www
pm2 restart 0
停止服务
pm2 stop www
删除服务
pm2 delete www
使用配置文件
上面只是举了最简单的例子。在实际使用中,我们可能还要完成更多的工作,比如只监听特定目录的文件变化、将访问日志写到特定文件、设置环境变量等。
如果都在命令行里完成,不但繁琐,还容易出错。这个时候就可以通过配置文件来完成。
示例配置 app.json 如下(假设在项目根路径下)
{
"name" : "fis-receiver", // 应用名称
"script" : "./bin/www", // 实际启动脚本
"cwd" : "./", // 当前工作路径
"watch": [ // 监控变化的目录,一旦变化,自动重启
"bin",
"routers"
],
"ignore_watch" : [ // 从监控目录中排除
"node_modules",
"logs",
"public"
],
"watch_options": {
"followSymlinks": false
},
"error_file" : "./logs/app-err.log", // 错误日志路径
"out_file" : "./logs/app-out.log", // 普通日志路径
"env": {
"NODE_ENV": "production" // 环境参数,当前指定为生产环境
}
}
这个时候,可以这样启动服务,搞定。
pm2 start app.json