很早就知道了pm2的强大功能,部署,多进程部署,负载均衡等等,可是一直没有取尝试使用,每次写完代码就没关心部署的事了。最近有空就想着把pm2的部署流程走一遍,顺便整理出来。node
1.本地:linux mint18(类ubuntu)linux
2.服务器:阿里云ubuntu16.04nginx
1.购买服务器git
2.登陆服务器,安装node环境github
3.上传代码到私有或者公共git仓库web
4.pm2从本地到服务器的发布数据库
5.服务器端设置pm2开机自启动npm
我没有比较哪一个厂商的云服务比较好,不过我本身用的是阿里云的。json
1)ssh root@120.77.156.181 ubuntu
接着输入密码
解释:阿里云服务器的默认端口是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
在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@.....来下载仓库的代码了
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的实例排名
ubuntu系统两个命令就能够搞定:
进入服务器,输入以下命令:
pm2 save pm2 startup
以上就是pm2部署node应用的流程,正常的应用还包括数据库,以及服务器安全问题的配置,这里略去没写。