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 相关文章推荐
14款NodeJS Web框架推荐
Jul 11 NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
nodejs基础知识
Feb 03 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 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
PHP在线生成二维码代码(google api)
2013/06/03 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
取numpy数组的某几行某几列方法
2018/04/03 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
Python如何基于rsa模块实现非对称加密与解密
2020/01/03 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
Keras 使用 Lambda层详解
2020/06/10 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
行政主管岗位职责
2013/11/18 职场文书
教育学习自我评价
2014/02/03 职场文书
少先队入队活动方案
2014/02/08 职场文书
委托书格式
2014/08/01 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL