pm2 基础使用

pm2forever是启动Nodejs服务常用到的两个工具。使用这两个指令可以使node服务在后台运行(类似于linux的nohup),另外它们可以在服务因异常或其他原因被杀掉后进行自动重启。 由于Node的单线程特征,自动重启能很大程度上的提高它的健壮性。
本文不对比两者工具优劣,只是结合自己的使用,简要介绍如何在工程部署时更好的使用pm2。

基本指令

npm install pm2 -g : 全局安装。
pm2 start app.js : 启动服务,入口文件是app.js。
pm2 start app.js -i [n] --name [name] : 启动n个进程,名字命名为name。
npm restart [name or id] : 重启服务。
npm reload [name or id] : 和rastart功能相同,但是可以实现0s的无缝衔接;如果有nginx的使用经验,可以对比nginx reload指令。
pm2 start app.js --max_memory_restart 1024M : 当内存超过1024M时自动重启。 如果工程中有比较棘手的内存泄露问题,这个算是一个折中方案。
pm2 monit : 对服务进行监控。

更多的指令可以参考 PM2 介绍

高级用法

pm2支持配置文件启动:
pm2 ecosystem: 生成配置文件ecosystem.json
pm2 startOrRestart /file/path/ecosystem.json : 通过配置文件启动服务

如下是我开发时ecosystem.json的内容:

1 { 2 /** 3 * Application configuration section 4 * http://pm2.keymetrics.io/docs/usage/application-declaration/ 5 * 多个服务,依次放到apps对应的数组里 6 */ 7 apps : [ 8 // First application 9 { 10 name : "nova", 11 max_memory_restart: "300M", 12 script : "/root/nova/app.js", 13 out_file : "/logs/nova_out.log", 14 error_file : "/logs/nova_error.log", 15 instances : 4, 16 exec_mode : "cluster", 17 env: { 18 NODE_ENV: "production" 19 } 20 } 21 ] 22 }

上述采用cluster模式启动了4个服务进程;如果服务占用的内存超过300M,会自动进行重启。

监控工具

pm2的监控功能是其一大特色,它提供的监控服务Keymetrics monitoring
很酷炫,感兴趣的可以配置玩一下。

一些思考

1. 服务进程数

至于要启动几个进程,可以通过服务器的内核数进行确定,几个内核就启动几个服务。指令如下:

1 # 查看物理CPU个数 2 cat /proc/cpuinfo| grep "physical id" | sort| uniq | wc -l 3 4 # 查看每个物理CPU中core的个数(即核数) 5 cat /proc/cpuinfo| grep "cpu cores"| uniq 6 7 # 查看逻辑CPU的个数 8 cat /proc/cpuinfo| grep "processor"| wc -l

当然可以启动多个端口,一个端口号对应一个服务,这样的话就需要nignx来做负载均衡了。

2. 是否需要nginx

nginx可以做的事情主要有两个:

  1. 反向代理,实现简单的负载均衡: 如果有多台服务器或者一台服务器多个端口,可以考虑用nginx。
  2. 静态资源缓存:把一些静态资源(如静态页面,js等资源文件)放到nginx里,可以极大的提高服务的性能。
3. 自动化部署

通过shell脚本实现资源拉取、服务重启、nginx缓存更新等操作,再配合pm2的监控功能,就初步达到了一个后端工程部署的标配了。

参考资料:

  1. pm2官网
  2. node-deploy-practice
  3. pm2监控

本文转自 https://www.jianshu.com/p/225b9284cfb8,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )