美文网首页
[技术探索]模拟PM2在线部署Node项目

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

作者: 杨山炮 | 来源:发表于2019-09-28 20:33 被阅读0次

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

本地配置

  • 工具安装
    Node, PM2 Git
    是widnow10下必须需要安装几样工具
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
  • 宿主机免密登陆服务器操作
    将本地的公钥添加到服务器的authorized_keys文件中
    该文件一般刚装的ubuntu服务器上没有,可以手动在服务器的/home/<username>/.ssh文件夹中创建,然后在宿主机中执行
ssh-copy-id  <username>@serverIP
win10免密登陆服务器状态信息.jpg
  • 以root身份登录ubuntu服务器(非必须操作)
    如果在《-宿主机免密登陆服务器操作-》步骤中你用的是非root用户,那么服务器将拉取的代码放到本地的某些文件夹路径的选择就可能需要注意权限问题。当然也可以通过将<username>用户添加到sudo用户组里面实现root的权限。
    另外一点需要注意的是ubuntu默认是不允许root用户登录的,也就是在/etc/ssh/sshd_config中有PermitRootLogin prohibit-password ,需要将prohibit-password 改为yes方可实现root用户登录

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

相关文章

网友评论

      本文标题:[技术探索]模拟PM2在线部署Node项目

      本文链接:https://www.haomeiwen.com/subject/lucelctx.html