UDN-企业互联网技术人气社区

板块导航

浏览  : 388
回复  : 2

[Nodejs] nodejs进程管理工具pm2

[复制链接]
genie1003的头像 楼主
发表于 2017-1-2 15:25:36 | 显示全部楼层 |阅读模式
  nodejs作为一种单线程、单进程运行的程序,如果只是简单的使用的话,存在着如下一些问题:

  • 无法充分利用多核cpu机器的性能,
  • 服务不稳定,一个未处理的异常都会导致整个程序退出
  • 没有成熟的日志管理方案、
  • 没有服务/进程监控机制

  所幸无论是nodejs本身还是强大的nodejs社区,已经有了很多比较成熟的方案来解决这些问题。

  cluster模块

  从某个版本开始,nodejs提供了cluster模块来fork出多个工作线程:
  1. const cluster = require('cluster');
  2. const http = require('http');
  3. const numCPUs = require('os').cpus().length;

  4. if (cluster.isMaster) {
  5.   // Fork workers.
  6.   for (var i = 0; i < numCPUs; i++) {
  7.     cluster.fork();
  8.   }

  9.   cluster.on('exit', (worker, code, signal) => {
  10.     console.log(`worker${worker.process.pid}died`);
  11.   });
  12. } else {
  13.   // Workers can share any TCP connection
  14.   // In this case it is an HTTP server
  15.   http.createServer((req, res) => {
  16.     res.writeHead(200);
  17.     res.end('hello world\n');
  18.   }).listen(8000);
  19. }
复制代码

  由主进程fork出很多的工作进程,运行我们的业务代码,主线程会持有IO句柄,将任务根据round-robin算法分发给work进程去处理。

  pm2模块

  pm2是一个开源的nodejs进程管理模块,nodejs本身的cluster提供了进程管理的基础功能,pm2则对其进行了强大的封装,并提供了方便命令行程序,使用起来非常方便。其github地址: https://github.com/Unitech/pm2

  安装pm2: npm install pm2 -g

  下面简单记录一下我平时比较常用的pm2命令

  启动多个工作进程
  1. pm2 start server.js -i 5
复制代码

  此命令可以启动5个工作进程来运行我们的业务代码,且让nodejs程序在后台运行,提供异常退出拉起、日志、进程监控等功能。

  扩容进程
  1. pm2 scale [app-name] 10
复制代码

  将一个服务的进程扩容到10个

  查看后台运行的服务、进程列表
  1. pm2 list
复制代码

  执行此命令可查看当前正在后台运行的服务列表及其进程列表:
3.png

  停止服务
  1. pm2 stop [app-name]
复制代码

  停止名字为 app-name 的服务
  1. pm2 stop all
复制代码

  停止所有服务

  删除服务
  1. pm2 delete [app-name]
复制代码

  从列表中删除并停止名为app-name的服务
  1. pm2 delete all
复制代码

  从列表中删除并停止所有服务的所有进程

  查看日志
  1. pm2 logs [app-name]
复制代码

  查看名为app-name的服务的log
  1. pm2 logs all
复制代码

  查看所有服务的log

  查看进程监控
  1. pm2 monit [app-name]
复制代码

  查看服务各进程的运行情况:
2.png

  查看服务详情
  1. pm2 show [app-name]
复制代码

  此命令会显示该服务所有进程的详细信息:
1.png

  代码热替换
  1. pm2 start app.js --watch
复制代码

  此功能在项目开发阶段使用比较方便,其功能是在代码发生变化的时候立即自动重启服务使新代码生效。

  可以在package.json中配置watch选项:
  1. {
  2.   "watch": ["server", "client"],
  3.   "ignore_watch" : ["node_modules", "client/img"],
  4.   "watch_options": {
  5.     "followSymlinks": false
  6.   }
  7. }
复制代码

相关帖子

发表于 2017-1-2 15:26:08 | 显示全部楼层
前排支持下
使用道具 举报

回复

发表于 2017-1-4 22:05:04 来自手机 | 显示全部楼层
其实js如果遇到web安全类的项目,那就又要做牺牲了,无法读写文件,访问受限。。。哎。。。
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部