全栈实用技能,pm2部署node应用到服务器
背景介绍
一般的,我们开发一个前端项目通常是在本地通过Node.js
搭一个服务器,所有的开发测试过程基本上都是在本地搞定。有时候,我们需要把我们的作品上线,好让更多的人能够访问到。比较传统的方法可能就是将本地代码通过ssh
、ftp
等方式上传到服务器,然后通过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.js
、pm2
、git
。
以下所有命令只针对CentOS 7
发行版,其他版本可供参考,其原理都是一样的。
1 |
|
建议使用yum
来安装,会省去很多麻烦。如果通过其他方式安装,必须要保证node
、npm
、git
、pm2
都是全局安装(已添加到当前用户的环境变量中)。
本地(Local)
与服务器(Server)端一样,需要正确安装node
、git
和pm2
。
配置SSH
根据上面的原理说明,可以得出以下3点:
- 本地(Local)要能够提交和拉取Github上的仓库(这个就不做介绍了,只要你使用GitHub,一般都已经配置好了);
- 服务器(Server)要能够拉取Github上的仓库;
- 本地(Local)要能够免密码登录到服务器(Server)。
这也是3个前提条件,没有配置好后面就无法正常部署。
在Github上添加Deploy Keys
在服务器(Server)上执行:
1 |
|
然后复制整个内容,并添加到Github上对应的项目仓库Settings下的Deploy keys中。(只读权限即可)
本地(Local)自动登录到服务器(Server)
在本地(Local)执行:
1 |
|
pm2部署
如果你已经配置好环境,接下来就可以进入主题了。
这里给一个官方的连接吧,我基本上也是参照官方介绍来操作的。
配置文件介绍
在项目的根目录下,执行:
1 |
|
然后会在根目录下生成一个ecosystem.config.js
文件,官方文档中写的是ecosystem.json
文件,可能两种都支持吧,这不是重点,主要看里面的配置:
1 |
|
该配置主要包括两个部分:apps
和deploy
。
apps
是一个数组,可以配置多个应用。其中name
是应用名称(随意),script
是你应用启动的入口。
deploy
又分为production
和staging
,其实也就是两个不同的环境。
基本需求上面的配置已经够用了,更多请参考官方文档。
部署
- 初始化服务器(Server)应用
1 |
|
- 开始部署
1 |
|
如果你的环境配置正确,那么现在你的应用就已经部署成功了。
错误总结
如果部署失败,根据提示信息来操作。
- 无法登录到你的服务器(Server):没有正确添加本地(Local)ssh key到服务器(Server)的
authorized_keys
中。 - 服务器(Server)没有权限获取Github上的项目:Github没有正确添加Deploy Keys。
- 服务器(Server)找不到
npm
、git
或pm2
命令:没有正确全局安装。
对于第2个问题,有个注意的地方:如果你是首次从服务器获取Github上的仓库,需要先手动在服务器(Server)上执行一遍git clone ...
操作,会有一个提示,输入yes即可。我猜可能是pm2
不能自动输入yes来确认吧,网上都没有提到这个问题,是我自己遇到的,不知道是不是都这样。
防火墙相关操作
如果你已经部署成功,但却不能访问,那么很可能是端口没有开放。CentOS 7 默认是firewall
防火墙,如果你的是iptables
,请自行百度。
开放端口
1 |
|
更多firewall
的使用可以通过man firewall-cmd
命令来查看。
pm2开机自启
1 |
|
网上的教程好像还说要执行其他什么命令,不过我好像就执行这一些命令就搞定了。不知道是不是版本更新了,我使用的是目前最新的版本。
总结
我觉得这个技能很实用,也是因为最近的一个需求才了解到的,就拿出来分享一下。