假如我們需要把自己寫的 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 網站的使用者名稱和密碼,在第一步已經註冊
-
提示資訊很重要:
- 提示了網站釋出後,訪問的地址:https://app-name.herokuapp.com/
- 提示了 Git 上傳程式碼的地址:https://git.heroku.com/app-na…
五、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 的免費服務,可以使用的功能比較有限。另外,就是我們部署的服務程式,如果隔一段時間沒有訪問,服務程式會被殺掉。當接到下一個請求時,服務程式會被再次喚醒,當然,這樣會導致第一次服務程式響應的比較慢。