## 目標
將?[https://github.com/Ricardo-Li/node-practice-2](https://github.com/Ricardo-Li/node-practice-2)?這個項目部署上 heroku,成為一個線上項目
我部署的在這里?[http://serene-falls-9294.herokuapp.com/](http://serene-falls-9294.herokuapp.com/)
## [](https://github.com/alsotang/node-lessons/tree/master/lesson12#知識點)知識點
1. 學習 heroku 的線上部署([https://www.heroku.com/](https://www.heroku.com/)?)
## [](https://github.com/alsotang/node-lessons/tree/master/lesson12#課程內容)課程內容
### [](https://github.com/alsotang/node-lessons/tree/master/lesson12#什么是-heroku)什么是 heroku
heroku 是弄 ruby 的 paas 起家,現在支持多種語言環境,更甚的是它強大的 add-on 服務。
paas 平臺相信大家都不陌生。Google 有 gae,國內新浪有 sae。paas 平臺相對 vps 來說,不需要你配置服務器,不需要裝數據庫,也不需要理會負載均衡。這一切都可以在平臺上直接獲取。
你只要專注自己的業務,把應用的邏輯寫好,然后發布上去,應用自然就上線了。數據庫方面,如果你用 mysql,那么你可以從平臺商那里得到一個 mysql 的地址、賬號和密碼,直接連接就能用。如果應用的流量增大,需要橫向拓展,則只用去到 paas 平臺的管理頁面,增大服務器實例的數量即可,負載均衡會自動幫你完成。
說起來,我之所以對于 web 開發產生興趣也是因為當年 gae 的關系。那時候除了 gae 之外,沒有別的 paas 平臺,gae 是橫空出世的。有款翻墻的軟件,叫 gappproxy([https://code.google.com/p/gappproxy/](https://code.google.com/p/gappproxy/)?)——可以認為是 goagent 的前身——就是搭建在 gae 上面的,不僅快,而且免費。于是我就很想弄懂這樣一個程序是如何開發的。好在 gappproxy 是開源的,于是我下了源碼來看,那時候才大一,只學過 c,看到那些 python 代碼就凌亂了。于是轉頭也去學 python,后來漸漸發現了 web 開發的樂趣,于是 ruby 和 node.js 也碰碰。后來 goagent 火起來了,我又去看了看它的代碼,發現非常難看,就自己寫了個?[https://github.com/alsotang/keepagent](https://github.com/alsotang/keepagent)?。不過現在回想起來,還是 goagent 的實現比較穩定以及效率高。
heroku 的免費額度還是足夠的,對于 demo 應用來說,放上去是綽綽有余的。各位搞 web 開發的大學生朋友,一定要試著讓你開發的項目盡可能早地去線上跑,這樣你的項目可以被其他人看到,能夠促使你更有熱情地進行進一步開發。這回我們放的是 cnode 社區的爬蟲上去,你其實可以試著為你們學院或者學校的新聞站點寫個爬蟲,提供 json api,然后去申請個微信公共平臺,每天推送學院網站的新聞。這東西輔導員是有需求的,可以做個給他們用。
好了,我們先 clone?[https://github.com/Ricardo-Li/node-practice-2](https://github.com/Ricardo-Li/node-practice-2)?這個項目。由于我們這回講部署,所以代碼就用現成的了,代碼的內容就是 lesson 3([https://github.com/alsotang/node-lessons/tree/master/lesson3](https://github.com/alsotang/node-lessons/tree/master/lesson3)?) 里面的那個爬蟲。
[](https://github.com/alsotang/node-lessons/blob/master/lesson12/1.png)
clone 下來以后,我們去看看代碼。代碼中有兩個特殊的地方,
一個是一個叫 Procfile 的文件,內容是:
~~~
web: node app.js
~~~
一個是 app.js 里面,
~~~
app.listen(process.env.PORT || 5000);
~~~
這兩者都是為了部署 heroku 所做的。
大家有沒有想過,當部署一個應用上 paas 平臺以后,paas 要為我們干些什么?
首先,平臺要有我們語言的運行時;
然后,對于 node.js 來說,它要幫我們安裝 package.json 里面的依賴;
然后呢?然后需要啟動我們的項目;
然后把外界的流量導入我們的項目,讓我們的項目提供服務。
上面那兩處特殊的地方,一個是啟動項目的,一個是導流量的。
heroku 雖然能推測出你的應用是 node.js 應用,但它不懂你的主程序是哪個,所以我們提供了 Procfile 來指導它啟動我們的程序。
而我們的程序,本來是監聽 5000 端口的,但是 heroku 并不知道。當然,你也可以在 Procfile 中告訴 heroku,可如果大家都監聽 5000 端口,這時候不就有沖突了嗎?所以這個地方,heroku 使用了主動的策略,主動提供一個環境變量`process.env.PORT`?來供我們監聽。
這樣的話,一個簡單 app 的配置就完成了。
我們去?[https://www.heroku.com/](https://www.heroku.com/)?申請個賬號,然后下載它的工具包?[https://toolbelt.heroku.com/](https://toolbelt.heroku.com/)?,然后再在命令行里面,通過?`heroku login`?來登錄。
上述步驟完成后,我們進入?`node-practice-2`?的目錄,執行?`heroku create`。這時候,heroku 會為我們隨機取一個應用名字,并提供一個 git 倉庫給我們。
[](https://github.com/alsotang/node-lessons/blob/master/lesson12/2.png)
接著,往 heroku 這個遠端地址推送我們的 master 分支:
[](https://github.com/alsotang/node-lessons/blob/master/lesson12/3.png)
heroku 會自動檢測出我們是 node.js 程序,并安裝依賴,然后按照 Procfile 進行啟動。
push 完成后,在命令鍵入?`heroku open`,則 heroku 會自動打開瀏覽器帶我們去到相應的網址:
[](https://github.com/alsotang/node-lessons/blob/master/lesson12/4.png)
到此課程也就結束了。
隨便聊聊 heroku 的 addon 吧。這個 addon 確實是個神奇的東西,反正在 heroku 之外我還沒怎么見到這類概念。這些 addon 提供商,有些提供 redis 的服務,有些提供 mongodb,有些提供 mysql。你可以直接在 heroku 上面進行購買,然后 heroku 就會提供一段相應服務的地址和賬號密碼給你用來連接。
大家可以去?[https://addons.heroku.com/](https://addons.heroku.com/)?這個頁面看看,玲瑯滿目各種應用可以方便接入。之所以這類服務有市場,也是因為亞馬遜的 aws 非常牛逼。為什么這么說呢,因為網絡速度啊。如果現在在國內,你在 ucloud 買個主機,然后用個阿里云的 rds,那么應用的響應速度會因為 mysql 連接的問題卡得動不了。但在 heroku 這里,提供商們,包括 heroku 自己,都是構建在 aws 上面,這樣一來,各種服務的互通其實走的是內網,速度很可以接受,于是各種 addon 提供商就做起來了。
國內的話,其實在阿里云上面也可以考慮這么搞一搞。
完。
- 關于
- Lesson 0: 《搭建 Node.js 開發環境》
- Lesson 1: 《一個最簡單的 express 應用》
- Lesson 2: 《學習使用外部模塊》
- Lesson 3: 《使用 superagent 與 cheerio 完成簡單爬蟲》
- Lesson 4: 《使用 eventproxy 控制并發》
- Lesson 5: 《使用 async 控制并發》
- Lesson 6: 《測試用例:mocha,should,istanbul》
- Lesson 7: 《瀏覽器端測試:mocha,chai,phantomjs》
- Lesson 8: 《測試用例:supertest》
- Lesson 9: 《正則表達式》
- Lesson 10: 《benchmark 怎么寫》
- Lesson 11: 《作用域與閉包:this,var,(function () {})》
- Lesson 12: 《線上部署:heroku》
- Lesson 13: 《持續集成平臺:travis》
- Lesson 14: 《js 中的那些最佳實踐》
- Lesson 15: 《Mongodb 與 Mongoose 的使用》
- Lesson 16: 《cookie 與 session》
- Lesson 17: 《使用 promise 替代回調函數》