pm2 简单教程
以前简单了解过
PM2
,但是没有太多的实战经验,仅用于托管单个站点。现在因为手头上要部署二进制服务和Python 自动化脚本,故而记一下常用的指令,尤其是开机自启动与定时任务部分。
PM2 就是一个管理进程的进程,可以用于部署web 服务,自动化脚本。它能够实现基本的定时任务、故障重启、均衡负载。相较于systemd 或者是windows 服务,使用起来更加简单。
npm i -g pm2
命令行参数
添加并启动一个实例:
# 启动脚本
pm2 start app.js
# 给脚本传入参数,要用 -- 隔开
pm2 start app.exe -- --port 2333
# 常用参数
--name <pm2 实例名>
# 监控当前文件夹(含子文件夹)变化,指定排除项
--watch --ignore-watch="node_modules"
# 超过内存自动重启
--max-momory-restart <200MB>
# <日志文件路径>
--log
# 日志添加时间前缀
--time
# 重启延迟
--restart-delay <毫秒数>
# 不自动重启
--no-autorestart
# 定时重启任务
--cron <规则>
# 不作为后台进程运行(不常用)
--no-daemon
## 集群 ##
# 对于NodeJS 的应用,可以自动启动多个实例并且均衡负载
pm2 start app.js -i number
# 对于计划任务,可以采用下面的方式(对于单次任务脚本,要禁用掉自动重启):
pm2 start app.js --cron-restart="0/10 10,14 9-17 * * *" --no-autorestart
# cron 的模式为
# 1. 秒(0 - 59)
# 2. 分钟(0 - 59)
# 3. 小时(0 - 23)
# 4. 日(1 - 31)
# 5. 月份(1 - 12)
# 6. 星期(0 - 7,其中0和7代表星期日)
管理实例
管理服务:
pm2 [list|ls|status]
pm2 delete name
# 查看日志
pm2 logs [--lines 200] # 限制行数
# 简单的仪表盘
pm2 monit
pm2 plus
通过配置文件启动
通过配置文件可以方便地管理许多实例,并且对于任务的修改也比较友好:
pm2 ecosystem
pm2 start ecosystem.config.js
pm2 reload ecosystem.config.js
pm2 [start|reload] ecosystem.config.js --only name
配置文件
下面是ecosystem.config.js
文件的结构:
const app = {
name: "app",
script: "./app.js",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}
// app2 更为常用,并且可以用于设置非NodeJS 的应用
const app2 = {
name: '实例名,默认是脚本文件名',
script: '脚本的路径',
cwd: '指定工作目录',
args: '指定参数',
interpreter: '解释器路径,默认为Node, 但其实也可用于Poetry',
interpreter_args: '解释器参数',
node_args: '解释器参数的别名',
// 高级参数
instance: -1, // 实例数量,为0 的话,自动创建CPU 核心数
exec_mode: 'fork', // 也可以选择集群模式`cluster`
watch: false, // 监控文件变化
ignore_watch: ['[\/\\]\./'], // 忽略项
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
},
// 控制流
cron_restart: '0 0 * * *', //定时重启
autorestart: false, // 自动重启
restart_delay: 0, // 重启延时,微秒
}
module.exports = {
apps : [app, app2]
}
设置开机启动
注意,下面命令生成的启动项文件会在当前用户工作区间内,也可以以管理员用户运行,这样就可以访问所有资源了。
# 生成一个开机启动项
pm2 startup
# 保存当前运行的实例为开机启动项
pm2 save
使用实例
以安装Gogs
为例,因为通过包安装不比通过二进制文件配合PM2 简单
# 1. 创建git 用户,禁止交互式(如ssh)登录
sudo adduser --disabled-login --gecos 'Gogs' git # --gecos 'Gogs' 信息不重要
安装配置好数据库的信息,之后切换到git 用户
sudo -i -u git
curl https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_amd64.zip --output gogs.zip
unzip gogs.zip
# 其实这里就已经可以通过pm2 启动了
pm2 start ./gogs web
# 但是还有更好的方案
因为要设置为开机启动,所以最好通过su
账户统一启动,但同时又考虑到服务的权限问题,因此需要设置一个启动脚本:
# 配置pm2 开机自启动
sudo pm2 startup
# 创建一个从其他用户启动gogs 实例的脚本
sudo vim /home/git/gogs/gogs.sh
# 以下为脚本内容, <<EOF 表示创建一个文本块,并传递给脚本命令。EOF 可以自己定义
sudo su - git <<EOF
# 进入 git 用户的主目录
cd ~
# 进入 gogs 目录
cd gogs
# 启动 gogs
./gogs web
EOF
# 结束
# 将上述脚本设置内可执行
sudo chmod +x /home/git/gogs/gogs.sh
# 启动服务
sudo pm2 start /home/git/gogs/gogs.sh
# 保存
sudo pm2 save
比较重要的就是上面创建用户,和用户脚本的编写了。🎂