环境介绍

本地:Window 10.11.4,应用采用的技术:Node.js + Express.js

远端服务器:阿里云ECS(1核CPU、1GB内存),IP:47.98.154.75,系统为Ubunt

Github:账户名:awhlmycn

系统架构

服务器部署Node的应用,并在3000端口进行监听。本地代码开发测试后,更新到Github私人仓库。然后通过pm2部署远程服务器。

服务器端安装必要的软件

拟安装如下应用:Node、npm、pm2。

通过预留的账号密码登录系统,终端中输入:

ssh root@47.98.154.75

更新软件:

sudo apt-get update

更新完毕后,安装Node.js:

sudo apt-get install nodejs

安装pm2:

npm install pm2 -g

(可选)服务器端创建新用户

为服务器安全起见,创建用户(用户名:yishi):

useradd yishi

设置密码:

passwd yishi

添加sudo权限:

usermod -aG wheel yishi

(可选)服务器端关闭root用户的ssh访问:

为服务器安全起见,关闭root账户的远程访问。

打开配置文件:

vi /etc/ssh/sshd_config

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

PermitRootLogin no

保存文件后,重启sshd服务:

service sshd restart

退出root账户,并使用新创建用户访问。

本地安装pm2

Windows中,由于已经具备了node以及npm,再次不介绍如何安装上述两个软件了。与服务器端类似,通过如下命令安装pm2:

npm install pm2 -g

如果可得到版本号,则说明安装成功:

pm2 -v

设置Github仓库

此处为方便演示,我们在Github上新建一个私人(private)仓库,名为myWeb

仓库创建后,还需要设置Deploy keys,依次点击Settings > Deploy keys > Add deploy key。其中的Key部分,可以在服务器端上通过ssh-keygen生成,并通过

重要步骤1:

ssh-keygen                 //生成rsa,然后通过
cat ~/.ssh/id_rsa.pub      // 查看

重要步骤2:

即可输出。输出后,复制到deploy key中点击Add key,完成设置。

重要步骤3:

本地(windows生成 ssh_rsa :然后添加到github里面的setting 中的ssh_key中)

完成上述设置后,需要本地(windows)的应用代码关联此Github仓库,按照Github官网的介绍,通过在本地应用下执行:

git remote add origin https://github.com/awhlmycn/myWeb.git
git push -u origin master

来完成设置。

本地pm2的ecosystem配置

在本地的目标应用下,输入:

pm2 ecosystem

生成pm2的部署配置模板文件如下:

{/*** Application configuration section* PM2 - 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* PM2 - Deployment*/deploy : {production : {user : "node",host : "47.98.154.75",ref  : "origin/master",repo : "git@github.com:awhlmycn/myWeb.git",path : "/home/temp","post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production"},dev : {user : "node",host : "47.98.154.75",ref  : "origin/master",repo : "git@github.com:repo.git",path : "/home/temp","post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env dev",env  : {NODE_ENV: "dev"}}}
}

应为目前我们仅部署一个应用,因此,先把不必要的信息删除,即删除apps部分的第二项。同时把我们的目标文件改为你应用的入口文件,此处修改为Express.js的默认设置,即:

script    : "./bin/www",

apps部分就设置完毕了,然后再设置deploy部分。其中production用于生产环境,dev用于开发环境,为了演示,我们只设置production部分。

下面依次介绍各个设置:

    production : {user : "登录远程服务器的用户名,此处填写我们创建的yishi",host : "远程服务器的IP或hostname,此处可以是数组同步部署多个服务器,不过鉴于我们只有一个服务器,因此我们填写123.57.205.23",ref  : "远端名称及分支名,此处填写origin/master",repo : "git仓库地址,此处填写git@github.com:e10101/pm2app.git",path : "远程服务器部署目录,需要填写user具备写入权限的目录,此处填写/home/yishi/www/production","post-deploy" : "部署后需要执行的命令,此处填写npm install && pm2 startOrRestart ecosystem.json --env production"},

整理后,按照我们的设置,应为:

production: {user: "yishi",host: "47.98.154.75",ref: "origin/master",repo: "git@github.com:awhlmycn/myWeb.git",path: "/home/temp","post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
},

重要步骤4:

因为pm2的部署是通过ssh进行的,因此需要开通本地到远程服务器的无密码登录,同样,在Mac下,通过ssh-keygen生成RSA公钥,并拷贝到远程服务器:

scp ~/.ssh/id_rsa.pub root@47.98.154.75:/root/.ssh/authorized_keys

上述命令中的root为用户名,执行时需要替换为你设置的用户名。

设置ssh完毕后,再看看整理完毕的ecosystem配置文件,如下:

{/*** Application configuration section* PM2 - Application Declaration*/apps : [// First application{name      : "pm2app",script    : "./bin/www",env: {COMMON_VARIABLE: "true"},env_production : {NODE_ENV: "production"}}],/*** Deployment section* PM2 - Deployment*/deploy : {production : {user: "yishi",host: "47.98.154.75",ref: "origin/master",repo: "git@github.com:awhlmycn/myWeb.git",path: "/home/temp","post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"}}
}

在本地应用目录下,执行pm2 deploy命令:

pm2 deploy ecosystem.json production setup

提示错误:

Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.failed to clone
Deploy failed

重要步骤5:

此时主要是在远程服务器中,并未将http://github.com加入known_hosts,在服务器端通过如下命令设置:

如果代码是放在码云上面 则 应该将 gitee.com 加入known_host,在服务器通过如下命令设置:

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hostsssh-keyscan -t rsa gitee.com >> ~/.ssh/known_hosts

问题一:Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known host 
    这个的主要原因是没有把 52.74.223.119 加入到 vim /etc/hosts
           解决方法 : 52.74.223.119 github.com
问题二 :              git使用时遭遇 the authenticity of host cant't be established
            解决方法 : 在/etc/ssh/ssh_config文件的配置下面加上            StrictHostKeyChecking noUserKnownHostsFile /dev/null
            然后重启ssh : service ssh restart

在本地继续执行部署命令:

pm2 deploy ecosystem.json production setup

此时,如无其他问题,输出应提示:

  ○ setup complete
--> Success

至此,pm2的部署设置完毕。

pm2部署

pm2的部署设置完毕后,接下来就是实际部署了。

在部署前,现将本地代码修改并进行git提交:

git add .
git commit -m "update ecosystem"
git push

提交后,在本地应用目录,输入如下命令进行生产环境的部署:

pm2 deploy ecosystem.json production

可以看到如下输出:

[PM2][WARN] Applications pm2app not running, starting...
[PM2] App [pm2app] launched (1 instances)
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ pm2app   │ 0  │ fork │ 1028 │ online │ 0       │ 0s     │ 11.246 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘Use `pm2 show <id|name>` to get more details about an app○ hook test○ successfully deployed origin/master
--> Success

部署成功,在远程服务器查看端口情况:

netstat -antp

可以看到应用默认部署的3000端口已经开放了。通过浏览器打开:

http://47.98.154.75:3000/

可以看到部署的Web应用可以访问了。(如果netstat -antp中可见3000端口可访问,可以检查下ECS的防火墙设置,确保3000端口对外开放)

pm2其他命令

应用列表:

pm2 list

应用信息(查看应用编号为0的信息):

pm2 show 0

(重要)服务器端设置pm2开机自动启动

开启启动设置,此处是CentOS系统,其他系统替换最后一个选项(可选项:ubuntu, centos, redhat, gentoo, systemd, darwin, amazon):

pm2 startup centos

然后按照提示需要输入的命令进行输入:

sudo su -c "env PATH=$PATH:/usr/bin pm2 startup centos -u root --hp /home/temp"

保存pm2设置:

pm2 save

现在重新启动系统,测试是否可以开机启动:

sudo reboot

等系统重启后,通过浏览器检查系统是否自动启动:

http://47.98.154.75:3000/

如果启动正常,说明设置成功!

以上就是如何通过pm2部署Node应用到服务器生成环境的总结。

参考

其他PM

  • StrongLoop Process Manager StrongLoop
  • GitHub - foreverjs/forever: A simple CLI tool for ensuring that a given script runs continuously (i.e. forever) Forever

PM2相关

  • PM2 - Deployment PM2部署设置
  • PM2 - Startup Script PM2开机启动设置
  • How To Set Up a Node.js Application for Production on CentOS 7
  • Process managers for Express apps
  • GitHub - Unitech/pm2-deploy: Deploy part of PM2
  • PM2 Restart Processes After System Reboot PM2随系统重启
  • Deploying Node.js Applications with PM2 另一个部署教程

服务器部署及Nginx设置(此部分在本文中暂未涉及)

  • 如何在生产服务器上部署 Node.js 应用? - Nginx 知乎上的讨论
  • Hosting & Deploying NodeJS Apps on CentOS 7
  • How To Set Up nginx Virtual Hosts (Server Blocks) on CentOS 6
  • Express behind proxies
  • reverse proxy
  • 服务器部署 | Node.js实战
  • Performance Best Practices Using Express in Production Express最佳实战
  • GitHub - chovy/git-deploy-node: Deploy a node app using git for continuous deployment.

Git相关

  • Git - Working with Remotes
  • Managing deploy keys
  • Automating deployments to integrators 另一种部署方案,从Github直接部署到其他平台中去,用的Webhooks技术

异常处理参考

  • ssh - Git error: "Host Key Verification Failed" when connecting to remote repository
  • SSH Passwordless Login Using SSH Keygen in 5 Easy Steps 无密码登录教程
  • [nodejs] how to set repo password in pm2 deploy's ecosystem.json? 如何正确设置ecosystem中的repo选项

pm2 和github上面的自动部署相关推荐

  1. Vue项目自动部署【精简版】NuxtJS + GitHub Actions + Linux 自动部署学习(包含阿里云Linux ECS购买过程、传统部署流程、pm2、Github Actions)

    购买阿里云Linux服务器 如果已有服务器请直接跳转到[传统部署方式] 登录阿里云,访问 云服务器 ECS 购买地址:https://ecs-buy.aliyun.com/ 也可从首页导航菜单进入. ...

  2. idea怎么直接拉去git_如何将GitHub上面的项目拉取到IDEA中

    上次,小喵给大家演示了一下,那么今天小喵给大家演示一下如何将GitHub上面的项目拉去到IDEA中. 一 . 获取连接 有两种情况 : 一种是项目未初始化 , 第二种是项目已初始化. 未初始化 获取连 ...

  3. 如何高效的搜索github上面的资源

    如何高效的搜索github上面的资源 首先简单介绍一下github上一个项目主页具体包含了哪些信息,搜索的时候也会涉及到这些信息. 我们以搜索CTR(点击率预估)为例的话: 1.头铁型搜索:直接在搜索 ...

  4. PM2 node进程管理工具 自动部署小结

    PM2 的功能不多做介绍了,总之使用简单,功能强大. 今天实现了本地自动部署node项目到服务器的流程.简单总结下几个注意点. 建议先看 文档 先要保证要部署的服务器上(以下简称server)能直接s ...

  5. 拒绝用户“root”@“localhost”的访问(使用密码:yes)_使用PHP和Github Webhook实现自动部署

    前言 一般情况下,我们每次在使用Github时,每次push完代码后,都要手动到服务器上git pull一次,如果是vue之类的项目还要npm i和npm build. 当然我们可以写sh脚本来进行部 ...

  6. github仓库项目自动部署到阿里云

    原文链接 前言 我的博客之前一直是手动更新的,需要自己打包,然后上传到网站.但是项目已经托管在github了,所以何不搞个自动部署呢? 想象一下,网站有修改之后,git push之后等几分钟,网站就自 ...

  7. 关于Github上zheng项目部署问题总结

    项目的简介就不多说了 在Github上又10K的star,是学习SpringMVC及分布式的具有参考价值的一个开源项目,项目源代码地址https://github.com/shuzheng/zheng ...

  8. 如何用Github钩子做自动部署

    最近机缘巧合的购置了域名和服务器,不用实在是浪费,再加上一直没有属于自己的个人网站,所以打算用hexo在服务器上玩一下,这样也就不用再纠结用Github pages还是Gitee pages了.当然, ...

  9. webhooks php,GitHub和WebHooks自动部署PHP项目

    webhook请求的接口 前面有说过了,这个接口实际上是执行git pull将代码更新到服务器项目中,下面是php版本代码. // 本地仓库路径 既项目路径 $local = '/data/web/t ...

最新文章

  1. 9 大主题卷积神经网络(CNN)的 PyTorch 实现
  2. 自动发布工具应该具备的11个标准特征
  3. c++ 12.一维数组冒泡排序
  4. mysql安装包下载密码_MySQL解压包的安装与下载的图文教程
  5. 「Luogu5395」【模板】第二类斯特林数·行
  6. 计算机改成服务器,旧电脑主机如何改成服务器
  7. 到天宫做客(洛谷P1178题题解,Java语言描述)
  8. Unity3D中常用的物理学公式
  9. 宿舍管理程序c语言,学生宿舍管理软件C语言源代码完整版
  10. 和在java和c语言中的那些事
  11. 图片Base64编码 图片Base64在线转换
  12. ​Word文档的隐藏功能​
  13. Qt Quick 4小时入门-安晓辉-专题视频课程
  14. Inkscape如何将png图片转换为svg图片并且不失真
  15. linux系统 网站木马后门Webshell查杀工具源码
  16. 臻鑫永晖:1万存活期1年利息多少?附核算公式
  17. ThoughtWork培训总结
  18. js 创建标签 追加标签
  19. 课程发布-添加课程信息
  20. 前端vue下载本地文件

热门文章

  1. 视频显示分辨率标准大全
  2. 龙珠直播前50信息爬取并保存图片和天池排名爬取
  3. C#调用WinRAR解压、压缩文件
  4. 其实,你是在为自已打工
  5. Java项目实战---歌曲管理系统
  6. EXCEL技能点4——介绍Vlookup与循环引用
  7. c#学习笔记05-treeview中添加图标
  8. 简单几何图形的识别与标记(opencv)
  9. 来了!直击痛点的七大更新!APP上看报表就如同刷抖音
  10. 唯品会首页导航分类商品爬取