M2实现Nodejs项目自动部署的方法步骤


Posted in NodeJs onMay 05, 2019

PM2实现Nodejs项目自动部署

首先简单说下思路:本地git仓库与远程仓库关联(github、码云等平台),然后pm2按照指定配置登录服务器,拉取远程仓库的代码更新,再执行一些指定的命令(如打包等)。

创建本地项目并关联到远程仓库

本地新建名为web的项目,进入项目并创建一个简单的Nodejs文件app.js,

mkdir web && cd web
vi app.js

文件内容编辑如下,完成后保存退出:wq!。

// app.s

const http = require('http');

const homePage = `
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style type="text/css">
    * {
      padding: 0;
      margin: 0;
    }
    body {
      padding: 30px 0;
      text-align: center;
      font-size: 16px;
      background-color: #333;
    }
    h1,h2 {
      color: #fff;
    }
    nav {
      margin-top: 20px;
    }
    a {
      color: #ccc;
      cursor: pointer;
    }
    a:hover {
      text-decoration: underline;
    }
  </style>
</head>

<body>
  <h1>Nodejs部署示例项目</h1>
  <h2>项目部署上线示例</h2>
  <nav>
    <ul>
      <li><a>列表</a></li>
    </ul>
  </nav>
</body>

</html>
`

http.createServer((req,res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type','text/html');
  res.end(homePage);
}).listen(3000, () => {
  console.log('Sever Running On 3000:');
})

把本地项目放到远程仓库,可选Github或者码云等平台。首先查看本地是否生成过.ssh目录及目录下是否有私钥及公钥文件

ls ~/.ssh

如果存在,跳到下一步。如果不存在id_rsa、id_rsa.pub文件,需要先生成一下:

"youemail"填写你的邮箱

ssh-keygen -t rsa -C "youremail"

查看本地公钥的内容并复制内容添加到远程仓库

cat ~/.ssh/id_rsa.pub

本地仓库关联远程仓库的其他操作这里就不赘述。

服务器从远程仓库拉取项目

服务器环境:阿里云的ecs,系统是Ubuntu 14.06

这一步后面是不需要手动操作的,但我们要做好配置,这里可以先手动拉取远程代码测试一下是否配置成功。

确保服务器已安装NodeJs、git、pm2,未安装的话自行百度。

复制服务器的公钥并添加到远程仓库,操作步骤同本地的2、3、4步。

定位到用户目录,拉取远程仓库确保可以拉取成功,若成功的话这个项目目录删除即可。

xxxx为你远程仓库的项目地址

cd ~
git clone xxxx

项目中配置pm2自动部署文件

在本地项目中新建配置文件ecosystem.json,这里为了方便理解添加了注释,但json文件不能有注释,记得去掉。

{
  "apps":[
    {
      "name": "website", // 项目名称
      "script": "app.js", // 入口文件
      "env": {
        "COMMON_VARIABLE": "true"
      },
      "env_production": {
        "NODE_ENV": "production" // 环境变量
      }
    }
  ],
  // 环境部署的配置,此处只以production为例
  "deploy": {
    "production": {
      // 登录服务器的用户名
      "user":"slevin",
      // 服务器ip
      "host": ["47.75.191.199"],
      // 服务器ssh登录端口,未修改的话一般默认为22
      "port": "22",
      // 指定拉取的分支
      "ref": "origin/master",
      // 远程仓库地址
      "repo": "git@gitee.com:mslevin/website.git",
      // 指定代码拉取到服务器的目录
      "path": "/www/website/production",
      "ssh_options": "StrictHostKeyChecking=no",
      "env": {
        "NODE_ENV": "production"
      }
    }
  }
}

服务器相关配置

配置文件中指定了存放项目的目录/www/website/production,但可能并不存在,需要手动新建:

mkdir /www && cd www
mkdir website

由于pm2需要在website目录中创建productions目录,需要更改website的读写权限

cd /www
sudo chmod 777 website

进入用户目录,并编辑.bashrc文件,下面几行都注释掉

这步是为了防止部署的时候服务器报错找不到pm2命令

# If not running interactively, don't do anything
#case $- in
#  *i*) ;;
#   *) return;;
#esac

nginx做好端口转发配置

执行部署

把本地项目所有的更新push到远程仓库,然后执行

pm2 deploy ecosystem.json production setup
pm2 deploy ecosystem.json production

如果没有问题的话,本地打开浏览器访问对应ip:port就可以看到内容了。

后面每次项目做了个更新之后, 同步到远程仓库,然后执行pm2 deploy ecosystem.json production即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
我的NodeJs学习小结(一)
Jul 06 NodeJs
nodejs教程之入门
Nov 21 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
简单好用的nodejs 爬虫框架分享
Mar 26 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
Nodejs--post的公式详解
Apr 29 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 #NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 #NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 #NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 #NodeJs
Nodejs实现用户注册功能
Apr 14 #NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 #NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 #NodeJs
You might like
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
php empty函数 使用说明
2009/08/10 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
JS操作Cookies的小例子
2013/10/15 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
vue监听对象及对象属性问题
2018/08/20 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
RC4文件加密的python实现方法
2015/06/30 Python
信号生成及DFT的python实现方式
2020/02/25 Python
使用Python封装excel操作指南
2021/01/29 Python
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
高考自主招生自荐信
2013/10/20 职场文书
电大毕业生自我鉴定
2013/11/10 职场文书
最新教师自我评价分享
2013/11/12 职场文书
个人思想理论学习的自我鉴定
2013/11/30 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
活动新闻稿范文
2015/07/17 职场文书