如何使用pm2快速将项目部署到远程服务器


Posted in Javascript onMarch 12, 2019

使用背景

当我们需要将项目部署到远程线上服务器时;传统的方法可能就是:

  • 将本地代码通过ssh、ftp等方式上传到服务器;
  • 然后通过ssh登入到服务器,配置好环境;
  • 手动启动应用。

太过手动化,麻烦,操作繁琐。

现代自动化部署

环境:本地(Mac);远程服务器(CentOS)

使用工具:Git、pm2、node

需知概念:ssh秘钥登陆Github添加Deploy Keys

1、服务器环境部署

基本工具安装:git、pm2、node

2、ssh服务器免密登陆

服务器生成秘钥对

ssh-keygen -t rsa -C '1285227393@qq.com'

-t 指定密钥类型,默认即 rsa ,可以省略
-C 设置注释文字,比如邮箱,可以省略

由于使用的是百度云服务器,里面可以直接界面生成秘钥对,然后下载到本地的是一个xxx.txt文件

如何使用pm2快速将项目部署到远程服务器

. 此时登陆可以使用ssh -i xxx.txt[下载的公钥路径] name@domain

报错:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'server-key.txt' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "server-key.txt": bad permissions

大概意思就是,私钥文件不能被其他人所访问。可能考虑到如果被别人获取到,就可能对服务器安全造成影响,所以需要从新设置下秘钥文件的权限

重新设置秘钥文件权限:chmod 600 server-key.txt,取消其他用户Read权限

但是,使用ssh name@domain形式还是没法直接登入;追其原因,发现因为不是本地直接生成的秘钥对;

所以需要使用ssh-add -K ~/.ssh/xxx.txt[下载公钥文件]-K表示永久存储式,如果不使用者每次开机后需要重新ssh-add),就像是本地生成秘钥对然后部署到服务器需要将秘钥追加到ssh认证文件一个道理;

ssh name@domain可以正常免密登陆啦!(配置这种形式登陆后面pm2需要使用)

配置快捷登录(附加)

1. 进入ssh目录:cd ~/.ssh

2. 创建config文件: touch config

3. 进入config配置文件配置:vi config

Host lwh #快捷别名
HostName host #ssh服务器ip或domain
Port port #ssh服务器端口,默认为22
User root #ssh服务器用户名
IdentityFile ~/.ssh/server-key.txt #下载的私钥文件

4. :wq!保存退出

5. 完成后可以直接使用:ssh lwh 登陆

在Github上添加Deploy Keys

服务器生成秘钥

# 生成ssh key
ssh-keygen -t rsa

# 查看公钥内容
cat ~/.ssh/id_rsa.pub

复制秘钥内容,添加到Github上对应的项目仓库Settings下的Deploy keys

配置Deploy keys,使得服务器可以通过ssh拉取项目仓库;

配置pm2

配置ecosystem.config.js;具体pm2配置及基本使用介绍,戳~使用pm2配置生产环境

module.exports = {
 apps: [
  {
   name: 'back-Api',   //应用名
   script: './server/start.js',  //应用文件位置
   env: {
    //PM2_SERVE_PATH: "./apidoc",  //静态服务路径
    PM2_SERVE_PORT: 8080,  //静态服务器访问端口
    NODE_ENV: 'development' //启动默认模式
   },
   env_production : {
    PM2_SERVE_PORT: 8080,
    NODE_ENV: 'production' //使用production模式 pm2 start ecosystem.config.js --env production
   },
   instances:"max",     //将应用程序分布在所有CPU核心上,可以是整数或负数
   instance_var: "INSTANCE_ID",
   exec_mode: "cluster",
   min_uptime: "30s",
   max_restarts: 10,
   //cron_restart: "40",
   watch:[
    "server",
   ], //监听模式,不能单纯的设置为true,易导致无限重启,因为日志文件在变化,需要排除对其的监听
   merge_logs: true,     //集群情况下,可以合并日志
  }
 ],
 deploy: {
   production : {
    //配置没法提供密码,所以前面需要配置ssh免密码登录服务器
    user: 'root',           //ssh 登陆服务器用户名
    host: '100.12.102.198',       //ssh 地址服务器domain/IP
    ref: 'origin/master',       //Git远程/分支
    repo: 'git@github.com',     //git地址使用ssh地址
    path: '/liwenhui/www',    //项目存放服务器文件路径
    "post-deploy": 'npm install && pm2 reload ecosystem.config.js --env production' //部署后的动作
   }
 }
};

开始部署

pm2 deploy ecosystem.config.js production

报错

appledeMBP:back-server-api apple$ pm2 deploy ecosystem.config.js production
--> Deploying to production environment
--> on host 106.12.132.188
○ deploying origin/master
○ executing pre-deploy-local
○ hook pre-deploy
bash: 第 0 行:cd: /lwh/www/source: 没有那个文件或目录
○ fetching updates
○ full fetch
bash: 第 0 行:cd: /lwh/www/source: 没有那个文件或目录

fetch failed

Deploy failed
1

需要先初始化服务器应用:pm2 deploy ecosystem.config.js production setup

然后:pm2 deploy ecosystem.config.js production

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

Javascript 相关文章推荐
javascript动画浅析
Aug 30 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
基于jquery实现即时检查格式是否正确的表单
May 06 Javascript
如何用js实现鼠标向上滚动时浮动导航
Jul 18 Javascript
基于jQuery实现滚动刷新效果
Jan 09 Javascript
详解javascript立即执行函数表达式IIFE
Feb 13 Javascript
Node.js中看JavaScript的引用
Apr 22 Javascript
p5.js入门教程之键盘交互
Mar 19 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
May 08 Javascript
vue实现分页组件
Jun 16 Javascript
如何让微信小程序页面之间的通信不再变困难
Jun 03 Javascript
OpenLayers加载缩放控件使用方法详解
Sep 25 Javascript
详解用Webpack与Babel配置ES6开发环境
Mar 12 #Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 #Javascript
javascript中数组的常用算法深入分析
Mar 12 #Javascript
详解javascript 变量提升(Hoisting)
Mar 12 #Javascript
NestJs 静态目录配置详解
Mar 12 #Javascript
JavaScript使用小插件实现倒计时的方法讲解
Mar 11 #Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
Mar 11 #Javascript
You might like
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
详解如何设置Python环境变量?
2019/05/13 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
python实现日志按天分割
2019/07/22 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
Python如何将函数值赋给变量
2020/04/28 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
五年级音乐教学反思
2014/02/06 职场文书
高中军训感想300字
2014/03/04 职场文书
法制宣传标语
2014/06/23 职场文书
Python必备技巧之字符数据操作详解
2022/03/23 Python