多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 安装 ~~~ npm install pm2 -g ~~~ <br> ## CLI 自动补全 ~~~bash pm2 completion install ~~~ <br> <br> # 常用命令 PM2会保留您的进程列表,以便能够轻松启动,重新启动和停止它们。 您的所有应用程序都在后台启动,让您可以访问命令行。 使用PM2 CLI与您的应用进行交互。 <br> ## 启动 ~~~ pm2 start app.js --watch -i 2 ~~~ 参数说明: * `--watch`:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。 * `-i --instances`:启用多少个实例,可用于负载均衡。如果`-i 0`或者`-i max`,则根据当前机器核数确定实例数目。 * `--ignore-watch`:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如`--ignore-watch="test node_modules "some scripts""` * `-n --name`:应用的名称。查看应用信息的时候可以用到。 * `-o --output <path>`:标准输出日志文件的路径。 * `-e --error <path>`:错误输出日志文件的路径。 <br> ## 查看进程状态 ~~~ pm2 ls ~~~ <br> ## 停止进程 停止特定的应用。可以先通过`pm2 list`获取应用的名字(--name指定的)或者进程id。 ~~~ pm2 stop app_name|app_id ~~~ 如果要停止所有应用,可以 ~~~ pm2 stop all ~~~ <br> ## 删除进程 ~~~ pm2 delete app_name|app_id pm2 delete all ~~~ <br> ## 重启进程 pm2 restart app <br> > 默认进程名称是不带.js的文件名(例如:app.js的app)。 使用--nameor -n进行更改。 ## 查看某个进程的信息 ~~~ pm2 describe app_name|app_id ~~~ ~~~ Describing process with id 0 - name app ┌───────────────────┬───────────────────────────────┐ │ status │ online │ │ name │ app │ │ version │ N/A │ │ restarts │ 0 │ │ uptime │ 53s │ │ script path │ /root/app.js │ │ script args │ N/A │ │ error log path │ /root/.pm2/logs/app-error.log │ │ out log path │ /root/.pm2/logs/app-out.log │ │ pid path │ /root/.pm2/pids/app-0.pid │ │ interpreter │ node │ │ interpreter args │ N/A │ │ script id │ 0 │ │ exec cwd │ /root │ │ exec mode │ fork_mode │ │ node.js version │ 12.4.0 │ │ node env │ N/A │ │ watch & reload │ X │ │ unstable restarts │ 0 │ │ created at │ 2019-06-12T09:33:15.361Z │ └───────────────────┴───────────────────────────────┘ ~~~ <br> <br> # Ecosystem 文件 在多个服务器上部署或使用多个CLI参数时,命令行的替代方法可以更方便地启动应用程序。 Ecosystem文件的目的是收集所有应用程序的所有选项和环境变量。 ## 生成模板 ~~~ pm2 init ~~~ 执行后会生成文件 `ecosystem.config.js`。 具体配置见 [ecosystem file reference](https://pm2.io/doc/en/runtime/reference/ecosystem-file/) ~~~javascript module.exports = { apps : [{ name: 'API', script: 'app.js', // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/ args: 'one two', instances: 1, autorestart: true, watch: false, max_memory_restart: '1G', env: { NODE_ENV: 'development' }, env_production: { NODE_ENV: 'production' } }], deploy : { production : { user : 'node', host : '212.83.163.1', ref : 'origin/master', repo : 'git@github.com:repo.git', path : '/var/www/production', 'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production' } } }; ~~~ ## 使用 源代码工作目录中,可以将所有应用程序添加到进程列表中: ~~~ pm2 start ~~~ 这将运行使用 `pm2 init` 生成的`ecosystem.config.js`中定义的`apps` 。 从其他文件夹加载ecosystem文件: ~~~bash pm2 start /path/to/ecosystem.config.js ~~~ <br> ## 环境变量 为多个环境声明变量。 每个环境键盘必须具有以下格式:`env_ <environment-name>`。 <br> app进程能够以两种环境启动 `development` 和 `production`。 ~~~javascript module.exports = { apps : [{ name: "app", script: "./app.js", env: { NODE_ENV: "development", }, env_production: { NODE_ENV: "production", } }] } ~~~ <br> 要在特定环境中启动此 app ,使用 `--env` 标志 ~~~bash pm2 start ecosystem.config.js # 从 `env` 使用变量 pm2 start ecosystem.config.js --env production # 从 `env_production` 使用变量 ~~~ <br> <br> # 监听和重启 在当前目录或其子目录中修改文件时,PM2可以自动重新启动应用程序: ~~~bash pm2 start app.js --watch ~~~ 如果启用了·--watch·,停止它将不会停止监听: * `pm2 stop 0` - 不会停止监听 * `pm2 stop 0 --watch` - 将停止监听 * `restart --watch` 将切换watch参数。 要监听特定路径,请使用生态系统文件,watch可以采用字符串或路径数组。 具体可参考文档 [https://pm2.io/doc/en/runtime/features/watch-restart/](https://pm2.io/doc/en/runtime/features/watch-restart/) <br> <br> # 启动钩子 启动钩子的目的是保存您的进程列表并在机器重启时将其恢复,甚至是意外的重启。 每个操作系统都有一个特定的工具来处理启动钩子:PM2提供了一种生成和配置它们的简便方法。 <br> ## 步骤 ### 保存进程列表 启动钩子会自动加载先前保存的进程列表。 ~~~ pm2 save ~~~ > 警告:如果删除所有进程然后重新启动系统(或使用pm2 update),它会复活所有进程(以前存储在转储文件中)。它是为了防止“空转储文件”的错误。 <br> 如果要创建空转储文件,应使用: ~~~bash pm2 cleardump ~~~ <br> ### 生成开机自启动的命令 要检测计算机上的可用初始化系统并生成配置,请使用: ~~~ pm2 startup # 您必须以root身份运行此命令。 执行以下命令: sudo su -c env PATH=$PATH:/home/unitech/.nvm/versions/node/v4.3/bin pm2 startup <distribution> -u <user> --hp <home-path> ~~~ 在CLI中复制并粘贴此命令的输出以设置启动挂钩。 > 使用NVM,更新Node.js时pm2路径会发生变化。 每次更新后都需要运行启动命令。 > 您可以通过 `--service-name <name>` 选项自定义服务名称 ![](https://box.kancloud.cn/6ef17d48d7bc229aa17bf457c4f1312c_843x425.png) <br> ### 运行服务命令 ~~~ systemctl enable pm2-root ~~~ ## 禁用startup系统 ~~~bash pm2 unstartup ~~~ <br> ## 用户权限 如果希望在另一个用户下执行启动挂钩,请使用 `-u<username>` 选项和 `--hp<user_home>`: ~~~bash pm2 startup ubuntu -u www --hp /home/ubuntu ~~~ <br> ## 更新启动 要更新启动钩子,请运行以下命令: ~~~bash pm2 unstartup pm2 startup ~~~ ## 兼容性 支持的Init系统包括: * **systemd**: Ubuntu >= 16, CentOS >= 7, Arch, Debian >= 7 * **upstart**: Ubuntu <= 14 * **launchd**: Darwin, MacOSx * **openrc**: Gentoo Linux, Arch Linux * **rcd**: FreeBSD * **systemv**: Centos 6, Amazon Linux <br> 如果您愿意,可以指定您使用的平台: ~~~bash pm2 [startup | unstartup] [platform] ~~~ <br> 平台可以是下面任何一个: ubuntu,ubuntu14,ubuntu12,centos,centos6,arch,oracle,amazon,macos,darwin,freebsd,systemd,systemv,upstart,launchd,rcd,openrc <br> <br> # 负载均衡 命令如下,表示开启三个进程。如果`-i 0`,则会根据机器当前核数自动开启尽可能多的进程。 ~~~ pm2 start app.js -i 3 # 开启三个进程 pm2 start app.js -i max # 根据机器CPU核数,开启对应数目的进程 ~~~ <br> <br> # 环境切换 在实际项目开发中,我们的应用经常需要在多个环境下部署,比如开发环境、测试环境、生产环境等。在不同环境下,有时候配置项会有差异,比如链接的数据库地址不同等。 <br> 对于这种场景,pm2也是可以很好支持的。首先通过在配置文件中通过`env_xx`来声明不同环境的配置,然后在启动应用时,通过`--env`参数指定运行的环境。 ## 环境配置声明 首先,在配置文件中,通过`env`选项声明多个环境配置。简单说明下: * `env`为默认的环境配置(生产环境),`env_dev`、`env_test`则分别是开发、测试环境。可以看到,不同环境下的`NODE_ENV`、`REMOTE_ADDR`字段的值是不同的。 * 在应用中,可以通过`process.env.REMOTE_ADDR`等来读取配置中生命的变量。 ~~~ "env": { "NODE_ENV": "production", "REMOTE_ADDR": "http://www.example.com/" }, "env_dev": { "NODE_ENV": "development", "REMOTE_ADDR": "http://wdev.example.com/" }, "env_test": { "NODE_ENV": "test", "REMOTE_ADDR": "http://wtest.example.com/" } ~~~ ## 启动指明环境 假设通过下面启动脚本(开发环境),那么,此时`process.env.REMOTE_ADDR`的值就是相应的 http://wdev.example.com/ ,可以自己试验下。 ~~~ pm2 start app.js --env dev ~~~ <br> <br> # 访问日志 所有日志 ~~~ pm2 logs ~~~ 实时日志 ``` pm2 logs app ``` 历史日志 `~/.pm2/logs`文件夹 ## 日志分割 使用[pm2-logrotate](https://github.com/pm2-hive/pm2-logrotate)进行日志管理使得我们的node服务的log以及pm2的log能够得到控制,防止log过多导致把磁盘刷爆。[pm2-logrotate](https://github.com/pm2-hive/pm2-logrotate)配置看官网,需要注意的是设置retain参数,来限制日志文件数 ~~~ pm2 set pm2-logrotate:retain 10 ~~~ <br> <br> # 监控 运行如下命令,查看当前通过pm2运行的进程的状态。 ~~~ pm2 monit ~~~ ![](https://box.kancloud.cn/3135714785d98d59fea9604776ed5b71_1895x1004.png) <br> <br> # 参考资料 [PM2 官方文档](https://pm2.io/doc/zh/runtime/overview/) [PM2实用入门指南](https://www.cnblogs.com/chyingp/p/pm2-documentation.html) https://www.zhaofinger.com/detail/5