[技术探索]模拟PM2在线部署Node项目

2019-09-28  本文已影响0人  杨山炮

整个项目部署是window10宿主机下通过VMware12安装Ubuntu16模拟服务器线上部署。

本地配置

npm install pm2@latest -g 
git config --global user.name  "window10"
git config --global user.email "window10@microsoft.cn"
ssh-keygen -t rsa -C "window10@microsoft.cn"

将第三步在C:\Users\hp.ssh生成的id_rsa.pub公钥文件中的内容放置到github的如下位置


github公钥放置处.jpg
ssh-copy-id  <username>@serverIP
win10免密登陆服务器状态信息.jpg

Github配置

本地配置中已经将id_rsa.pub文件的内容放置到github公钥库中,这一步的目的是允许用户将本地的代码上传(或者下载)到github(或者本地)。同样的服务器在github上项目代码有变化的时候拉取代码到服务器的项目文件夹下也是需要配置相同的公钥,同样需要将服务器的id_rsa.pub文件内容放置在github的公钥仓库中。

第一次和github通信(拉取||上传)代码的时候会将github的IP信息添加到本地或者服务器的known_hosts文件中,作为可信任的IP,终端直接输入yes即可。

服务端配置

前面两部已经实现了宿主机可以免密登陆服务器,服务器可以正常拉取github的代码,除了在服务端安装PM2,Node,Git和必要的数据库之外,基本上服务端就没什么需要配置了

PM2配置

使用pm2管理的node程序的好处
{
    "apps": {
        "name": "blog",                             // 项目名          
        "script": "./bin/www",                      // 执行文件
        "cwd": "./",                                // 根目录
        "args": "",                                 // 传递给脚本的参数
        "interpreter": "",                          // 指定的脚本解释器
        "interpreter_args": "",                     // 传递给解释器的参数
        "watch": true,                              // 是否监听文件变动然后重启
        "ignore_watch": [                           // 不用监听的文件
            "node_modules",
            "logs"
        ],
        "exec_mode": "cluster_mode",                // 应用启动模式,支持fork和cluster模式
        "instances": 4,                             // 应用启动实例个数,仅在cluster模式有效 默认为fork;或者 max
        "max_memory_restart": 8,                    // 最大内存限制数,超出自动重启
        "error_file": "./logs/app-err.log",         // 错误日志文件
        "out_file": "./logs/app-out.log",           // 正常日志文件
        "merge_logs": true,                         // 设置追加日志而不是新建日志
        "log_date_format": "YYYY-MM-DD HH:mm:ss",   // 指定日志文件的时间格式
        "min_uptime": "60s",                        // 应用运行少于时间被认为是异常启动
        "max_restarts": 30,                         // 最大异常重启次数,即小于min_uptime运行时间重启次数;
        "autorestart": true,                        // 默认为true, 发生异常的情况下自动重启
        "cron_restart": "",                         // crontab时间格式重启应用,目前只支持cluster模式;
        "restart_delay": "600ms"                      // 异常重启情况下,延时重启时间
        "env": {
           "NODE_ENV": "production",                // 环境参数,当前指定为生产环境 process.env.NODE_ENV
           "REMOTE_ADDR": "爱上大声地"               // process.env.REMOTE_ADDR
        },
        "env_dev": {
            "NODE_ENV": "development",              // 环境参数,当前指定为开发环境 pm2 start app.js --env_dev
            "REMOTE_ADDR": ""
        },
        "env_test": {                               // 环境参数,当前指定为测试环境 pm2 start app.js --env_test
            "NODE_ENV": "test",
            "REMOTE_ADDR": ""
        }
    },
   deploy : {
      production : {
        user : 'yxl',
        host : '192.168.8.100',
        ref  : 'origin/master',
        repo : 'git@github.com:xxxx/yyyy.git',
        path : '/home/yxl/www/production',
        'post-deploy' : 'npm install && pm2 reload 
      ecosystem.config.js --env production'
      },
      dev : {
         user : 'yxl',
          host : '192.168.8.100',
          ref  : 'origin/master',
          repo : 'git@github.com:xxxx/yyyy.git',
          path : '/home/yxl/www/development',
          'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env dev',
          env  : {
          NODE_ENV: 'dev'
        }
      }
    }
}

pm2终端命令

pm2 list                      # 列表 PM2 启动的所有的应用程序
pm2 monit                     # 显示每个应用程序的CPU和内存占用情况
pm2 describe app              #查看某个进程具体情况
pm2 logs                      # 显示所有应用程序的日志
pm2 start app.js              #启动node程序入口文件
pm2 restart app               #  重启指定名称的进程
pm2 restart all               # 重启所有进程
pm2 delete app                # 指定进程名删除
pm2 startup centos/ubuntu     #设置pm2开机自启
pm2 deploy ecosystem.config.js production setup  #首次部署
pm2 deploy ecosystem.config.js production upddate   #再次部署

报错分析

而在初始化服务器(Server)应用时报以下错误

pm2 deploy ecosystem.config.js production setup
pm2部署npm问题.jpg
问题背景:Server端我用的是192.168.8.100的虚拟机里面的服务器,安装的是NVM(Node version manager),网上得到得解决方案
https://segmentfault.com/q/1010000011457578
# If not running interactively, don't do anything
#case $- in
#   *i*) ;;
#     *) return;;
#esac

【参考文章】:
https://www.jianshu.com/p/9680c87a3696
https://segmentfault.com/a/1190000005171229

上一篇 下一篇

猜你喜欢

热点阅读