China FreeBSD

pm2命令和ecosystem.config.js配置

  • 贡献者:HHJ
  • 阅读:742
  • 类别:脚本工具
  • 更新时间:2018-08-07 10:22:58

PM2 命令

说明

PM2 是 node 进程管理工具,包括守护进程、监控、日志等一套完整的功能

安装

npm install pm2 -g

命令

$ pm2 start app.js              # 启动app.js应用程序
$ pm2 start app.js -i 4 or max  # cluster mode 模式启动4个app.js的应用实例4个应用程序会自动进行负载均衡
$ pm2 start app.js --name="api" # 启动应用程序并命名为 "api"
$ pm2 start app.js --watch      # 当文件变化时自动重启应用
$ pm2 start script.sh           # 启动 bash 脚本
$ pm2 list                      # 列表 PM2 启动的所有的应用程序
$ pm2 monit                     # 显示每个应用程序的CPU和内存占用情况
$ pm2 show [app-name|appId]     # 显示应用程序的所有信息
$ pm2 logs                      # 显示所有应用程序的日志
$ pm2 logs [app-name|appId]     # 显示指定应用程序的日志
$ pm2 flush
$ pm2 stop all                  # 停止所有的应用程序
$ pm2 stop 0                    # 停止 id为 0的指定应用程序
$ pm2 restart all               # 重启所有应用
$ pm2 reload all                # 重启 cluster mode下的所有应用
$ pm2 gracefulReload all        # Graceful reload all apps in cluster mode
$ pm2 delete all                # 关闭并删除所有应用
$ pm2 delete 0                  # 删除指定应用 id 0
$ pm2 scale api 10              # 把名字叫api的应用扩展到10个实例
$ pm2 reset [app-name]          # 重置重启数量
$ pm2 startup                   # 创建开机自启动命令
$ pm2 save                      # 保存当前应用列表
$ pm2 resurrect                 # 重新加载保存的应用列表
$ pm2 update                    # Save processes, kill PM2 and restore processes
$ pm2 generate                  # Generate a sample json configuration file

$ pm2 deploy app.json prod setup    # Setup "prod" remote server
$ pm2 deploy app.json prod          # Update "prod" remote server
$ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2
$ pm2 module:generate [name]        # Generate sample module with name [name]
$ pm2 install pm2-logrotate         # Install module (here a log rotation system)
$ pm2 uninstall pm2-logrotate       # Uninstall module
$ pm2 publish                       # Increment version, git push and npm publish

# 定义标准输出日志路径和错误日志输出路径
pm2 start app.js -o ./logs/out.log -e ./logs/error.log

配置进程文件

根目录下编写配置文件 ecosystem.config.js

module.exports = {
    apps: [                            // apps中可以配置多个应用
        {
            name: 'express-demo',      // 应用名称
            script: 'app.js',          // 启动脚本
            cwd: './',                 // 当前工作路径
            watch: true,               // 监控变化的目录
            exec_mode: 'cluster',      // 集群模式
            instances: 'max',          // 实例数量
            max_memory_restart: '40M', // 如果超过指定内存就重启
            ignore_watch: [            // 从监控目录中排除
                'node_modules',
                'logs'
            ],
            error_file: './logs/app-err.log', // 错误日志路径
            out_fileL: './logs/app-out.log',  // 普通日志路径
            env: {                            // 默认环境变量
                NODE_ENV: 'production'        // 环境变量
            },
            env_dev: {                        // 命令行可以指定当前环境变量为dev
                NODE_ENV: 'development'
            },
            env_prod: {
                NODE_ENV: 'production'
            }
        }
    ],
deploy: { // 部署配置 prod: { // 对应环境名称 user: 'mjz', host: ['47.94.139.47'], // 要部署的服务器IP port: '39999', // 端口号 path: '/www/website', // 克隆到服务器上的路径 repo: 'git@gitee.com:mjzhang/node-website.git', // 仓库地址 ref: 'origin/master', // 代码仓库的分支 ssh_options: 'StrictHostKeyChecking=no', // 取消 key 校验 'post-deploy': 'npm install && pm2 startOrRestart ecosystem.config.js --env prod' env: { NODE_ENV: 'production' } } }

命令行启动

pm2 start ecosystem.config.js --env dev

pm2 实现 node 线上部署

步骤:通过本地 pm2 工具在本地命令行登录服务器,然后通知服务器从 git 仓库将代码clone 到服务器部署到相应文件夹,然后等待进一步操作

1. 本地环境配置

  1. 确保本地安装 git、node、pm2
  2. 去报本地有一个可以运行的 nodeJs 应用(本例是一个 express 服务)
  3. 有一个第三方 git 平台托管代码 地址: git@gitee.com:mjzhang/node-website.git

2. 服务器生成 ssh 公钥并加入 git 平台

# server
# 依次执行
ssh-keygen -t rsa -b 4096 -C "youxiang@163.com" 一路回车

eval "$(ssh-agent -s)"

ssh-add ~/.ssh/id_rsa

cat ~/.ssh/id_rsa.pub # 显示公钥

# 将公钥复制到第三方 git 平台

3. nodeJs 项目根目录编写 pm2 配置文件 ecosystem.config.js

// local
module.exports = {
    apps: [
        {
            name: 'express-demo',      // 应用名称
            script: 'app.js',          // 启动脚本
            cwd: './',                 // 当前工作路径
            watch: true,               // 监控变化的目录
            exec_mode: 'cluster',      // 集群模式
            instances: 'max',          // 实例数量
            max_memory_restart: '40M', // 如果超过指定内存就重启
            ignore_watch: [            // 从监控目录中排除
                'node_modules',
                'logs'
            ],
            error_file: './logs/app-err.log', // 错误日志路径
            out_fileL: './logs/app-out.log',  // 普通日志路径
            env: {                            // 默认环境变量
                NODE_ENV: 'production'        // 环境变量
            },
            env_dev: {                        // 命令行可以指定当前环境变量为dev
                NODE_ENV: 'development'
            },
            env_prod: {
                NODE_ENV: 'production'
            }
        }
    ],
    deploy: {                        // 部署配置
        prod: {                      // 对应环境名称
            user: 'mjz',
            host: ['47.94.139.47'],  // 要部署的服务器IP
            port: '39999',           // 端口号
            path: '/www/website',    // 克隆到服务器上的路径
            repo: 'git@gitee.com:mjzhang/node-website.git', // 仓库地址
            ref: 'origin/master',    // 代码仓库的分支
            ssh_options: 'StrictHostKeyChecking=no', // 取消 key 校验
            'post-deploy': 'npm install && pm2 startOrRestart ecosystem.config.js --env prod'
            env: {
                NODE_ENV: 'production'
            }
        }
    }

4. 提交项目到 git 平台

# local
git add .
git commit -m 'xxx'
git push origin master

5. 服务器中创建接收项目文件的文件夹

# server
# 创建 /www/website
cd /www
sudo chmod 777 website # 修改文件夹权限为可读可写,否则下一步会报错--没有修改权限

6. 本地运行命令实现部署

pm2 deploy ecosystem.config.js prod setup 

部署成功后 /www/website 多了一下三个文件夹

  • current 文件夹,当前运行文件夹
  • source 源代码
  • shared 日志文件

配置文件 ecosystem.config.js 中的 'post-deploy': 'npm install && pm2 startOrRestart ecosystem.config.js --env prod' 可以使得代码克隆到服务器后就运行

7. 日常维护流程

  1. 更改代码
  2. 提交到 git 版本库 git add . && git commit -m 'xxx' && git push origin master
  3. pm2 重新发布 pm2 deploy ecosystem.config.js prod
  4. 服务器实时查看日志 pm2 monit