当前位置: 首页 > 工具软件 > pm2-webshell > 使用案例 >

PM2 使用

井唯
2023-12-01

PM2 文档

全局安装

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

部署

参数列表

名称描述类型默认必须示例
keySSH key 路径String$HOME/.ssh
user服务器用户名Stringroot
host服务器 IP 地址[String][“192.168.0.13”]
portSSH 端口[String]2222
ssh_optionsSSH 公钥检查String or [String]StrictHostKeyChecking=no
refGIT 分支Stringorigin/master
repoGIT 远程仓库地址Stringgit@github.com:repo.git
path应用程序在服务器上的路径String/var/www/my-repository
pre-setup安装前执行的命令
可以是 “;” 分割的多个命名
Stringapt-get install git
post-setup安装后执行的命令Stringls -la
pre-deploy-local部署前在本地执行的命令
可以是 “;” 分割的多个命名
Stringecho ‘This is a local executed command’
post-deploy部署后执行的命令Stringnpm 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>
  • 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

遇到过的问题

bash: git: 未找到命令

解决方法是在 /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
bash: yarn: 未找到命令

解决方法同上

# 使用 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
/usr/bin/env: node: 没有那个文件或目录

解决方法同上

# 使用 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
 类似资料: