在 heroku 平臺部署 node.js 程式

王頂發表於2019-02-16

假如我們需要把自己寫的 node.js 服務程式部署到雲主機上,請問這樣的開發任務該如何實現呢?可以使用免費的 heroku 雲服務。下面是使用 heroku 平臺部署 node.js 程式的步驟:

總共有七個步驟,具體操作步驟如下:

一、註冊 heroku 網站賬戶

注意:

  • 訪問網址:https://www.heroku.com/
  • 需要用翻牆軟體,註冊過程需要驗證註冊使用者不是機器人,需要點選一個介面上的驗證控制元件,這個驗證控制元件用的是 google 的一個外掛,所以不翻牆,這個驗證通不過,完成不了註冊。
  • 註冊郵箱最好是 gmail 郵箱,如果沒有 gmail 郵箱可以註冊一個,同樣需要翻牆。如果是 QQ 郵箱,會提示 QQ 郵箱會遮蔽註冊的確認郵件。

二、安裝下載 heroku-cli 工具

注意:

  • 需要切換到 root 使用者,再執行安裝命令
  • heroku -v 命令來驗證程式安裝是否成功,如果安裝成功會在控制檯列印出程式的版本資訊
  • heroku --help 命令會列出 heroku 支援的所有子命令
su
npm install -g heroku-cli
heroku -v
heroku --help

三、準備待部署的服務程式

mkdir app-dir
npm init

修改程式碼,確保程式碼在本地測試通過。

注意:

  • 主指令碼程式檔名最好是 index.js
  • 程式需要有 package.json 配置檔案
  • package.json 檔案中需要有 npm start 指令碼,npm start 指令碼就是 linux 命令,一般是 node index.js,表示如何執行服務程式
  • 如果程式中 createServer 建立 web 服務,需要監聽埠,需要把監聽埠的程式碼,做如下修改:
.listen(8080);      // 原始碼
.listen(process.env.PORT || 8080);    // 修改後的程式碼

什麼原因呢?因為很多人的 web 服務程式都被部署到同一個伺服器上,可能大家寫的埠號都是 8080,那樣就是出現埠衝突,只有第一個被部署的程式能工作,其他人的程式都因為埠衝突而無法執行。這樣,雲端系統為了避免埠衝突,自動分配給每個部署的應用程式分配了一個埠號,這個埠號就放到 PORT 環境變數中,用 process.env.PORT 程式碼來調出這個埠號。因為,自己的測試環境沒有 PORT 環境變數,所以後面或運算 8080,可以保證本地測試時,程式碼能正常執行。

四、用 heroku-cli 工具建立應用

heroku login
heroku create app-name

注意:

  • heroku login,需要輸入使用者名稱和口令,就是第一個步驟註冊的
  • app-name 可以省略,託管平臺會分配一個隨機的字串,保證 app-name 命名不會衝突
  • 當然,也可以自己指定 app-name,儘量不要用 www 或者 blog 之類的名稱,一般都會衝突
  • 建立應用過程中,需要輸入登入 heroku.com 網站的使用者名稱和密碼,在第一步已經註冊
  • 提示資訊很重要:

五、Git 推送程式碼到遠端倉庫

git init
git add .
git commit -m "first commit"
git remote add origin https://git.heroku.com/app-name.git
git remote -v
git push -u origin master

注意:

  • Git 工具推送程式碼成功後,有輸出資訊,遠端託管主機會做一系列工作,包括:建立執行環境、安裝必要的依賴庫、壓縮程式,啟動服務,等

六、訪問和測試 web 服務程式

curl https://app-name.herokuapp.com/

如果在 heroku 上部署的是 RESTful node.js 後臺程式,願意的話可以把前端頁面部署到 GitHub 上,如何部署前端頁面,請看一下 GitHub 開源之旅第一季的課程,這裡就不再贅述了。注意一下,在部署前端頁面之前,需要修改一下前端頁面的程式碼,確保能夠正確訪問 RESTful API。

七、使用雲服務管理後臺

前提是需要翻牆,登入 heroku 網站。主要是檢視伺服器執行的日誌資訊,這裡就不再多說了。

總結

因為用的是 heroku 的免費服務,可以使用的功能比較有限。另外,就是我們部署的服務程式,如果隔一段時間沒有訪問,服務程式會被殺掉。當接到下一個請求時,服務程式會被再次喚醒,當然,這樣會導致第一次服務程式響應的比較慢。

相關文章