为了使next.js项目能够不宕机,使用了pm2守护进程,既能保证node出现异常情况能够自动重启,也能保证服务器整机重启时自动恢复服务。多年使用下来的确能够良好运行,不过最近却出现了与原本期望不符的情况。
在已经启动next.js项目的情况下,如果需要重启,我使用了pm2 reload appname,实际上没有完美的零停机重启,反而是直接出现服务不可用,访问网站就502,并且一直无法恢复。在查阅pm2 issue后发现确实有这样的bug。
无奈,只能使用pm2 restart来重启应用。
pm2支持远程部署服务,创建文件ecosystem.json,内容形式如: { // Applications part "apps" : [{ "name" : "API", "script" : "app.js", "env": { "COMMON_VARIABLE": "true" }, // Environment variables injected when starting with --env production // http://pm2.keymetrics.io/docs/usage/application-declaration/#switching-to-different-environments "env_production" : { "NODE_ENV": "production" } },{ "name" : "WEB", "script" : "web.js" }], // 部署部分 // Here you describe each environment "deploy" : { "production" : { "user" : "node", // 多主机配置 "host" : ["212.83.163.1", "212.83.163.2", "212.83.163.3"], // 服务使用的分支 "ref" : "origin/master", // Git 仓库地址 "repo" : "git@github.
nodejs中经常使用到环境变量,最常见的如:process.env.NODE_ENV。那么在生产环境中使用pm2如何设置环境变量?
设置方式一:shell命令设置 linux:export NODE_ENV=development&& node app.js
win:set NODE_ENV=development&& node app.js
一般是作临时变量在系统启动时设置,不影响其他系统,也可同时运行开发环境和生产环境,只需要根据process.env.NODE_ENV来运行不同逻辑即可。
设置方式二:配置文件设置 要在pm2设置环境变量也很简单。
pm2 start pm2.json –env production
--env production参数是为了设置环境变量,由pm2.json中的配置决定设置什么样的环境变量。
pm2.json
{ "apps" : [{ "name": "issue", "cwd": "dest", "script" : "bin/www.js", "instances" : "2", "exec_mode" : "cluster", "env": { "NODE_ENV": "development", "PORT": 3002 }, "env_production" : { "NODE_ENV": "production", "PORT": 3003 }, "log_date_format": "YYYY-MM-DD_HH:mm Z", "merge_logs": true }] } 如果不加参数则默认使用
"env": { "NODE_ENV": "development", "PORT": 3002 } 结果:NODE_ENV=development,PORT=3002
加--env production则使用的是
pm2介绍 pm2是nodejs进程管理工具,现在基本是node生产服务器的标准选择,可以帮助我们实现node多进程服务,开启的多个实例自动实现负载均衡。 最重要的是保证node单进程不会因为错误退出,作为守护进程保证nodejs服务不宕机。 总体来说就是有性能监控、自动重启、负载均衡的作用。
pm2-logrotate介绍 pm2本身是可以输出日志文件的,默认的文件路径:
error log path │ /home/username/.pm2/logs/app-error-0.log out log path │ /home/username/.pm2/logs/app-out-0.log 但是pm2的日志文件不能自动分割,这会导致一个文件不断变大,不但影响性能,查看这些日志也会带来麻烦。所以需要pm2-logrotate来实现自动分割日志。
安装pm2-logrotate pm2 install pm2-logrotate,是用pm2命令,不是npm命令
pm2-logrotate配置
max_size (默认 10M): 最大为多少时进行分割,例如: 10G, 10M, 10K retain (Defaults to all): This number is the number of rotated logs that are keep at any one time, it means that if you have retain = 7 you will have at most 7 rotated logs and your current one. compress (默认 false): 是否压缩日志 dateFormat (默认 YYYY-MM-DD_HH-mm-ss) : 日志格式 rotateModule (Defaults to true) : Rotate the log of pm2’s module like other apps workerInterval (Defaults to 30 in secs) : You can control at which interval the worker is checking the log’s size (minimum is 1) rotateInterval (Defaults to 0 0 * * * everyday at midnight): This cron is used to a force rotate when executed.
pm2的fork模式和cluster模式的区别
fork模式 pm2默认启动的是fork模式,是以单核单进程运行的,在fork模式下可以直接运行coffee-script,PHP,python。 参考:http://pm2.keymetrics.io/docs/tutorials/using-transpilers-with-pm2 运行非js语言必须设置运行模式为fork_mode
cluster模式 cluster模式可以根据CPU数量进行实例扩展,可以开启多进程而不需要修改代码。可提高程序性能和可靠性。类似于分布式系统,只不过是在单台机器上开启多实例,而pm2自带负载均衡。
** 使用方法 ** pm2 start app.js -i max 使用-i参数,max代表最大CPU进程数
也可以使用文件方式: processes.json文件:
{ "apps" : [{ "script" : "api.js", "instances" : "max", "exec_mode" : "cluster" }] } pm2 start processes.json