二、为森么要使用pm2
原始社会的我们开发node服务端程序一般过程:
编写好node程序app.js,运行node app.js;或者写入script使用npm运行;打开浏览器访问;
好像需要修改内容,浏览器对修改的内容没有显示出来?->node app.js->再次运行;
浏览器忽然访问不到服务,好像出错啦?重启下->node app.js->再次运行;
哎呀开了好多控制台窗口,一不小心关闭了,服务又访问不到了,继续打开控制台->node app.js->再次运行;
好崩溃!好像有个工具nodemon;安装使用nodemon app.js;哇,可以自动监听文件修改变化自动重启,但是关闭控制台服务还是会被摧毁。
通过这个很常用的场景,我们了解到要避免这些麻烦一个服务器至少需要有:后台运行和自动重启,这两个能力。
再来看看使用pm2可拥有的能力:
日志管理;两种日志,pm2系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中;
负载均衡:PM2可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许以零秒停机时间重新启动应用程序。
终端监控:可以在终端中监控应用程序并检查应用程序运行状况(CPU使用率,使用的内存,请求/分钟等)。
SSH部署:自动部署,避免逐个在所有服务器中进行ssh。
静态服务:支持静态服务器功能
支持开发调试模式,非后台运行,pm2-dev start <appName>;
。。。。。太过强大!
pm2常用命令
启动服务pm2 start <script_file|config_file> [options] 启动指定应用
pm2 start app.js //启动app.js应用 pm2 start app.js --name app //启动应用并设置name pm2 start app.sh //脚本启动 pm2 start app.js --watch //监听模式启动,当文件发生变化,自动重启 //max 表示PM2将自动检测可用CPU的数量并运行尽可能多的进程 //max可以自定义,如果是4核CPU,设置为2则占用2个 pm2 start app.js -i max //启用群集模式(自动负载均衡) pm2-dev start ... // 开发模式启动,即不启用后台运行
查看启动列表pm2 list
显示应用程序详细信息pm2 show <appName> [options] 显示指定应用详情
pm2 show [Name] //根据name查看 pm2 show [ID] //根据id查看
停止指定应用pm2 stop <appName> [options] 停止指定应用
pm2 stop all //停止所有应用 pm2 stop [AppName] //根据应用名停止指定应用 pm2 stop [ID] //根据应用id停止指定应用
重启应用pm2 reload|restart <appName> [options] 重启指定应用
pm2 restart app.js //同时杀死并重启所有进程,短时间内服务不可用,生成环境慎用 pm2 reload app.js //重新启动所有进程,0秒重启,始终保持至少一个进程在运行 pm2 gracefulReload all //以群集模式重新加载所有应用程序
启动静态服务器pm2 serve ./dist 8080将目录dist作为静态服务器根目录,端口为8080
删除应用pm2 delete <appName> [options] 删除指定应用;如果修改了应用配置行为,需要先删除应用,重新启动后方才会生效,如修改脚本入口文件;
pm2 delete all //关闭并删除应用 pm2 delete [AppName] //根据应用名关闭并删除应用 pm2 delete [ID] //根据应用ID关闭并删除应用
pm2 kill 杀掉pm2管理的所有进程;
pm2 logs <appName> 查看指定应用的日志,即标准输出和标准错误
pm2 logs //查看所有应用日志 pm2 logs [Name] //根据指定应用名查看应用日志 pm2 logs [ID] //根据指定应用ID查看应用日志
pm2 monit 监控各个应用进程cpu和memory使用情况;
PM2配置方式
命令生产默认示例配置文件pm2 ecosystem或pm2 init,运行默认会生成ecosystem.config.js配置文件
module.exports = { apps: [ { name: 'back-Api', //应用名 script: './server/start.js', //应用文件位置 env: { PM2_SERVE_PATH: "./apidoc", //静态服务路径 PM2_SERVE_PORT: 8080, //静态服务器访问端口 NODE_ENV: 'development' //启动默认模式 }, env_production : { NODE_ENV: 'production' //使用production模式 pm2 start ecosystem.config.js --env production }, instances:"max", //将应用程序分布在所有CPU核心上,可以是整数或负数 instance_var: "INSTANCE_ID", exec_mode: "cluster", watch:[ "server", ], //监听模式,不能单纯的设置为true,易导致无限重启,因为日志文件在变化,需要排除对其的监听 merge_logs: true, //集群情况下,可以合并日志 } ], deploy: { production : { user: 'node', //ssh 用户 host: '212.83.163.1', //ssh 地址 ref: 'origin/master', //GIT远程/分支 repo: 'git@github.com:repo.git', //git地址 path: '/var/www/production', //服务器文件路径 "post-deploy": 'npm install && pm2 reload ecosystem.config.js --env production' //部署后的动作 } } };
自定义json配置文件如:processes.json;启动pm2 start processes.json