为什么需要进程管理器

做过服务端开发的同学应该比较清楚,在生产环境运行一个web服务,并不是只是简单的把服务启动起来就可以。为了确保服务质量,至少需要完成下面事情:

  • 服务异常重启
  • 服务资源占用情况监控
  • 配置灵活更改(加自动重启生效)
  • 集群部署(性能相关)

这个时候,进程管理器显得非常重要。目前常用的node进程管理器有pm2、forever等。

笔者两者都用过,个人更喜欢pm2。下文就简单围绕pm2展开。更多更详尽的总结,可以参考笔者之前的总结文章《PM2实用入门指南》

pm2安装

方便起见,一般都采取全局安装。

  1. npm install -g pm2

启动服务

假设我们通过 express 的脚手架初始化项目

  1. express demo

然后,启动项目。-w 表示,当项目文件发生变化时,服务自动重启。

  1. demo pm2 start -w ./bin/www
  2. [PM2] Starting ./bin/www in fork_mode (1 instance)
  3. [PM2] Done.
  4. ┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
  5. App name id mode pid status restart uptime memory watching
  6. ├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
  7. www 0 fork 84743 online 0 0s 14.969 MB disabled
  8. └──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
  9. Use `pm2 show <id|name>` to get more details about an app

查看当前运行的服务

  1. pm2 list

重启服务

有的时候,服务运行久了,资源占用比较厉害。这个时候,可以适时重启服务。

以下三种方式都可以,其中,wwww 是服务的名称,0 是服务的id。

  1. pm2 restart ./bin/www
  2. pm2 restart www
  3. pm2 restart 0

停止服务

  1. pm2 stop www

删除服务

  1. pm2 delete www

使用配置文件

上面只是举了最简单的例子。在实际使用中,我们可能还要完成更多的工作,比如只监听特定目录的文件变化、将访问日志写到特定文件、设置环境变量等。

如果都在命令行里完成,不但繁琐,还容易出错。这个时候就可以通过配置文件来完成。

示例配置 app.json 如下(假设在项目根路径下)

  1. {
  2. "name" : "fis-receiver", // 应用名称
  3. "script" : "./bin/www", // 实际启动脚本
  4. "cwd" : "./", // 当前工作路径
  5. "watch": [ // 监控变化的目录,一旦变化,自动重启
  6. "bin",
  7. "routers"
  8. ],
  9. "ignore_watch" : [ // 从监控目录中排除
  10. "node_modules",
  11. "logs",
  12. "public"
  13. ],
  14. "watch_options": {
  15. "followSymlinks": false
  16. },
  17. "error_file" : "./logs/app-err.log", // 错误日志路径
  18. "out_file" : "./logs/app-out.log", // 普通日志路径
  19. "env": {
  20. "NODE_ENV": "production" // 环境参数,当前指定为生产环境
  21. }
  22. }

这个时候,可以这样启动服务,搞定。

  1. pm2 start app.json

相关链接

Process managers for Express apps