pm2 全要素
以下是PM2从安装到基础命令解释,再到项目部署、自动启动及删除的全要素流程:
安装PM2
- 确保已经安装了Node.js和npm,可以通过在终端输入
node -v
和npm -v
来检查版本,如果未安装则需先安装。 - 在终端中输入以下命令来全局安装PM2:
npm install pm2 -g
.
PM2基础命令解释
- 启动应用程序:
pm2 start {app.js}
,此命令将启动Node.js应用程序并将其作为守护进程运行。例如,如果应用程序的入口文件是app.js
,则在终端中导航到该文件所在目录后,输入pm2 start app.js
即可启动应用 。还可以使用pm2 start app.js --name my-api
为PM2进程指定名称,使用pm2 start app.js -i 0
根据CPU核数启动进程个数,使用pm2 start app.js --watch
以实时监控app.js
文件变动并自动重新加载的方式启动. - 查看进程列表:
pm2 list
,该命令会显示PM2管理的所有进程的信息,包括进程ID、名称、版本、运行模式、PID、运行时间、状态等,方便查看各个应用程序的运行状态. - 查看进程详细信息:
pm2 show {id}
或pm2 info {id}
,其中{id}
为PM2进程的ID,可以通过pm2 list
命令获取。这条命令能提供更详细的进程信息,如进程的启动时间、监听端口、CPU和内存使用情况等. - 停止进程:
pm2 stop {app.js}
或pm2 stop {id}
,用于停止指定的应用程序进程。例如pm2 stop app.js
将停止名为app.js
的应用程序,pm2 stop 0
将停止进程ID为0的进程。如果想要停止所有进程,可以使用pm2 stop all
. - 重启进程:
pm2 restart {app.js}
或pm2 restart {id}
,此命令会重启指定的应用程序进程,如pm2 restart app.js
会重启app.js
应用,pm2 restart 0
则重启进程ID为0的进程。也可以使用pm2 restart all
重启所有进程. - 删除进程:
pm2 delete {app.js}
或pm2 delete {id}
,用于删除指定的PM2进程。比如pm2 delete app.js
会删除名为app.js
的进程,pm2 delete 0
会删除进程ID为0的进程,pm2 delete all
可删除所有进程. - 监控应用程序:
pm2 monit
,该命令会打开一个实时监控仪表盘,展示应用程序的运行状态和资源使用情况,如CPU使用率、内存占用等,方便开发者及时了解应用程序的性能表现. - 日志操作:
pm2 logs
用于查看所有进程的日志信息,pm2 flush
可以清空所有日志文件,pm2 reload logs
则会重新加载所有日志.
项目部署
- 首先确保已经完成了项目的开发,并在本地能够正常运行。
- 在项目的根目录下创建一个
pm2.config.js
配置文件,用于配置PM2启动时的相关参数,示例如下:
module.exports = {
apps : [
{
name: 'my-app',
script: './app.js',
watch: true,
ignore_watch: ['node_modules', 'logs'],
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 80
}
}
]
};
上述配置文件中,定义了应用程序的名称为my-app
,启动脚本为app.js
,并设置了监控文件变动以及忽略监控的目录,同时还配置了开发环境和生产环境下的不同环境变量。
3. 启动项目时使用pm2 start pm2.config.js
命令,PM2会根据配置文件中的参数来启动应用程序。如果是在生产环境下启动,可以使用pm2 start pm2.config.js --env production
来使用生产环境的配置启动应用.
自动启动
- 执行
pm2 startup
命令,该命令会根据系统的init系统生成一个启动脚本,并给出相应的配置命令。例如在使用systemd的系统中,会生成类似sudo env PATH=$PATH:/usr/bin/usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username
的命令,将此命令复制到终端中执行,即可将PM2设置为自动启动,这样在系统重启后,PM2会自动启动之前保存的应用程序. - 在执行完
pm2 startup
并配置好自动启动后,还需要执行pm2 save
命令,该命令会将当前PM2管理的进程列表保存到本地磁盘,通常保存的文件路径为~/.pm2/dump.pm2
。这样在系统重启时,PM2能够根据保存的信息自动重新启动相应的应用程序.
删除
- 要删除单个PM2进程,可以使用
pm2 delete {app.js}
或pm2 delete {id}
命令,其中{app.js}
为应用程序的文件名或{id}
为进程ID,如pm2 delete app.js
或pm2 delete 0
等. - 若要删除所有的PM2进程,可以使用
pm2 delete all
命令,该命令会一次性删除PM2管理的所有进程.
PM2监控和管理应用程序性能 的应用参考
- 安装PM2
- 首先要确保系统已经安装了Node.js和npm。可以通过在终端输入
node -v
和npm -v
来检查它们是否已安装。如果没有安装,需要先安装Node.js,因为npm是随同Node.js一起安装的。 - 安装PM2,在终端中输入
npm install pm2 -g
。这里的-g
参数表示全局安装,这样就可以在任何目录下使用PM2命令。
- 首先要确保系统已经安装了Node.js和npm。可以通过在终端输入
- 启动应用并开启监控
- 假设你有一个Node.js应用程序,入口文件是
app.js
。使用pm2 start app.js
命令来启动应用程序。这会让应用在后台作为守护进程运行。 - 要开始监控应用程序的性能,使用
pm2 monit
命令。这个命令会打开一个实时的监控仪表盘,展示应用程序的运行状态和资源使用情况。 - 在监控仪表盘上,你可以看到以下关键信息:
- 进程信息:包括进程ID、名称等。例如,你可以很容易地识别正在运行的应用程序对应的进程。
- CPU使用率:以百分比的形式显示应用程序当前占用的CPU资源。如果CPU使用率持续过高,可能表示应用程序存在性能瓶颈,比如存在死循环或者过度复杂的计算。
- 内存使用量:显示应用程序占用的内存大小。内存泄漏是应用程序开发中常见的问题之一,如果内存使用量不断增加,可能需要检查代码中是否存在内存泄漏的情况。
- 假设你有一个Node.js应用程序,入口文件是
- 查看详细性能指标
- 使用
pm2 show {id}
或pm2 info {id}
命令({id}
是通过pm2 list
获取的进程ID)来查看更详细的性能指标。 - 详细信息包括:
- 启动时间:了解应用程序是什么时候启动的,这对于排查应用程序启动相关的问题很有帮助。
- 运行时间:可以知道应用程序已经持续运行了多长时间,对于评估应用程序的稳定性有一定的参考价值。
- 网络信息:如应用程序监听的端口等。如果应用程序是一个网络服务,通过查看监听端口可以确认它是否正常工作。
- 错误日志路径:方便查看应用程序出现错误时的详细信息,用于调试。
- 使用
- 日志管理与性能分析
pm2 logs
命令用于查看所有进程的日志信息。日志是分析应用程序性能问题的重要依据。例如,如果应用程序出现错误或者运行缓慢,日志中可能会包含相关的线索,如数据库查询超时、网络请求失败等信息。- 可以通过配置PM2来按照一定的规则分割日志文件,防止日志文件过大。同时,使用
pm2 flush
可以清空所有日志文件,pm2 reload logs
则会重新加载所有日志,这在需要重新开始记录日志或者调整日志配置时很有用。
- 自动重启和负载均衡(与性能管理相关)
- PM2可以配置应用程序的自动重启策略。在
pm2.config.js
配置文件中(可以通过pm2 start pm2.config.js
来启动应用并应用配置),可以设置watch
选项。例如:
当module.exports = { apps : [ { name: 'my - app', script: './app.js', watch: true } ] };
watch
设置为true
时,PM2会监视应用程序文件的变化,一旦文件发生变化(如代码更新),就会自动重启应用程序。这有助于在开发过程中快速应用代码更改,同时也可以在生产环境中及时更新应用程序以修复性能问题或者添加新功能。- PM2还支持负载均衡。通过
pm2 start app.js -i max
(max
表示根据CPU核心数启动最多的进程),可以启动多个应用程序进程来分担负载。这对于提高应用程序的并发处理能力和整体性能非常有帮助,特别是在处理大量请求的情况下。
- PM2可以配置应用程序的自动重启策略。在
PM2部署和管理多个应用程序
- 安装PM2
- 确认已安装Node.js和npm,在终端中通过
node -v
和npm -v
检查版本。若未安装,先安装Node.js,因为npm会随之安装。 - 执行
npm install pm2 -g
进行PM2的全局安装,这样就能在任何目录下使用PM2相关命令。
- 确认已安装Node.js和npm,在终端中通过
- 配置应用程序启动参数(针对每个应用)
- 创建独立的配置文件(以
.js
格式为例),例如为应用App1
创建pm2 - app1.config.js
文件,内容可以如下:
module.exports = { apps: [ { name: 'App1', script: 'app1.js', cwd: '/path/to/app1/directory', // 以下是一些可选参数 watch: false, env: { NODE_ENV: 'development', PORT: 3001 }, env_production: { NODE_ENV: 'production', PORT: 8080 } } ] };
- 解释一下配置参数:
name
:应用程序的名称,用于在PM2中识别该应用。script
:应用程序的入口文件路径。cwd
:应用程序的工作目录。watch
:设置为true
时,PM2会监视应用程序文件的变化,发生变化时自动重启应用;设置为false
则不监视。env
和env_production
:分别用于定义开发环境和生产环境下的环境变量,如NODE_ENV
用于区分环境,PORT
用于指定应用监听的端口。
- 按照同样的方式为其他应用程序(如
App2
、App3
等)创建各自的配置文件。
- 创建独立的配置文件(以
- 启动多个应用程序
- 对于每个应用程序,使用对应的配置文件启动。例如,启动
App1
使用pm2 start pm2 - app1.config.js
,启动App2
使用pm2 start pm2 - app2.config.js
等。 - 也可以在一个配置文件中配置多个应用程序同时启动。例如,创建一个
pm2 - multipleApps.config.js
文件:
module.exports = { apps: [ { name: 'App1', script: 'app1.js', cwd: '/path/to/app1/directory', env: { NODE_ENV: 'development', PORT: 3001 }, env_production: { NODE_ENV: 'production', PORT: 8080 } }, { name: 'App2', script: 'app2.js', cwd: '/path/to/app2/directory', env: { NODE_ENV: 'development', PORT: 3002 }, env_production: { NODE_ENV: 'production', PORT: 8081 } } ] };
- 然后使用
pm2 start pm2 - multipleApps.config.js
启动所有在配置文件中定义的应用程序。
- 对于每个应用程序,使用对应的配置文件启动。例如,启动
- 查看和管理应用程序列表
- 使用
pm2 list
命令查看所有正在运行的应用程序。它会显示每个应用程序的详细信息,包括进程ID(id
)、名称(name
)、运行状态(status
)、重启次数(restart
)等。 - 根据
pm2 list
显示的信息,可以对应用程序进行管理。例如:- 停止某个应用程序:使用
pm2 stop {name}
或pm2 stop {id}
,如pm2 stop App1
或pm2 stop 0
(假设App1
对应的进程ID是0)。 - 重启某个应用程序:使用
pm2 restart {name}
或pm2 restart {id}
,如pm2 restart App2
或pm2 restart 1
。 - 查看某个应用程序的详细信息:使用
pm2 show {name}
或pm2 show {id}
,如pm2 show App3
,可以查看应用程序的启动时间、监听端口、CPU和内存使用情况等详细信息。
- 停止某个应用程序:使用
- 使用
- 设置应用程序自动启动(在系统重启时)
- 执行
pm2 startup
命令。这个命令会根据系统的初始化系统(如systemd
或init.d
)生成一个启动脚本,并给出相应的配置命令。例如,在使用systemd
的系统中,可能会得到一个类似sudo env PATH = $PATH:/usr/bin/usr/local/lib/node_modules/pm2/bin/pm2 startup systemd - u username --hp /home/username
的命令。 - 将生成的命令复制到终端并执行,这样就将PM2设置为自动启动。但这还不够,还需要执行
pm2 save
命令,它会将当前PM2管理的进程列表保存到本地磁盘(通常保存的文件路径为~/.pm2/dump.pm2
),以便在系统重启时,PM2能够根据保存的信息自动重新启动相应的应用程序。
- 执行
- 日志管理
- 对于多个应用程序,
pm2 logs
命令可以查看所有应用程序的日志信息。通过日志,可以了解每个应用程序的运行情况,如是否有错误发生、性能相关的信息等。 - 可以通过配置PM2来按照应用程序名称或其他规则分割日志文件,这样更方便对每个应用程序的日志进行单独分析和管理。例如,在配置文件中可以添加
error_file
和out_file
参数来指定错误日志和输出日志的文件路径,如下:
module.exports = { apps: [ { name: 'App1', script: 'app1.js', cwd: '/path/to/app1/directory', error_file: '/path/to/logs/app1 - error.log', out_file: '/path/to/logs/app1 - output.log' } ] };
- 对于多个应用程序,
PM2 日志管理
- 查看日志
- 基本的日志查看命令是
pm2 logs
。当你在终端输入这个命令后,它会实时显示所有由PM2管理的应用程序的日志信息。这些日志包括应用程序在运行过程中输出到控制台的所有内容,如打印的调试信息、错误消息等。 - 例如,如果你有一个Node.js应用程序通过PM2启动,并且应用程序中有
console.log()
语句,这些输出内容会在pm2 logs
中显示出来。 - 你还可以通过添加应用程序名称或进程ID来查看特定应用程序的日志。例如,
pm2 logs app - name
(其中app - name
是应用程序在PM2中的名称)或者pm2 logs [id]
([id]
是进程ID,可通过pm2 list
查看)。
- 基本的日志查看命令是
- 日志文件位置与配置
- PM2默认会将日志存储在
~/.pm2/logs/
目录下。在这个目录中,每个应用程序通常会有一个以应用程序名称命名的输出日志文件([app - name]-out.log
)和一个错误日志文件([app - name]-err.log
)。 - 你可以在应用程序的PM2配置文件(例如
pm2.config.js
)中自定义日志文件的位置。以下是一个配置示例:
module.exports = { apps: [ { name: 'my - app', script: 'app.js', error_file: '/custom/path/error.log', out_file: '/custom/path/output.log' } ] };
- 在这个配置中,
error_file
和out_file
分别指定了错误日志和输出日志的存储路径。当你启动应用程序(pm2 start pm2.config.js
)后,日志就会按照你指定的路径进行存储。
- PM2默认会将日志存储在
- 日志滚动(Log Rotation)
- 随着应用程序的运行,日志文件可能会变得很大。为了避免日志文件无限增长,PM2支持日志滚动功能。
- 你可以通过在PM2配置文件中添加
log_type
和log_date_format
参数来配置日志滚动。例如:
module.exports = { apps: [ { name: 'my - app', script: 'app.js', log_type: "json", log_date_format: "YYYY - MM - DD HH:mm:ss" } ] };
- 这里
log_type
可以设置为json
(以JSON格式存储日志)、raw
(原始格式)等。log_date_format
用于指定日志文件日期格式,方便对日志进行按日期分类和管理。 - 另外,还可以使用第三方工具如
pm2 - logrotate
来进一步增强日志滚动功能。安装pm2 - logrotate
可以通过npm install pm2 - logrotate - g
命令。然后在终端输入pm2 install pm2 - logrotate
进行安装配置,它会自动按照一定的规则(如按文件大小或日期)对日志进行滚动处理。
- 清空日志
- 如果你想清空所有的日志文件,可以使用
pm2 flush
命令。这个命令会将所有由PM2管理的应用程序的日志文件清空,以便重新开始记录。 - 不过需要注意的是,清空日志后,之前的日志信息将无法恢复,所以在执行这个操作之前,要确保已经备份了需要的日志内容或者已经对日志进行了分析。
- 如果你想清空所有的日志文件,可以使用
- 重新加载日志配置
- 当你修改了日志相关的配置(如日志文件位置、日志滚动规则等)后,可以使用
pm2 reload logs
命令来重新加载日志配置。这样,应用程序就会按照新的配置来记录和管理日志。
- 当你修改了日志相关的配置(如日志文件位置、日志滚动规则等)后,可以使用
PM2管理和部署不同版本的应用程序
-
版本控制与代码管理基础
- 首先,应该使用版本控制系统(如Git)来管理应用程序的不同版本。将应用程序的代码存储在版本控制系统的仓库中,并且为每个有意义的版本(如功能更新、修复Bug等)创建标签或分支。
- 例如,当完成一个新功能开发后,可以创建一个新的分支(如
feature - new - function
),在这个分支上进行测试和开发。当测试通过后,将其合并到主分支(如master
),并为这个版本打上标签(如v1.1
)。
-
配置PM2启动脚本(针对不同版本)
- 为每个应用程序版本创建独立的PM2启动配置文件。假设应用程序名为
my - app
,对于版本1.0,创建pm2 - my - app - v1.0.config.js
,内容如下:
module.exports = { apps: [ { name: 'my - app - v1.0', script: '/path/to/v1.0/app.js', cwd: '/path/to/v1.0/directory', env: { NODE_ENV: 'development', APP_VERSION: '1.0' }, env_production: { NODE_ENV: 'production', APP_VERSION: '1.0' } } ] };
- 对于版本1.1,创建
pm2 - my - app - v1.1.config.js
,在脚本路径、工作目录和版本相关的环境变量等方面进行相应修改:
module.exports = { apps: [ { name: 'my - app - v1.1', script: '/path/to/v1.1/app.js', cwd: '/path/to/v1.1/directory', env: { NODE_ENV: 'development', APP_VERSION: '1.1' }, env_production: { NODE_ENV: 'production', APP_VERSION: '1.1' } } ] };
- 为每个应用程序版本创建独立的PM2启动配置文件。假设应用程序名为
-
部署不同版本
- 要部署特定版本的应用程序,使用对应的PM2配置文件启动。例如,要部署版本1.0,在终端中执行
pm2 start pm2 - my - app - v1.0.config.js
;要部署版本1.1,执行pm2 start pm2 - my - app - v1.1.config.js
。 - 可以通过
pm2 list
查看正在运行的应用程序版本,它会显示每个应用程序的名称(包含版本信息)、状态等。例如,你会看到my - app - v1.0
和my - app - v1.1
分别作为不同的条目显示出来。
- 要部署特定版本的应用程序,使用对应的PM2配置文件启动。例如,要部署版本1.0,在终端中执行
-
版本切换与更新
- 升级应用程序版本时,可以先停止旧版本的应用程序。例如,如果要从版本1.0升级到版本1.1,使用
pm2 stop my - app - v1.0
。 - 然后启动新版本,即
pm2 start pm2 - my - app - v1.1.config.js
。这样就完成了版本的切换。 - 为了实现平滑升级,在配置文件中可以设置一些参数。例如,设置
watch
参数为true
,这样PM2会监视应用程序文件的变化。当更新代码后,PM2会自动重启应用程序。以下是一个带有watch
参数的配置示例:
module.exports = { apps: [ { name: 'my - app - v1.1', script: '/path/to/v1.1/app.js', cwd: '/path/to/v1.1/directory', watch: true, env: { NODE_ENV: 'development', APP_VERSION: '1.1' }, env_production: { NODE_ENV: 'production', APP_VERSION: '1.1' } } ] };
- 升级应用程序版本时,可以先停止旧版本的应用程序。例如,如果要从版本1.0升级到版本1.1,使用
-
环境变量与版本管理
- 利用环境变量来区分不同版本的应用程序。在上面的配置文件中,通过
APP_VERSION
环境变量来记录应用程序的版本。 - 在应用程序代码中,可以根据这个环境变量来执行不同的逻辑。例如,在Node.js应用程序中:
const appVersion = process.env.APP_VERSION; if (appVersion === '1.0') { // 执行版本1.0的特定逻辑 } else if (appVersion === '1.1') { // 执行版本1.1的特定逻辑 }
- 利用环境变量来区分不同版本的应用程序。在上面的配置文件中,通过
-
回滚策略
- 如果在更新版本后发现问题,需要回滚到之前的版本。可以使用之前保存的PM2配置文件来快速回滚。
- 例如,如果版本1.1出现问题,停止版本1.1的应用程序(
pm2 stop my - app - v1.1
),然后启动版本1.0的应用程序(pm2 start pm2 - my - app - v1.0.config.js
)。 - 同时,为了更好地管理回滚过程,可以记录每次版本更新和回滚的时间、原因等信息,以便后续的故障排查和版本管理。