yarn global add pm2
# 查看所有 PM2 管理的应用程序
pm2 list
# 可简写为
pm2 ls
# 启用 xxx 可以是 配置文件、脚本文件、应用程序名称、进程 ID
pm2 start xxx
# 暂停
pm2 stop xxx
# 暂停所有
pm2 stop all
# 重启 同时停止并重启所有进程,短时间内服务不可用
pm2 restart xxx
# 重启所有
pm2 restart all
# 重载 重新启动所有进程,始终保持至少一个进程在运行,实现 0s 重启
pm2 reload xxx
# 删除
pm2 delete xxx
# 删除所有
pm2 delete all
# 查看应用程序信息
pm2 info xxx
# 查看所有应用程序日志
pm2 logs
# 查看单个应用程序日志
pm2 logs app_name
# 查看监控
pm2 monit
对于 js 格式的配置文件,文件名需要以 .config.js 结尾,如 ecosystem.config.js 。
module.exports = {
apps : [
{
name: "worker", // 应用程序名称
cwd: "/var/www/", // 应用程序目录,其他的路径配置如果是相对路径,则会相对此目录
script: "./worker.js", // 启动脚本
instances: "max", // 要启动的应用实例数,一般根据 CPU 的核数设置,可以设置为“max”,将自动检测 CPU 的数量
exec_mode: "cluster", // 启动应用程序的模式,可以是“cluster”或“fork”,默认为fork
// 默认不会实现负载均衡,需要将 exec_mode 设置为 cluster
watch: true, // 是否监听文件变化自动重载应用程序,可以为 boolean 或者需要监控的目录的数组
ignore_watch: ["node_modules", "logs"], // 忽略监听的文件或目录,内容为正则表达式
env: { // 配置应用程序中环境变量
"NODE_ENV": "development",
},
env_production: { // 启动时通过参数 --env production 来使用此配置,如 pm2 start ecosystem.config.js --env production
"NODE_ENV": "production"
},
log_date_format: "YYYY/MM/DD HH:mm:ss", // 日志中时间格式
error_file: "./logs/err.log", // 错误日志文件路径
out_file: "./logs/out.log", // 输出日志文件路径
},
...
]
}
可以使用配置文件进行操作。
# 开启所有
pm2 start ecosystem.config.js
# 只开启应用程序 worker
pm2 start ecosystem.config.js --only worker
# 停止所有
pm2 stop ecosystem.config.js
# 重启所有
pm2 restart ecosystem.config.js
# 只重启应用程序 worker
pm2 restart ecosystem.config.js --only worker
# 重载所有
pm2 reload ecosystem.config.js
# 只重载应用程序 worker
pm2 reload ecosystem.config.js --only worker
# 删除所有
pm2 delete ecosystem.config.js
# 只删除应用程序 worker
pm2 delete ecosystem.config.js --only worker
参数列表
名称 | 描述 | 类型 | 默认 | 必须 | 示例 |
---|---|---|---|---|---|
key | SSH key 路径 | String | $HOME/.ssh | ||
user | 服务器用户名 | String | 是 | root | |
host | 服务器 IP 地址 | [String] | 是 | [“192.168.0.13”] | |
port | SSH 端口 | [String] | 22 | 22 | |
ssh_options | SSH 公钥检查 | String or [String] | StrictHostKeyChecking=no | ||
ref | GIT 分支 | String | 是 | origin/master | |
repo | GIT 远程仓库地址 | String | 是 | git@github.com:repo.git | |
path | 应用程序在服务器上的路径 | String | 是 | /var/www/my-repository | |
pre-setup | 安装前执行的命令 可以是 “;” 分割的多个命名 | String | apt-get install git | ||
post-setup | 安装后执行的命令 | String | ls -la | ||
pre-deploy-local | 部署前在本地执行的命令 可以是 “;” 分割的多个命名 | String | echo ‘This is a local executed command’ | ||
post-deploy | 部署后执行的命令 | String | 是 | npm install && pm2 reload ecosystem.config.js --env production |
示例
module.exports = {
// 应用程序部份
apps: [
{
name: "worker", // 应用程序名称
cwd: "/var/www/", // 应用程序目录,其他的路径配置如果是相对路径,则会相对此目录
script: "./worker.js", // 启动脚本
instances: "max", // 要启动的应用实例数,一般根据 CPU 的核数设置,可以设置为“max”,将自动检测 CPU 的数量
exec_mode: "cluster", // 启动应用程序的模式,可以是“cluster”或“fork”,默认为fork
// 默认不会实现负载均衡,需要将 exec_mode 设置为 cluster
watch: true, // 是否监听文件变化自动重载应用程序,可以为 boolean 或者需要监控的目录的数组
ignore_watch: ["node_modules", "logs"], // 忽略监听的文件或目录,内容为正则表达式
env: { // 配置应用程序中环境变量
"NODE_ENV": "development",
},
env_production: { // 启动时通过参数 --env production 来使用此配置,如 pm2 start ecosystem.config.js --env production
"NODE_ENV": "production"
},
log_date_format: "YYYY/MM/DD HH:mm:ss", // 日志中时间格式
error_file: "./logs/err.log", // 错误日志文件路径
out_file: "./logs/out.log", // 输出日志文件路径
},
],
// 部署部份
deploy: {
production: {
// 服务器用户名
user: 'root',
// 服务器 IP 地址
host: ['212.83.163.1', '212.83.163.2', '212.83.163.3'],
// git 分支
ref: 'origin/master',
// GIT 远程仓库地址
repo: 'git@github.com:repo.git',
// 应用程序在服务器上的路径
path: '/var/www/production',
// SSH 公钥检查
ssh_options: 'StrictHostKeyChecking=no',
// 安装前在服务器执行的命令,可以是 “;” 分割的多个命名,也可以是本地的脚本路径
'pre-setup': 'apt-get install git',
// 安装后在服务器执行的命令,也可以是服务器上脚本的路径
'post-setup': 'ls -la',
// 部署前在本地执行的命令,可以是 “;” 分割的多个命名
'pre-deploy-local': "echo 'This is a local executed command'",
// 部署后在服务器执行的命令
'post-deploy': 'npm install && pm2 startOrRestart ecosystem.config.js --env production',
// 必须在此环境上的所有应用程序中注入的环境变量
env: {
NODE_ENV: 'production',
},
},
},
};
服务器中如果没有 GIT 需要先安装,并生成公钥和私钥。
安装 GIT 可以使用 Yum ,Yum 上的版本通常比较旧,也可以自己手动安装。
# 使用 Yum 安装 git
yum -y install git
# 生成密钥
ssh-keygen -t rsa
在 ~/.ssh 目录下有 id_rsa 和 id_rsa.pub 两个文件,其中 id_rsa.pub 文件里存放的即是公钥。
登录到代码托管平台选择新增公钥,将 id_rsa.pub 文件里的公钥复制后添加进去即可。
首次部署需要先使用以下命令在服务器上初始化项目
pm2 deploy ecosystem.config.js production setup
再执行部署命令,即可完成部署
pm2 deploy ecosystem.config.js production
以下是部署命令的选项:
pm2 deploy <configuration_file> <environment> <command>
command 有如下选项:
命令 | 描述 |
---|---|
setup | 运行远程安装命令 |
update | 更新部署到最新版本 |
revert [n] | 恢复到前 n 次部署 |
curr[ent] | 输出当前发布的 commit id |
prev[ious] | 输出前一个发布的 commit id |
exec | run <cmd> | 在服务器上执行命令 |
list | 列出以前的部署提交 |
可通过以下命令显示部署帮助:
pm2 deploy help
解决方法是在 /usr/bin 目录下创建软连接
# 使用 whereis 命令查找 git 文件
whereis git
# 结果如下
# git: /usr/local/git /usr/local/git/bin/git
# 建立软连接
ln -s /usr/local/git/bin/git /usr/bin/git
# 重新查找
whereis git
# 结果如下
# git: /usr/bin/git /usr/local/git /usr/local/git/bin/git
解决方法同上
# 使用 whereis 命令查找 yarn 文件
whereis yarn
# 结果如下
# yarn: /root/.nvm/versions/node/v10.16.3/bin/yarn
# 建立软连接
ln -s /root/.nvm/versions/node/v10.16.3/bin/yarn /usr/bin/yarn
解决方法同上
# 使用 whereis 命令查找 node 文件
whereis node
# 结果如下
# node: /root/.nvm/versions/node/v10.16.3/bin/node
# 建立软连接
ln -s /root/.nvm/versions/node/v10.16.3/bin/node /usr/bin/node