2. Express应用程序的流程管理器 | 2. Process managers for Express apps
Express应用程序的进程管理器
当您运行用于生产的Express应用程序时,使用流程管理器
来实现以下任务会很有帮助:
- 如果崩溃,请自动重新启动应用程序。
- 深入了解运行时性能和资源消耗。
- 动态修改设置以提高性能。
- 控制集群。
流程管理器有点像应用程序服务器:它是便于部署的应用程序的“容器”,提供高可用性,并使您能够在运行时管理应用程序。
Express和其他Node.js应用程序最流行的进程管理器如下所示:
- StrongLoop Process Manager
- PM2
- Forever
- SystemD
但是,使用这四种工具中的任何一种都可能非常有用,但StrongLoop Process Manager是唯一提供全面的运行时和部署解决方案的工具,该解决方案可解决整个Node.js应用程序生命周期,其中包括生产前后每一步的工具,统一的界面。
这里简要介绍一下这些工具。有关详细比较,请参阅http://strong-pm.io/compare/。
StrongLoop流程管理器
StrongLoop过程管理器(StrongLoop PM)是Node.js应用程序的生产过程管理器。StrongLoop PM具有内置负载平衡,监控和多主机部署以及图形控制台。您可以使用StrongLoop PM进行以下任务:
- 构建,打包并将Node.js应用程序部署到本地或远程系统。
- 查看CPU配置文件和堆快照以优化性能并诊断内存泄漏。
- 让进程和集群永远活着。
- 查看应用程序的性能指标。
- 使用Nginx集成轻松管理多主机部署。
- 将多个StrongLoop PM统一到从Arc管理的分布式微服务运行时。
您可以使用称为的强大的命令行界面工具slc
或称为Arc的图形工具来处理StrongLoop PM 。Arc是开源的,由StrongLoop提供专业支持。
有关更多信息,请参阅http://strong-pm.io/。
完整的文档:
安装
$ [sudo] npm install -g strongloop
基本使用
$ cd my-app
$ slc start
查看Process Manager和所有已部署的应用程序的状态:
$ slc ctl
Service ID: 1
Service Name: my-app
Environment variables:
No environment variables defined
Instances:
Version Agent version Cluster size
4.1.13 1.5.14 4
Processes:
ID PID WID Listening Ports Tracking objects? CPU profiling?
1.1.57692 57692 0
1.1.57693 57693 1 0.0.0.0:3001
1.1.57694 57694 2 0.0.0.0:3001
1.1.57695 57695 3 0.0.0.0:3001
1.1.57696 57696 4 0.0.0.0:3001
列出所有正在管理的应用程序(服务):
$ slc ctl ls
Id Name Scale
1 my-app 1
停止应用程序:
$ slc ctl stop my-app
重新启动应用程序:
$ slc ctl restart my-app
您也可以“软重启”,这为工作进程提供了一个宽限期来关闭现有连接,然后重新启动当前应用程序:
$ slc ctl soft-restart my-app
从管理中删除应用程序:
$ slc ctl remove my-app
PM2
PM2是Node.js应用程序的生产过程管理器,具有内置的负载平衡器。PM2允许您永久保持应用程序的活动状态并在无需停机的情况下重新加载它们,并且可以促进常见的系统管理任务 PM2还使您能够管理应用程序日志记录,监视和群集。
有关更多信息,请参阅https://github.com/Unitech/pm2。
安装
$ [sudo] npm install pm2 -g
基本使用
当您使用该pm2
命令启动应用程序时,您必须指定应用程序的路径。但是,当您停止,重新启动或删除应用程序时,您只能指定应用程序的名称或ID。
$ pm2 start app.js
[PM2] restartProcessId process id 0
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ my-app │ 0 │ fork │ 64029 │ online │ 1 │ 0s │ 17.816 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use the `pm2 show <id|name>` command to get more details about an app.
当您使用该pm2
命令启动应用程序时,应用程序会立即发送到后台。您可以使用各种pm2
命令从命令行控制后台应用程序。
通过使用该pm2
命令启动应用程序后,它将通过ID在PM2的进程列表中注册。因此,您可以使用其ID来管理系统上不同目录中具有相同名称的应用程序。
请注意,如果多个具有相同名称的应用程序正在运行,pm2
命令将影响所有这些应用程序。因此,使用ID而不是名称来管理各个应用程序。
列出所有运行的进程:
$ pm2 list
停止应用程序:
$ pm2 stop 0
重新启动应用程序:
$ pm2 restart 0
要查看有关应用程序的详细信息
$ pm2 show 0
从PM2的注册表中删除应用程序:
$ pm2 delete 0
forever
Forever是一个简单的命令行界面工具,用于确保给定脚本连续运行(永久)。Forever的简单界面非常适合运行较小的Node.js应用程序和脚本部署。
有关更多信息,请参阅https://github.com/foreverjs/forever。
安装
$ [sudo] npm install forever -g
基本使用
要启动脚本,请使用该forever start
命令并指定脚本的路径:
$ forever start script.js
该命令将以守护进程模式(在后台)运行该脚本。
要运行该脚本以便将其附加到终端,请忽略start
:
$ forever script.js
它是从永远的工具,通过使用日志选项脚本日志输出是个好主意-l
,-o
和-e
,如下面的例子:
$ forever start -l forever.log -o out.log -e err.log script.js
要查看Forever启动的脚本列表,请执行以下操作:
$ forever list
要停止由Forever启动的脚本,请使用该forever stop
命令并指定进程索引(如forever list
命令所列)。
$ forever stop 1
或者,指定文件的路径:
$ forever stop script.js
要停止Forever启动的所有脚本:
$ forever stopall
Forever有更多的选择,它还提供了一个程序化的API。
SystemD
介绍
SystemD是现代Linux发行版的默认进程管理器。基于SystemD运行Node服务非常简单。注意:本节基于Ralph Slooten(@axllent)的博客文章。
设置服务
在/etc/systemd/system/express.service
以下位置创建文件:
[Unit]
Description=Express
# Set dependencies to other services (optional)
#After=mongodb.service
[Service]
# Run Grunt before starting the server (optional)
#ExecStartPre=/usr/bin/grunt
# Start the js-file starting the express server
ExecStart=/usr/bin/node server.js
WorkingDirectory=/usr/local/express
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=Express
# Change to a non-root user (optional, but recommended)
#User=<alternate user>
#Group=<alternate group>
# Set environment options
Environment=NODE_ENV=production PORT=8080
[Install]
WantedBy=multi-user.target
启用服务
$ systemctl enable express.service
开始服务
$ systemctl start express.service
检查服务状态
$ systemctl status express.service