如何使用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实现页面自适应
Jan 19 Javascript
jquery 表单下所有元素的隐藏
Jul 25 Javascript
jquery中实现标签切换效果的代码
Mar 01 Javascript
json的前台操作和后台操作实现代码
Jan 20 Javascript
关于Jquery操作Cookie取值错误的解决方法
Aug 26 Javascript
谈一谈bootstrap响应式布局
May 23 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
Jun 29 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
Aug 29 Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
Aug 08 Javascript
scrapyd schedule.json setting 传入多个值问题
Aug 07 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
May 12 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
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
PHP SplObjectStorage使用实例
2015/05/12 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
php创建类并调用的实例方法
2019/09/25 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
Vue如何实现组件的源码解析
2017/06/08 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
python搜索指定目录的方法
2015/04/29 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
机电一体化专业应届生求职信
2013/11/27 职场文书
酒店led欢迎词
2014/01/09 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
2016年母亲节广告语
2016/01/28 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
JAVA API 实用类 String详解
2021/10/05 Java/Android