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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
用nodejs实现PHP的print_r函数代码
Mar 14 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 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
合作指挥官:孟斯克
2020/03/16 星际争霸
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
this关键字的作用
2016/01/30 面试题
转预备党员政审材料
2014/02/06 职场文书
国庆节慰问信
2015/02/15 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python