全栈实用技能,pm2部署node应用到服务器

好东西就要拿来分享,不管你的目标是前端还是全栈,都值得一看。

背景介绍

一般的,我们开发一个前端项目通常是在本地通过Node.js搭一个服务器,所有的开发测试过程基本上都是在本地搞定。有时候,我们需要把我们的作品上线,好让更多的人能够访问到。比较传统的方法可能就是将本地代码通过sshftp等方式上传到服务器,然后通过ssh登入到服务器,配置好环境,然后手动启动我们的应用。

然而,很多时候我们的源码会不断的更新,如果全部由我们手动上传然后再启动,总显得太过繁琐。作为一个高大上的前端开发人员,这种方法实在太Low了。

通常,我们的代码都会用到Git版本控制工具。本篇文章,主要介绍基于 git + pm2 + node 的一键部署应用到服务器。

写在前面

网上大部分教程都只介绍方法,然而并没有提到实现原理,对于没有这方面概念的人来说,根本就不知道这是在干嘛。

三个概念

  • Git服务器:用来保存你代码的仓库,比如:Github。也可以是你自己搭建的Git服务器。为了统一,后面全部都叫Github
  • 目标服务器:就是你要将你的项目部署到的那个服务器,以下统一都叫服务器(Server)
  • 本地环境:就是你开发用的PC,就叫它Local吧。

实现原理

我不会画图,可以想象一下这个流程:我们在本地(Local)写好一个项目,再提交(commit)到远程Github上。然后让我们的目标服务器(Server)去远程的Github上获取(clone或pull)我们刚刚提交的最新版本,并通过npm install命令来安装所需的模块,最后启动服务器。

每当我们项目更新后,再重新执行此过程。这些过程都是通过pm2来实现的,而不用我们一步一步的手动去操作。

环境搭建

服务器端(Server)

需要安装node.jspm2git

以下所有命令只针对CentOS 7发行版,其他版本可供参考,其原理都是一样的。

# 更新 yum
$ yum update -y

# 1. 安装node.js
$ yum install nodejs -y

# 2. 安装git
$ yum install git -y

# 3. 安装pm2
$ npm install -g pm2

建议使用yum来安装,会省去很多麻烦。如果通过其他方式安装,必须要保证nodenpmgitpm2都是全局安装(已添加到当前用户的环境变量中)。

本地(Local)

与服务器(Server)端一样,需要正确安装nodegitpm2

配置SSH

根据上面的原理说明,可以得出以下3点:

  1. 本地(Local)要能够提交和拉取Github上的仓库(这个就不做介绍了,只要你使用GitHub,一般都已经配置好了);
  2. 服务器(Server)要能够拉取Github上的仓库;
  3. 本地(Local)要能够免密码登录到服务器(Server)。

这也是3个前提条件,没有配置好后面就无法正常部署。

在Github上添加Deploy Keys

在服务器(Server)上执行:

# 生成ssh key,一路回车即可
$ ssh-keygen -t rsa

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

然后复制整个内容,并添加到Github上对应的项目仓库Settings下的Deploy keys中。(只读权限即可)

本地(Local)自动登录到服务器(Server)

在本地(Local)执行:

# 生成ssh key,一路回车即可
$ ssh-keygen -t rsa

# 将本地key添加到服务器的authorized_keys中
# name 是你的服务器用户名 server 是你服务器的地址
# 默认是22端口,否则你需要指定端口号
$ ssh-copy-id name@serer

pm2部署

如果你已经配置好环境,接下来就可以进入主题了。

这里给一个官方的连接吧,我基本上也是参照官方介绍来操作的。

配置文件介绍

在项目的根目录下,执行:

$ pm2 ecosystem

然后会在根目录下生成一个ecosystem.config.js文件,官方文档中写的是ecosystem.json文件,可能两种都支持吧,这不是重点,主要看里面的配置:

// ecosystem.config.js

module.exports = {
  /**
   * Application configuration section 应用配置部分
   * http://pm2.keymetrics.io/docs/usage/application-declaration/
   */
  apps : [

    // First application
    {
      // 项目名称
      name      : 'wchat-sv',
      // 程序入口
      script    : 'index.js',
      env: {
        COMMON_VARIABLE: 'true'
      },
      env_production : {
        NODE_ENV: 'production'
      }
    },
    // 还可以配置第二个应用
    {
        // ... 
    }
  ],

  /**
   * Deployment section 部署部分
   * http://pm2.keymetrics.io/docs/usage/deployment/
   */
  deploy : {
    production : {
      // 因为pm2要登录到服务器(Server)中执行命令,所以要提供 name 和 host
      // 这里没有提供密码,也就是为什么要配置ssh免密码登录
      user : 'root',    // 服务器用户名
      host : '45.63.48.141',    // 服务器地址
      
      // 服务器(Server)需要获取GitHub上的仓库
      // 所以要配置Deploy Keys
      ref  : 'origin/master',   // 仓库名称,没有更改过的话默认即可
      repo : 'git@github.com:moohng/wchat-sv.git',    // Github上的仓库地址
      
      path : '/root/server/production', // 应用部署到服务器的路径
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'   // 在服务器上执行的脚本命令,会在从Github上获取到最新的版本后执行
    },
    dev : {
      user : 'node',
      host : '212.83.163.1',
      ref  : 'origin/master',
      repo : 'git@github.com:repo.git',
      path : '/var/www/development',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env dev',
      env  : {
        NODE_ENV: 'dev'
      }
    }
  }
};

该配置主要包括两个部分:appsdeploy

apps是一个数组,可以配置多个应用。其中name是应用名称(随意),script是你应用启动的入口。

deploy又分为productionstaging,其实也就是两个不同的环境。

基本需求上面的配置已经够用了,更多请参考官方文档

部署

  • 初始化服务器(Server)应用
$ pm2 deploy ecosystem.config.js production setup
  • 开始部署
$ pm2 deploy ecosystem.config.js production

如果你的环境配置正确,那么现在你的应用就已经部署成功了。

错误总结

如果部署失败,根据提示信息来操作。

  1. 无法登录到你的服务器(Server):没有正确添加本地(Local)ssh key到服务器(Server)的authorized_keys中。
  2. 服务器(Server)没有权限获取Github上的项目:Github没有正确添加Deploy Keys。
  3. 服务器(Server)找不到npmgitpm2命令:没有正确全局安装。

对于第2个问题,有个注意的地方:如果你是首次从服务器获取Github上的仓库,需要先手动在服务器(Server)上执行一遍git clone ...操作,会有一个提示,输入yes即可。我猜可能是pm2不能自动输入yes来确认吧,网上都没有提到这个问题,是我自己遇到的,不知道是不是都这样。

防火墙相关操作

如果你已经部署成功,但却不能访问,那么很可能是端口没有开放。CentOS 7 默认是firewall防火墙,如果你的是iptables,请自行百度。

开放端口

# 开放某个端口,带--permanent参数是永久开放
$ firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 重启
$ firewall-cmd --reload

# 查看开启的端口
$ firewall-cmd --list-ports

# --------------
# 移除开放的端口
$ firewall-cmd --zone=public --remove-port=8080/tcp --permanent

更多firewall的使用可以通过man firewall-cmd命令来查看。

pm2开机自启

$ pm2 startup centos

网上的教程好像还说要执行其他什么命令,不过我好像就执行这一些命令就搞定了。不知道是不是版本更新了,我使用的是目前最新的版本。

总结

我觉得这个技能很实用,也是因为最近的一个需求才了解到的,就拿出来分享一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容