背景:

  很早就知道了pm2的强大功能,部署,多进程部署,负载均衡等等,但是一直没有取尝试使用,每次写完代码就没关心部署的事了。最近有空就想着把pm2的部署流程走一遍,顺便整理出来。

环境:

  1.本地:linux mint18(类ubuntu)

  2.服务器:阿里云ubuntu16.04

流程:

  1.购买服务器

  2.登录服务器,安装node环境

  3.上传代码到私有或者公共git仓库

  4.pm2从本地到服务器的发布

  5.服务器端设置pm2开机自启动

1.购买服务器,域名备案

  我没有比较哪个厂商的云服务比较好,不过我自己用的是阿里云的。

2.登录服务器,安装node环境

  1)ssh root@120.77.156.181 

    接着输入密码

  解释:阿里云服务器的默认端口是22,所以不用特地指定服务器端口

  2)添加用户

    使用root用户操作服务器是一件很危险的事,因为root有超级权限,很可能一不小心删除了某个重要文件,所以这里建议新增一个用户来帮忙操作服务器,这个用户需要拥有root的所用功能,只是在执行命令的时候需要加sudo。

    使用如下命令添加用户:

    adduser  qqqq

    接着输入两次密码

    给新增的用户授权:

    gpasswd -a qqqq sudo  //作用的让qqqq用户通过sudo来拥有root的权限,并且需要输入密码

    sudo visudo

    添加:qqqq ALL=(ALL:ALL) ALL

    这样就可以通过ssh qqqq@120.77.156.181登录服务器

    服务器端关闭root用户的登录:

    sudo vi  /etc/ssh/sshd_config

    找到如下设置,并修改yes为no:

    PermitRootLogin no 

    保存文件后,重启sshd:

    sudo service sshd restart    

  3)无密码登录服务器

    上面两种登录服务器的方式都需要输入密码,其实这不是必须的,只需要简单的几步就可以实现无密码登录服务器。

    本地主机生成私钥和公钥:

    ssh-keygen rsa -b 4096 -c “1594466572@qq.com”

    然后直接回车即可        

    此时本机用户目录下的.ssh文件夹下会生生成两个文件(id_rsa和id_rsa.pub),前者是私钥后者是公钥,如果这两个文件之前就已经存在,那就没必要重新生成了

    本地主机开启ssh代理:

    eval "$(ssh-agent -s)"

    将私钥加入到代理中:

    ssh-add ~/.ssh/id_rsa

    进入服务器:ssh qqqq@120.77.156.181

    执行同样的操作:ssh-keygen rsa -b 4096 -c “1594466572@qq.com” (这一句可要可不要,但是后面操作一定会用,所以就在这里先执行了)

    然后在.ssh文件下新建文件:

    vi  authorized_keys    

    将本地主机的公钥(id_rsa.pub)的内容复制到authorized_keys文件中

    修改authorized_keys文件的权限:

    sudo chmod 600  authorized_keys

    重启ssh:

    sudo service ssh restart

  4)安装nodejs环境

    安装必要的工具:

    sudo apt-get install vim openssl build-essential libssl-dev wget curl git

    安装nvm:

    wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

    安装node,npm: 

    nvm install v6.11.1

    选择nodejs版本:

    nvm use 6.11.1

    设置默认的nodejs版本:

    nvm alias default v6.11.1

    安装pm2:

    npm install pm2 -g

3.上传代码到git仓库

  在github中新建一个仓库,名为pm2deploy

  接下来设置ssh,依次点击setting->SSH and GPG keys->new SSH key,其中的key就是上面步骤中通过ssh-keygen命令生成的公钥,title为自定义,可以随便填,通过:

  cat ~./ssh/id_rsa.pub

  即可输出id_rsa.pub的内容,复制到key中,然后点击add ssh key即可

  在此添加两个公钥,一个是本地主机的,一个是远程服务器的,添加之后,本地主机和服务器都可以通过git clone ssh@.....来下载仓库的代码了

4.pm2从本地主机发布

  1)pm2的ecosystem.js配置   

    在本地源码目录下输入:

    pm2 ecosystem

    生成pm2的配置文件ecosystem.config.js: 

module.exports = {
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
*/
apps : [ // First application
{
name : 'API',
script : 'app.js',
env: {
COMMON_VARIABLE: 'true'
},
env_production : {
NODE_ENV: 'production'
}
}, // Second application
{
name : 'WEB',
script : 'web.js'
}
], /**
* Deployment section
* http://pm2.keymetrics.io/docs/usage/deployment/
*/
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'
},
dev : {
user : 'node',
host : '212.83.163.1',
ref : 'origin/master',
repo : 'git@github.com:repo.git',
path : '/var/www/development',
'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env dev',
env : {
NODE_ENV: 'dev'
}
}
}
};

  新建一个文件:    

 vim ecosystem.json  复制ecosystem.config.js的内容到ecosystem.json中,注意js与json的区别

  apps以数组的形式是为了部署多应用准备的,这里我们只部署一个应用,可以去掉第二个元素。script为程序的入口文件,这里改为你自己的入口文件即可。

  apps的配置介绍玩了,生下的是部署配置(deploy),部署配置包括production(生产环境)和dev(开发环境),这里只介绍生产环境,开发环境类似(可以先去掉开发环境)。

    "production":{
    "user": "qqqq(登录服务器的用户名)",
    "host": "120.77.156.181(服务器公网ip)",
    "ref": "git@开头的仓库地址",
    "repo": "/deploy/app/production",
    "post-deploy": "npm install --registry=https://registry.npm.taobao.org && pm2 startOrRestart ecosystem.json --env production",
    "env": {
      "NODE_ENV": "production"
    }
  }

  修改完后保存,然后执行pm2 deploy命令

 pm2 deploy ecosystem.json production setup

  继续执行部署命令:

  pm2 deploy ecosystem.json production

  如果没有问题,会有如下输出(最后两行):

 [PM2][WARN] Applications Movie not running, starting...

  [PM2] App [Movie] launched (1 instances)
  ┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
  │ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ watching │
  ├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
  │ Movie │ 0 │ fork │ 3722 │ online │ 0 │ 0s │ 4% │ 18.4 MB │ disabled │
  └──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
  Use `pm2 show <id|name>` to get more details about an app
  ○ hook test
  ○ successfully deployed origin/master
  --> Success

  至此,pm2的部署完毕,此时可以通过120.77.156.181:port来访问部署的应用了,这里如果有域名,可以通过nginx反向代理,设置域名访问。

  2)pm2的一些命令:

    pm2 log 查看启动日志

    pm2 status 查看实例信息

    pm2 stop app 关闭名为app的实例

    pm2 delete app 删除名为app的实例排名

5.服务器端设置pm2开机自启动

  ubuntu系统两个命令就可以搞定:

  进入服务器,输入如下命令:  

  pm2 save
  pm2 startup  

以上就是pm2部署node应用的流程,正常的应用还包括数据库,以及服务器安全问题的配置,这里略去没写。 

         

    

最新文章

  1. linux shell输出带颜色文本
  2. python学习笔记:Day02
  3. ionic rang在弹出modal中不可拖拽的问题
  4. 用 Orchard 建立 Dynamics CRM 的入口网站
  5. c++写入txt文件
  6. .NET Core:面向未来的开源跨平台开发技术
  7. Go语言_时间篇
  8. cmd修改系统时间
  9. known good die( KGD) /确认好裸芯片,合格芯片
  10. 异步提交form的时候利用jQuery validate实现表单验证
  11. 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸
  12. OpenCV进行图像相似度对比的几种办法
  13. R语言:recommenderlab包的总结与应用案例
  14. VS2017离线安装与Oracle数据库开发环境搭建
  15. openvSwitch tunnel
  16. Opengl绘制我们的小屋(二)第一人称漫游
  17. ubuntu 16.04通过源码方式安装nginx
  18. python循环结构
  19. 【随笔】Win7下GVIM的安装与配置
  20. spring事务的传播性

热门文章

  1. 【vue2.X+iview2.x】iView在非 template/render 模式下标签的转化
  2. 10.Ubuntu16搭建蜜罐Cowrie
  3. 16. 再说 WAF 绕过
  4. linux 的 scp 命令
  5. js中top.location.href、parent.location.href用法
  6. 在Android中使用Protocol Buffers(下篇)
  7. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性介绍(2)- RT685EVKA性能实测(Dhrystone)
  8. python 关于时区
  9. [转]SE43 修改SAP标准菜单、登陆界面、背景图片
  10. iOS sqlite