美文网首页
使用 Heroku 部署免费 nodejs 后端服务

使用 Heroku 部署免费 nodejs 后端服务

作者: HoPGoldy | 来源:发表于2021-03-26 18:37 被阅读0次

介绍

也许你曾经使用过 github page 或者其他的静态网站托管服务部署自己的博客或者前端页面。但是只有前端还远远算不上一个网站。这篇文章就来介绍一下如何一分钱不花的部署一个后端服务。

我们使用的平台叫做 heroku,如果你没有听说过它的话,没有关系,heroku 是一个老牌的云平台提供商。你可以通过它非常简单的部署一个在线应用。并且只需要注册就可以领取一定量的免费服务器使用额度(截至到 2021/3/26,heroku 提供的免费额度为 550 小时/月),作为个人服务,这些时长已经足够我们使用的了。

heroku 自我介绍

本文将介绍如何使用 heroku 部署一个 nodejs 后端服务,当然 heroku 还支持其他语言,你可以点击 这里 查看它所支持的所有编程语言。

注册 & 安装工具

现在我们就来准备一下需要的工具,首先我们打开 heroku - 注册 来注册我们的账号。注意有可能存在网站打不开的情况,请自备梯子。注册完成后会让你进行邮箱验证,没什么好说的。

注册完成之后我们就可以安装工具,想要部署 Heroku 应用,我们需要用到 heroku 命令行工具,你可以在 这里 找到下载链接。除了 heroku 之外,我们还需要用到 git 和 node,安装完成后我们在终端里执行如下命令来检查是否安装成功:

# 查看 heroku 是否安装完成
heroku -v
# > heroku/7.51.0 win32-x64 node-v12.21.0

# 查看 git 是否安装完成
git --version
# > git version 2.28.0.windows.1

# 查看 node 是否安装完成
node -v
# > v12.17.0

需要的工具都准备好了,我们在终端中执行如下命令来登录 heroku,登录时会要求提供邮箱密码,依次填写即可:

heroku login -i

输出如下:

heroku: Enter your login credentials
Email: your.email.here@gmail.com
Password: *************
Logged in as your.email.here@gmail.com

至此,我们的准备工作就已经全部完成了,下面就来部署我们的第一个应用:

部署第一个应用

首先,我们先准备要部署的应用,在终端中执行如下命令来拉取项目(这个项目是 heroku 提供的 node 部署示例 ):

# 下载项目
git clone git@github.com:heroku/node-js-getting-started.git
# 进入项目目录
cd node-js-getting-started

进入项目目录后我们执行如下命令来初始化服务:

heroku create
# Creating app... done, ⬢ afternoon-peak-04416
# https://afternoon-peak-04416.herokuapp.com/ | https://git.heroku.com/afternoon-peak-04416.git

由于我们并没有指定名称,所以随机给我们分配了一个,本文的名字叫做 afternoon-peak-04416。你也可以指定要创建的新服务名称,如 heroku create my-first-app,但是注意这个名字不能重名,否则会提示无法创建。

在部署之前我们先简单介绍一下, heroku 拥有一个远程的 git 仓库,在执行了 create 操作后,heroku 会在远程仓库中新建一个用于我们应用的专属仓库(上面输出中就可以看到 ),想要部署的时候我们只需要 往这个远程仓库中提交代码,keroku 就会自动根据配置运行构建并部署服务。

heroku 还会自动帮我们绑定这个远程仓库,我们可以通过 git remote -v 进行查看。并且,以后这个文件夹就是我们的服务管理目录了,只需要切换到这个目录中,执行的所有 heroku 命令都会自动使用当前应用作为目标

git remote -v
heroku  https://git.heroku.com/afternoon-peak-04416.git (fetch) <--- 就是这两个
heroku  https://git.heroku.com/afternoon-peak-04416.git (push)
origin  git@github.com:heroku/node-js-getting-started.git (fetch)
origin  git@github.com:heroku/node-js-getting-started.git (push)

此时我们就可以通过 在线仪表盘 看到我们刚才创建的应用了。不过由于我们还没有上传任何代码,所以现在还无法访问服务。

已经新建好的服务

首次登录仪表盘会让你确认用户协议 Terms of Service,直接最下面 Accept 即可。

部署应用

接下来我们就来部署应用,执行如下命令即可。

git push heroku main

这里要注意推送的分支名要一致,如果你项目默认分支名为 master,这时就要把上面的 main 替换成 master。

执行命令后我们就可以通过 remote 输出看到 heroku 执行了构建。等到上传完成后,我们的服务就已经准备好啦。

Enumerating objects: 541, done.
Counting objects: 100% (541/541), done.   
Delta compression using up to 8 threads   
Compressing objects: 100% (403/403), done.
Writing objects: 100% (541/541), 245.22 KiB | 81.74 MiB/s, done.
Total 541 (delta 102), reused 541 (delta 102), pack-reused 0    
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Node.js app detected
# ...
remote: -----> Compressing...
remote:        Done: 32.8M
remote: -----> Launching...
remote:        Released v3
remote:        https://afternoon-peak-04416.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/afternoon-peak-04416.git
 * [new branch]      main -> main

部署完成后我们只需要执行如下命令启动服务即可:

heroku open

启动完成后会自动打开浏览器并访问我们的服务,这时候你应该就可以看到部署成功的网站啦:

部署完成的示例站点

是不是非常的简单,想要进行修改也很简单,我们打开 index.js,可以看到这个应用就是一个简单的 express 服务,我们新增一个 sayhello 接口并返回 hello world,修改完成后你的代码应该是这样子的:

const express = require('express')
const path = require('path')
const PORT = process.env.PORT || 5000

express()
  .use(express.static(path.join(__dirname, 'public')))
  .set('views', path.join(__dirname, 'views'))
  .set('view engine', 'ejs')
  .get('/', (req, res) => res.render('pages/index'))
  .get('/sayhello', (req, res) => res.send('<h1>Hello World!</h1>')) // <== 添加了这一行
  .listen(PORT, () => console.log(`Listening on ${ PORT }`))

然后我们正常的执行 git 提交操作,如下:

git add .
git commit -m "feat: sayhello"
git push heroku main

随后 heroku 就会开始编译并发布,等待发布完成后打开我们的站点,并在地址栏的末尾添加 /sayhello,就可以看到我们的修改了:

非常简单对不对,对于我们来说,这完全就是平时经常做的最最普通的 git 提交操作。heroku 就是如此的令人舒爽。接下来,我们就来稍微深入的介绍一下 heroku 在构建和发布时到底做了什么。

heroku 的构建与发布

当我们的 git 项目根目录下存在 package.json 文件时,heroku 就会认为这是一个 node 项目。如下:

{
  "name": "node-js-getting-started",
  "version": "0.3.0",
  ...
  "engines": {
    "node": "14.x"
  },
  "dependencies": {
    "ejs": "^3.1.5",
    "express": "^4.17.1"
  },
  ...
}

可以看到其中包含了一个 engines 字段,heroku 将会使用对应的 node 版本对项目执行 npm install 来安装所需的依赖。安装完成后,heroku 会访问根目录中的 Procfile 来确定要执行什么命令来启动服务。你应该可以在项目根目录下找到如下内容的 Procfile:

web: npm start

它的意思是启动一个 web 进程,进程的服务启动命令为 npm start。注意这里的 web 很重要,它是一个固定的进程类型,当 heroku 识别到该类型时,它会把站点的 HTTP 流量 重定向到我们启动的服务进程中。heroku 还支持其他几种进程类型,你可以在 这里 找到它们。


了解完 heroku 是如何启动我们的服务之后,我们来看一下当前服务运行的怎么样,在终端中输入 heroku ps 来进行查看:

heroku ps # 或者 heroku ps -a 你的应用名

Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): npm start (1)
web.1: up 2021/03/26 17:18:03 +0800 (~ 18m ago)

输出内容的第一句话就告诉我们了 本月剩余的可用额度还有多少,可以看到我们现在还剩下 550 小时(100%),当我们的服务在响应请求时,额度就会被消耗,而当额度用完之后,我们的服务就会被强制关闭直到下个月才能重新恢复。你可以选择 绑定你的信用卡 来将免费额度提升至 1000 小时(截至至 2021/3/26,具体数值见官网)。

这里我们会接触到一个新名词:dyno,这个其实就是 heroku 自己的服务器容器,你可以将其简单理解成 docker 中的 container。下面是 heroku 自己对 dyno 的说明,你可以在 这里 找到它的完整介绍。

All Heroku applications run in a collection of lightweight Linux containers called dynos.

我们可以通过命令来直接操作 dyno,例如当我们想要停止服务,就可以通过如下命令来“缩放” dyno 的数量,关闭之后该服务将不会继续消耗额度

# 把该应用的 web dyno 容器数量设置为 0
heroku ps:scale web=0

实际上,我们刚才执行 heroku open 时,heroku 就会自动帮我们启动一个免费的 dyno 容器,这个操作等同于手动执行了 heroku ps:scale web=1

还有一件事,由于我们是免费账户,所以 每个服务只能最大只能启动一个 dyno 提供服务。并且,当一个 dyno 容器超过半个小时都没有收到新请求时,他就会被销毁。不过不用担心,如果有新请求时容器会被自动重启,重启时会有几秒钟的延迟。不过对于我们的 web 后端服务来说,这并不会造成什么影响。

其他常用命令

除了上面介绍的命令外,heroku 还有下列常用命令:

查看启动的服务日志:

heroku logs --tail

启动可以访问到实际项目文件的控制台:

heroku run bash

启动本地开发服务,默认可通过 localhost:5000 进行访问:

heroku local web
# [OKAY] Loaded ENV .env File as KEY=VALUE Format
# 1:23:15 PM web.1 |  Node app is running on port 5000

设置服务的环境变量:

# 设置环境变量
heroku config:set TIMES=2

# 读取环境变量
heroku config
# == afternoon-peak-04416 Config Vars
# TIMES: 2

# 在 node 中使用环境变量
# console.log(process.env.TIMES)
# >> 2

免费的数据库?

什么,你说还想要免费的数据库?还别说,heroku 还真提供了可以免费使用的数据库,这里 是 heroku 所有支持的数据库,一些常用的例如 MySQL、Postgres 都支持了一些免费额度,不过并不多,你可以在对应数据库的 Plans & Pricing 栏中找到具体信息。

除了数据库,heroku 还提供了很多的在线云服务,这些服务统称为 Add-ons。但是还有个坏消息,为了防止滥用,免费用户必须绑定信用卡才可以使用这些附加组件。也就是说,如果想使用免费数据库的话也得先绑定信用卡。

如果你确实有兴趣的话,可以 学习如何接入一个数据库 或者 了解如何验证账户(绑卡)

参考

相关文章

网友评论

      本文标题:使用 Heroku 部署免费 nodejs 后端服务

      本文链接:https://www.haomeiwen.com/subject/nnpjhltx.html