前言
上期我们对如何利用ssh和sftp的方式来连接远程服务器,那么有人问连接到自己服务器干什么呢?那自然是通过自己内部服务器上到公网上然别人访问自己的服务器,这样一个简单的网站就诞生了。简单理解就是ssh这种方式可以远程操作自己的服务器,而sftp可以将本地和远程服务器进行进行文件传输,今天以egg项目为例,如何部署egg(即nodejs)项目
一、准备工作以及介绍
1、什么是egg
egg是nodejs企业级的应用框架,这里我们不做过多细说,今天我们部署的就是以egg框架搭建的nodejs项目,而nodejs项目本身开发的语言是javascript,这种语言是可以直接在浏览器中运行,不需要像java需要达成jar包再放到类似于tomcat服务器上运行,再加上egg框架内置了 egg-cluster 来启动 Master 进程,Master 有足够的稳定性,不再需要使用 pm2 等进程守护模块。最简单粗暴的方式就是直接丢上去然后运行就可以了。详情可参考egg教程官网
2、前期准备
1、必备:node版本8.0.0已上
2、连接工具:这里我们使用puttyFlashFXP工具,
3、代码编辑器:Visual Studio Code
4、远程服务器系统:Ubuntu CentOS7已上
5、准备要上传的egg项目
6、选备:Mysql、pm2、Nginx、Redis等项目里面相关工具
二、手动部署项目
1.代码部分
(1) VScode通过launch.json运行:想挂在服务器上首先得保证自己的项目能在本地稳定运行,本地使用Visual Studio Code这个工具一般可以生成launch.json来进行本地debug,可以直接添加配置,也可以直接复制我这块代码来运行。
代码如下(示例):
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Egg Debug",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run",
"debug",
"--",
"--inspect-brk"
],
"console": "integratedTerminal",
"restart": true,
"protocol": "auto",
"port": 9229,
"autoAttachChildProcesses": true
}
]
}
大致讲述一下就是name指的是运行的名字,runtimeExecutable指的是运行指令,下载了node后就可以使用npm来启动项目,runtimeArgs指的是运行的参数,里面的debug在package.json里面的script里面会有debug的key值。
(2)服务端运行项目的代码:了解nodejs项目都知道,nodejs初始化会有package.json和package-lock.json这两个文件,package.json主要是放该项目的介绍,一些npm包的版本以及运行调试的scripts,而package-lock.json主要放package.json里面npm包的具体位置映射,本篇主要将关于部署,就详细讲一下scripts里面的内容
代码如下(示例):
{
"name": "mylogin",
"version": "1.0.0",
"description": "login",
"private": true,
"egg": {
"declarations": true
},
"dependencies": {
"egg": "^2.15.1",
"egg-cors": "^2.2.3",
"egg-mysql": "^3.0.0",
"egg-scripts": "^2.15.2",
"egg-swagger-jsdoc": "0.0.3",
"swagger-jsdoc": "^6.1.0"
},
"devDependencies": {
"autod": "^3.0.1",
"autod-egg": "^1.1.0",
"egg-bin": "^4.11.0",
"egg-ci": "^1.11.0",
"egg-mock": "^3.21.0",
"eslint": "^5.13.0",
"eslint-config-egg": "^7.1.0"
},
"engines": {
"node": ">=10.0.0"
},
"scripts": {
"start": "egg-scripts start --daemon --title=egg-server-mylogin",
"stop": "egg-scripts stop --title=egg-server-mylogin",
"prod": "egg-scripts start --env=prod --workers=2",
"dev": "egg-bin dev",
"debug": "egg-bin debug",
"test": "npm run lint -- --fix && npm run test-local",
"test-local": "egg-bin test",
"cov": "egg-bin cov",
"lint": "eslint .",
"ci": "npm run lint && npm run cov",
"autod": "autod"
},
"ci": {
"version": "10"
},
"repository": {
"type": "git",
"url": ""
},
"author": "lopez",
"license": "MIT"
}
这里script对象里面主要是放一些运行脚本,其中key是在终端运行执行的指令(npm run xxx),value指的是实际要运行脚本语言,一般我们用npm run start来直接启动项目,但如果一个项目有不同环境配置,我们在服务器上需要执行不同配置的启动项,比如我们这里有dev环境和prod环境。
(3)egg项目配置:一般后端会分开发dev环境或者生产prod环境,如何区分这些环境在项目中所用的配置呢?egg项目在初始话后会有config文件,底下会有plugin.xxx.js和config.xxx.js,这个xxx分别对应(2)中的key要执行的环境,dev或者prod,其中plugin文件主要是放插件的目录,config主要是引用这些插件的配置项。
代码如下(示例):
// plgin.xxx.js
exports.mysql = {
enable: true,
package: 'egg-mysql',
};
// config.xxx.js
// mysql
config.mysql = {
clients: {
localhostSQL: {
// host
host: '127.0.0.1',
// 端口号
port: '3306',
// 用户名
user: 'root',
// 密码
password: '123456',
// 数据库名
database: 'myproject',
// 最大等待队列限制
queueLimit: 10,
},
}
// 是否加载到 app 上,默认开启
app: true,
// 是否加载到 agent 上,默认关闭
agent: false,
};
2.部署
使用sftp连上指定要部署的服务器的路径,将项目除了node_modules以外所有的文件压缩成zip、tar等或者其他形式的压缩包,然后手动拖到右侧你服务器上的指定目录下(注:1、不需要node_modules是因为这个文件主要放的项目的依赖,只要有package.json文件就可以通过npm i去下载,这样做一来防止Linux和Window他们所用的npm包是否支持,二来node_modules占用了大量的内存,会耗费很多流量,最好服务端和本地安装的node版本保持一致。2、压缩在打包可以节约使用服务端的流量,加快速度等好处)如下图:
(部署过程详见阿里云一期介绍)
3.运行
- 下载node服务linux下安装方法
- 进入egg项目的目录下(与package.json同级)
- npm install -g 全局安装npde_modules
- npm run dev 运行项目
总结
至此,完成了全部的egg项目的部署,后续会不定期更新关于egg代码以及egg常用的插件!