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下DNS缓存问题浅析
Nov 16 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
深入理解nodejs中Express的中间件
May 19 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 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
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
2014/08/28 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
Javascript中的相等与不等运算
2010/04/25 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
Python Django路径配置实现过程解析
2020/11/05 Python
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
四年大学生活的个人自我评价
2013/12/11 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
学校食品安全责任书
2015/01/29 职场文书
公司文体活动总结
2015/05/07 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL