本文是测试在运行时更新ecosystem配置文件的记录。

源码

服务端

/*
express简单示例
*/
//const log = require('../lib/log.js');
const http = require('http');
const express = require('express');var cluster = require('cluster');
var os      = require('os');// const g_port = 4000;
const g_port = process.env["SERVER_PORT"];
const g_name = process.env["NODE_ENV"];function test1()
{
app = express();const server = http.createServer(app);// 监听端口
server.listen(g_port, () => {console.log(`111Express is listening on ${g_port}`);
});// 访问首页,显示当时时间
app.get('/', function (req, res) {console.log('111 got request from ...',  req.url);str = 'Hello World! now is: <br>';myDate = new Date();myDate.toLocaleString();str += myDate;res.send(str);
});process.on('SIGINT', () => {console.log('111 got sigint...\n');const cleanUp = () => {};// 如果服务器关闭,延时2秒退出server.close(() => {// Stop after 10 secssetTimeout(() => {cleanUp();process.exit();}, 2000);});// Force close server after 15 secssetTimeout((e) => {console.log('Forcing server close !!!', e);cleanUp();process.exit(1);}, 3000);});
}var g_cnt = 0;
// 这里创建worker是否必要?
// 解答:使用pm2的cluster模式,就不用手动写代码
function test2()
{var numCPUs = 2; //os.cpus().length;if (cluster.isMaster) {  // Master:// Let's fork as many workers as you have CPU coresfor (var i = 0; i < numCPUs; ++i) {cluster.fork();}} else {// Worker:// Let's spawn a HTTP server// (Workers can share any TCP connection.//  In this case its a HTTP server)console.log(`111 httpserver is listening on ${g_port}`);http.createServer(function(req, res) {res.writeHead(200);console.log('got request from ...',  req.url);str = 'here is my voice: Hello World! now is: \n';myDate = new Date();myDate.toLocaleString();str += myDate;g_cnt++;var cnt = '  cnt: ' + g_cnt.toString() + '\n';str += cnt;res.end(str);}).listen(g_port);}}// 该函数不使用worker方式
function test3()
{console.log(`httpserver[${g_name}] is listening on ${g_port}`);http.createServer(function(req, res) {res.writeHead(200);console.log('111 got request from ...',  req.url);str = '111 here is my voice: Hello World! now is: \n';myDate = new Date();myDate.toLocaleString();str += myDate;g_cnt++;var cnt = '  cnt: ' + g_cnt.toString() + '\n';str += cnt;res.end(str);}).listen(g_port);}// main函数
function main()
{//test1();//test2();test3();
}main();

客户端


/*
用于测试http服务器连接性,每0.5秒发送GET请求,如连接不上,返回错误,打印err
*/var request = require('request');const log = require('../lib/log.js');const g_port = 4000;function httpGet(url, requestData)
{var head = {url: url,method: "GET",json: true,headers: {"content-type": "application/json",'User-Agent': 'git-oschina-hook','X-Gitee-Token': 'webhook password','X-Gitee-Event': 'Push Hook'},body: requestData// body: JSON.stringify(requestData)};request(head, function fn(error, response, body) {if (!error && response.statusCode == 200) {log.print('=============GET content: \n', body) // 成功}else{log.print('err');}});
}function getHttp()
{var url = 'http://127.0.0.1:'+ g_port;var msg = new Object();msg['devid'] = '123456798';msg['station'] = '01';msg['stateCode']=='501';//log.print('will get the http.');httpGet(url, msg);
}var g_loopId = null;function startLoop()
{g_loopId = setInterval(loopFunc, 500);
}function stopLoop()
{clearInterval(g_loopId);
}function loopFunc()
{getHttp();
}function main()
{log.print('start looping...');startLoop();
}main();

配置文件ecosystem.config.js

module.exports = {// APP是一个数组,可以有多个// 参数参考:https://pm2.io/doc/en/runtime/reference/ecosystem-file/apps : [{name: 'app',script: 'server.js',args: 'null',instances: 1,//exec_mode: "cluster", // 集群模式,如不指定,默认为forkautorestart: false,min_uptime: "60s",max_restarts: 3,watch: false,//error_file: "./logs/app-err.log",//out_file: "./logs/app-out.log",log: "./logs/app.log",//log_date_format: "YYYY-MM-DD HH:mm Z", // pm2 log添加日期max_memory_restart: '1G',//listen_timeout: 3000,kill_timeout: 3000,// wait_ready: true,env:{NODE_ENV: 'development',SERVER_PORT: "4000",},env_production:{NODE_ENV: 'production1',SERVER_PORT: "4000",}}]
};

使用

启动服务端:

pm2 start

使用客户端连接,并观察输出日志:

node client.js

测试使用的命令:

重启pm2配置文件
pm2 reload ecosystem.config.js
重启实例
pm2 reload <ID>

测试项

下面分别进行不同的测试,大部分只写结论。

更新env中的字段值

可行。

如果修改的是env_production,则:

pm2 reload ecosystem.config.js --env production

另外在命令后面,加上不加上 --update-env ,好像没影响。

更新非env的字段

使用pm2 reload,没效果,不成功。

新加实例

原来只有一个app,再加上一个app,但要修改名称和端口号,其它可相同。使用pm2 reload,可以看到有新的实例运行。

减少实例

原来有2个app,减少一个。
使用pm2 reload,没效果,不成功。

实例改名

原来app改名,端口没变化:
会启动新的实例,但提示端口被占用(因为没改)。
结论:只要名称不一样,pm2就认为是新的实例,要启动。打印信息会提示[PM2][WARN] Applications app1 not running, starting...之类。所以,在mp2运行过程中,有一种方式“更新”实例,先将旧的实例停止(否则会提示占用端口号),将旧实例配置参数复制一份,将实例名称改为新的名称。再reload配置文件。更好的方法请参考下面示例。

删除实例再启动

pm2 del 1 (实例ID为1)
pm2 reload ecosystem.config.js

此时服务端的实例ID为2,1已经不存在了,但服务名称是一致的。

删除实例,修改实例,再启动

同上,可以修改pm2配置文件,也生效。

结论

1、pm2可以在原有基础上新加实例,直接reload ecosystem.config.js即可启动新的实例。
2、通过pm2 delpm2 reload可以修改某个实例的所有内容(注:只是理论,笔者主要关注log、端口等参数)。
3、如果要一切复原,终极办法是使用pm2 kill

李迟 2019.2.25 周一中午

nodejs实践录:pm2实验测试记录相关推荐

  1. nodejs实践录:测试连接性及邮件通知

    本文给出一个与服务器测试连通性的示例,具备邮件通知功能,可以以此为基础添加需要的测试项. 代码功能如下: 测试程序与服务器连接,发送指定报文(由内部指定),服务端收到指定报文,回复testOK,客户端 ...

  2. nodejs实践录:pm2使用

    本文介绍pm2的基本使用方法.主要针对pm2的命令,有关配置 文件ecosystem.config.js的细节,后文将进行讲解. 重要教训 在生产环境中,谨慎使用pm2 kill.pm2 restar ...

  3. nodejs实践录:使用curl测试post请求

    以前与后台交互的json接口,都是用postman工具来测试的,后来发现curl命令也可以发post或get请求.本文利用koa创建web服务器,对外提供了几个URL,然后用curl进行测试. 3.源 ...

  4. nodejs实践录:ubuntu 16.04系统nodejs环境搭建

    本文讲述ubuntu 16.04 64bit系统中,nodejs环境的搭建. 安装 此章节已失效 此章节已失效 更新源,命令如下: sudo apt-get update sudo apt-get i ...

  5. nodejs实践录:开篇

    笔者从事C开发很多年了,不太想跨语言开发,不过,因为工作的关系,需要使用nodejs进行后台开发.一来是工作,二来多了解一个新语言,总归是有好处. 经过一段时间加强训练,了解了nodejs一点皮毛,发 ...

  6. Golang实践录:xorm使用记录

    xorm使用记录.主要针对 mysql,也会涉及其它的. 技术总结 提供通用接口,适用于多种数据库,隐藏细节.但需要手动添加数据库驱动(Golang 本身亦如是). 可以用 Sync2 创建数据表,多 ...

  7. nodejs实践录:基于koa的简单web服务器

    背景: nodejs搭建web服务是一件十分简单的事情,支持的框架多,有关的库也多,不像嵌入式那般繁琐.本文提出一种利用koa搭建web服务的方案,适用简单的数据展示和信息查询,文后有源码地址,可直接 ...

  8. nodejs实践录:我的nodejs编码风格

    本文介绍笔者使用nodejs开发的环境,以及编码风格. 环境 笔者在linux.windows都安装了nodejs,还安装了pm2.在windows平台,使用cmd终端或git bash运行node或 ...

  9. nodejs实践录:windows 10系统nodejs环境搭建

    本文讲述windows 10 64bit系统中,nodejs环境的搭建. 安装 下载地址为:https://nodejs.org/zh-cn/download/, 下载安装包为node-v10.15. ...

最新文章

  1. jq判断滚动条向上还是向下
  2. WebClient 文件下载
  3. iOS 开发之获取时间到年底可能会踩到的坑
  4. nginx负载均衡的5种策略
  5. APP设计灵感|仪表盘这样设计,所有信息一目了然!
  6. oracle进入rman报错,Oracle学习系列之Rman学习(三)
  7. 关于Chromium Embedded Framework (CEF)的编译
  8. 远程控制计算机软件有哪些,支持远程控制电脑的工具有哪些?这几款软件值得一试!...
  9. windows10未安装任何音频输出设备(1903、1909)
  10. 印象笔记三级目录_如何建立印象笔记的三层目录构架
  11. win10 wifi连接不上服务器未响应,Win10连不上WiFi怎么办?Win10连不上WiFi解决方法介绍...
  12. python 象棋 ai 入门教程-用turtle画中国象棋棋盘
  13. 业务流程优化设计之思想和原则
  14. 享学独立站:Logo设计理念
  15. 传统图像增强算法python实现
  16. N76E003 串口接收字符串,完整输出
  17. 电脑计算机c盘打不开怎么办,Win7系统电脑C盘打不开怎么办_Win7系统电脑C盘打不开的解决方法 - 系统家园...
  18. 【互补松弛定理】12.7.16省队集训
  19. 5V升压充电8.4V芯片
  20. SpringMVC前端控制器的配置理解

热门文章

  1. 小新触控板不能用了_小新Pad Pro体验----高颜值新青年平板
  2. 比尔·盖茨的11条人生箴言
  3. 江苏约谈滴滴、T3出行等6家企业 因疫情防控落实不到位
  4. iPhone 14系列贴膜曝光:将采用开孔屏方案 四边框极窄
  5. 剧集《赘婿》向流媒体平台Watcha授出翻拍权
  6. 传网易、京东6月相继赴港上市:共计筹资50亿美元
  7. 雷军在线求饶:小米5G手机价格厚道,求别骂、求好评、求别带节奏
  8. 新垣结衣AI换脸郭德纲 网友:换脸史上最惨的车祸现场
  9. 华为年度旗舰Mate 30 Pro真机现身,既惊喜又失望...
  10. 1小时搞定马化腾,却巨亏200亿!近五年最火的创业明星,正在沦为网红