当Express应用运行在生产环境时, 使用一个进程管理器来达到以下目标是非常有帮助的:
- 当应用崩溃时,重启应用
- 获取应用的运行性能和资源点用情况
- 动态修改应用设置以改进运用的性能
- 管理集群
进程管理器类似于应用服务器:是一个方便应用的部署,提供可用性,允许在运行时管理应用的应用容器。
下面是Express应用和其它node.js应用最流行的进程管理器:
使用上述4个中的任一个都非常有帮助,其中StrongLoop Process Manager 是其中唯一提供完整的运行时和部署解决方案的。它管理Node.js应用的整个生命周期,为发布成到生产环境前后的每一步在统一的界面中提供工具。
下面是对于这个工具的简短的介绍。查看更多的详细信息, 参阅 http://strong-pm.io/compare/。
Forever
Forever 是一个保证指定脚本持续运行的一个简单的命令行工具。Forever的简洁的界面使它成为一个部署运行小Node.js应用和脚本的好的选项。
更多信息,请参考 https://github.com/foreverjs/forever。
安装
1 | $ [sudo] npm install forever -g |
基本使用
使用forever的启动命令行和脚本路径启动一个脚本:1
$ forever start path/to/script.js
这个命令行会使用守护进程模式运行脚本(在后台进程)。
如果要在当前终端运行脚本,可以省略start:1
$ forever script.js
更好的做法是使用Forever工具记录日志输出,如下所示在命令行中添加-l, -o, -e选项:1
$ forever start -l forever.log -o out.log -e err.log path/to/script.js
查看所有使用Forever启动的脚本:1
$ forever list
停止使用Forever启动的脚本可以使用Forever的停止命令行 指定进程的索引(在forever list命令行列表中可以查看)1
$ forever stop 1
或者也可以指定脚本的路径:1
$ forever stop path/to/script.js
停止所有使用Forever启动的脚本:1
$ forever stopall
Forever提供了非常多的设置,也提代的可编程的API。
PM2
PM2是一个Node.js应用生产环境的进程管理器,它内置了负载均衡。PM2保持应用一直运行,可以在不停止服务的下重新加载,同时也方便一些通用的系统任务管理。 PM2可以管理应用的日志、监控和集群。
更多信息, 请参考 https://github.com/Unitech/pm2。
安装
1 | $ [sudo] npm install pm2 -g |
基本使用
使用pm2命令行启动应用时, 必须指定应用的路径。在停止,重启,删除应用时可以只需要指定应用名或者应用的Id。1
2
3
4
5
6
7
8$ 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启动应用行,在pm2的应用列表中注册并得到了一个ID。 你可以使用这些IDs在不同的环境和目录下管理这些应用。
如果有超过一个应用具有相同的name,在同时运行, pm2命令行执行会影响全部具有相同name的应用,因此,建议使用IDs替代name来管理不同的应用。
列出所有正在运行的进程:1
$ pm2 list
停止一个应用:1
$ pm2 top 0
重启一个应用:1
$ pm2 restart 0
显示一个应用的详细信息:1
$ pm2 show 0
从pm2注册列表中移除一个应用:1
$ pm2 delete 0
StrongLoop Process Manager
StrongLoop Process Manage(StrongLoop PM) 是一个Node.js应用生产环境进程管理器。 StrongLoop PM 内置了负载均衡, 监控和多服务器部署,也提提供了一个图形界面的控制台。可以使用StrongLoop PM来完成以下任务:
- 构建、打包和部署Node.js应用到本地或远程环境
- 查看CPU性能内存快照以优化性能和发现内存泄漏
- 保持进程和集群持续运行
- 查看应用性能矩阵
- 内置nignx方便的管理多个应用服务器
- 可以将多个StrongLoop PM 以分布式微服务的方式使用Arc统一管理。
可以使用叫slc的强大的命令行接口来使用StrongLoop PM, 也可以使用一个叫Arc的图形化工具来使用StrongLoop PM. Arc已经开源,StrongLoop提供专业的支持。
更多信息,参考 http://strong-pm.io/
完整的文档:
安装
1 | $ [sudo] npm install -g strongloop |
基本用法
1 | $ cd my-app |
查看进程管理器的状态和所有的部署的应用:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15$ 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
列出管理的所有的应用(服务):1
2
3$ slc ctl ls
Id Name Scale
1 my-app 1
停止一个应用1
$ slc ctl stop my-app
重启一个应用:1
$ slc ctl restart my-app
也可以“软重启”, 这样允许正在运行的进程有一个优雅的时间来关闭已经有链接后,再重启应用。1
$ slc ctl soft-restart my-app
从管理器中移除一个应用:1
$ slc ctl remove my-app
SystemD
介绍
SystemD是现代Linux版本中默认的进程管理器。基于SystemD运行一个Node.js应用非常简单。下面的内容引自 Ralph Slooten (@axllent)的一篇博客。
创建服务
创建文件/etc/systemd/system/express.service:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25[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
使服务可用
1 | $ systemctl enable exress.service |
启动服务
1 | $ systemctl start express.service |
查看服务状态
1 | $ systemctl status express.service |