原文:medium.com/hackernoon/…node
维护你的代码库并保持其相关性确有难度;但与之相比咱们会发现,维护一个应用时最大的挑战来自于保持其存活和运行。不只如此,随着 Node.js 变成大部分后端 API 的核心语言,单线程程序的伸缩也变得困难;这就是 PM2 出现并受到欢迎的缘由了。git
有不少进程管理工具,广为人知的如 Forever、strong-pm,或是不错的 Linux 系统工具 SystemD。还有就是本文的主角 PM2,有着 4100 多万的总下载量和 31k GitHub stars(译注:截止本文翻译时)。究其缘由,简单地说,就是其简单易用而且让管理一个生产环境变得完美无缺。github
正如其新版首页中所标榜的,PM2 是一个“身经百战(battle hardened)”的、适用于生产环境的 Node.js 应用运行时和进程管理工具。 也自带了内建的 负载均衡器,这使得扩展应用越发容易。最棒的是,它在 Linux、Windows 和 macOS 都能工做。docker
经过一个 process.json
配置文件(译注:该文件可自行命名,通常叫作 process.json、processes.json 或 ecosystem.json,该名称将做为参数传入 pm2 start
等命令中),你能够指定想要运行的进程及要扩展到多少个进程。当启动 PM2 时,它将根据以上配置文件处理其余全部的事情(甚至比配置文件指定的更多一些 😉)。json
全部这些意味着 PM2 能帮助你保持 Node.js 应用永远运行下去,并在你更新应用或服务器时以 0 故障停机时间自动重启。后端
安装 PM2 就是小菜一碟。首先,确保你已经配置好了 process.json 文件,用以启动进程。api
通常只需运行 yarn add global pm2 便可安装。若是使用了一个 Docker 容器(对,也支持 Docker),按照 pm2.keymetrics.io/docs/usage/… 中的说明安装。安全
若是你实在好奇它看起来长什么样,这里有一个 process_prod.json 文件的例子,用于一个开源的 RSS & 播客 应用:bash
// process_prod.json
{
"apps": [{
"name": "api",
"cwd": "api/dist",
"script": "server.js",
"watch": false
},
{
"name": "conductor",
"cwd": "api/dist/workers",
"script": "conductor.js",
"watch": false
},
{
"name": "rss-worker",
"cwd": "api/dist/workers",
"script": "rss.js",
"instances": 2,
"exec_mode": "cluster",
"watch": false
},
{
"name": "podcast-worker",
"cwd": "api/dist/workers",
"script": "podcast.js",
"instances": 2,
"exec_mode": "cluster",
"watch": false
},
{
"name": "og-worker", // 应用名称
"cwd": "api/dist/workers", // 启动应用的目录
"script": "og.js", // 启动脚本
"instances": 2, // 被启动的应用实例数量
"exec_mode": "cluster", // 启动模式,默认为 fork
"watch": false, // 若是容许 watch,则其中的文件改变会引起重启
"max_memory_restart": "150M" // 引起重启的最大内存使用量
}
]
}
复制代码
如你所见,咱们运行了若干个进程,而且 PM2 轻松掌控了一切;其自动地使用了 Node.js 的 Cluster API 以实现多进程。服务器
译注:配置文件的完整介绍见 pm2.keymetrics.io/docs/usage/…
对于任何应用(或者本例中的进程管理工具),从先行者那里了解一些技巧和经验都是有好处的。
一旦 PM2 启动,你的应用就将永远存活,并在应用崩溃和机器从新启动后自动重启 -- 全部这些只消一条简单的命令(用于得到针对所在机器的自动配置过的启动脚本):
pm2 startup
复制代码
如:
$ pm2 startup
[PM2] You have to run this command as root. Execute the following command:
sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v4.3/bin pm2 startup <distribution> -u <user> --hp <home-path> 复制代码
只要按照打印的结果,拷贝并运行获得的脚本就好了。
无论你运行了多少个应用,PM2 的一套命令都能让你管理它们各自的状态。如下是经常使用的一些命令(不区分顺序):
pm2 start process_prod.json
— 经过进程配置文件启动进程pm2 ls
— 列出全部的应用pm2 stop <app>
— 中止指定的应用pm2 start <app>
— 启动指定的应用pm2 <app> scale N
— 缩放指定应用的实例数量pm2 kill
— 杀掉全部运行中的应用pm2 restart
— 重启全部运行中的应用pm2 reload
— 从新加载应用配置(这会在你修改了应用的环境变量时派上用场)运行命令 pm2 monit
会返回关于应用健康的丰富数据。好比,你将看到 CPU 利用率、内存使用量、请求分钟数等等。
PM2 内建了日志管理功能。它从全部你的应用中聚合日志数据,并将其写入一个用于阅读的源文件中。你甚至能够经过事实跟踪日志来看到应用背后正在发生什么。 PM2 的日志管理也提供了日志循环,这一点很是重要,特别是当应用程序频繁地输出详细日志时。
有三条我常用的命令,想必你也应该同样:
pm2 logs
— 从全部正在运行的应用中输出日志pm2 logs <app>
— 只从指定的应用中输出日志pm2 flush
— 刷新全部日志数据,释放磁盘空间请记住,确保日志循环是最重要的事情。这样作将会把一个巨大的日志文件分割成若干易于 PM2 管理的小文件。要作到这点,运行以下命令:
pm2 install pm2\-logrotate
复制代码
日志管理的更多信息能够在 pm2.keymetrics.io/docs/usage/… 找到。
若是发现你的实例常常被日志填满,也能够考虑使用一个集中式日志服务,如 Loggly、Papertrail,或 ELK。
一般,我会乐于遵照 “应用十二因素”(12factor.net/)所述的实践。这将帮助… PM2 全部的优点。若是你已经阅读过其声明,应该见到了这 12 条规则:
若是遵照了以上规则,你将可以经过 PM2 高效而安全地扩展任何应用。
搜索 fewelife 关注公众号
转载请注明出处