# Heroku ─ Ruby 程式語言的最佳雲端環境

> 

Published: 2012-01-06
URL: https://kaochenlong.com/heroku-the-best-cloud-platform-on-ruby-language

---

你曾經用 Ruby on Rails 開發網站，但在國內找不到可以用的主機空間嗎？或者你是新創公司，但初期還沒足夠資金投資在伺服器的硬體設備上嗎？又或是沒有專職的 MIS 幫你管理伺服器嗎? 讓我們來看看 Heroku 吧！

&lt;!-- more --&gt;

## 簡介

用 Ruby on Rails 開發網站很快、很方便，但在台灣比較麻煩的是可以租用的主機空間並不好找，如果要自己架一台成本又太高，而且也有一定的技術門檻。目前市面上有不少 PasS(Platform As A Service)的解決方案，例如 Amazon 的 [AWS(Amazon Web Services)](http://aws.amazon.com/)雖然也是個不錯的解決方案，但還是得花一些時間想辦法安裝、設定到可以執行 Rails 的環境。如果你不想這麼麻煩，[Heroku](http://www.heroku.com/)就是個很不錯的解決方案。不只是 Ruby on Rails 的程式，任何 Rack 程式都可以在 Heroku 執行(包括 Ruby on Rails 跟 Sinatra 都沒問題)。

## 費用及效能

選擇主機最在乎的，不外乎是費用及效能這兩件事。Heroku 最讓人喜愛的地方之一，就是它有提供免費的額度可以用，網站空間部份，每個專案的限制是 100MB，這對一般的小型的專案來說還滿夠用的；資料庫的部份，每個專案的資料庫大小限制則是 5MB，而且有 SQLite、MySQL、PostgreSQL 可以選用。

至於效能基本上也不至於太差，對一個一般的網站來說，Heroku 的 1 個 dyno（Heroku 的計價單位）差不多是可以處理 10~50 request/second。如果覺得不夠用，也可以考慮它的[付費方案](http://www.heroku.com/pricing)來增加 dyno 數：

![](/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBckVCIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--746e9b387cd65ce0715c6cb32195575d1f5e9c51/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUJXa0NBQVE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--578d6799c87a604ca574298502ba874c9075e929/heroku-price.png)

只要拉一下選項，調整 dyno 數，就可以知道每個月要花多少費用了。

## 申請

請到[這裡](https://api.heroku.com/signup)填寫 Email，不需要額外的費用。

![](/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBcklCIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--52b77391d96b11a23fa96946cc1937b0d75958a8/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUJXa0NBQVE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--578d6799c87a604ca574298502ba874c9075e929/heroku-signup.png)

填寫完成後應該不久就會收到一封啟用的認證信，點擊認證連結回到 Heroku 網站，設定登入密碼：

![](/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBck1CIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--f38135362e19406b00b50380088bd449ad659700/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUJXa0NBQVE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--578d6799c87a604ca574298502ba874c9075e929/heroku-password.png)

這樣就完成申請的程序了。

## 安裝

有兩個工具是使用 Heroku 會用得上的：Ruby 以及 Git。Ruby 使用 1.8 或 1.9 版本皆可，個人建議使用 1.9.2 的版本，如果你不想在電腦裡裝太多版本的 Ruby 的話，也可參考[這篇](/2011/11/16/rvm.html)，使用 RVM 來安裝 Ruby。

以下範例因為都是在 RVM 執行的，所以不會需要 root 權限，如果你用的是一般系統的 Ruby 的話，可能會需要 `sudo` 來取得 root 權限才能順利安裝。

裝好 Git 跟 Ruby 之後，Heroku 有打包好的 gem 可以使用：

    &gt; gem install heroku
    Fetching: rubyzip-0.9.5.gem (100%)
    Fetching: heroku-2.15.3.gem (100%)
    Successfully installed rubyzip-0.9.5
    Successfully installed heroku-2.15.3
    2 gems installed

## 建立專案

裝好 Heroku 之後，我們使用`heroku create`指令來建立一個空的專案：

    &gt; heroku create
    Enter your Heroku credentials.
    Email: eddie@eddie.com.tw
    Password:
    Could not find an existing public key.
    Would you like to generate one? [Yn] n
    Creating deep-spring-4010... done, stack is bamboo-mri-1.9.2
    http://deep-spring-4010.heroku.com/ | git@heroku.com:deep-spring-4010

Heroku 會在第一次建立專案的時候問你剛才申請的帳號密碼，如果你不想這麼麻煩，在上面的過程中它也會問你要不要建立一組 public key，如果選擇`Y`就會引導你建立一組 public key。

在一開始創建專案的時候，Heroku 會自動幫你隨機產生一個名字，以上面的範例來看就是 `deep-spring-4010`。再來我們打開瀏覽器，連上 `http://deep-spring-4010.heroku.com/`，應該可以看到這個畫面：

![](/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBclFCIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--9a0c5ab26bc5693a0831dd0e7648e6751114e110/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUJXa0NBQVE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--578d6799c87a604ca574298502ba874c9075e929/heroku-init.png)

如果上面這個 `deep-spring-4010` 的名字你不喜歡，也可以到 Heroku 網站後台去修改，或是直接在一開始建立的時候就指定名稱：

    &gt; heroku create hello_kitty

這樣就會幫你用 `hello_kitty` 這個名稱來建立專案，只要名稱沒有先被申請走，你就可以使用。Heroku 還有提供更多其它方便的指令可以使用，詳細內容可參考 Heroku 的[這篇說明](http://devcenter.heroku.com/categories/command-line)。

## 上傳你的應用程式

不像一般的網站空間是透過 FTP 上傳檔案，Heroku 是透過 Git 來發佈的。不過在這之前，我們先來簡單的用 Rails 的 scaffold 來快速的建立一個簡單的小程式，待會我們要把這個簡單的程式上傳到 Heroku 上。

### 建立 Rails 專案

    &gt; rails new my_heroku_demo
    .. 訊息略 ..

    &gt; cd my_heroku_demo
    .. 訊息略 ..

    &gt; rails g scaffold Book title:string author:string publish_date:date

    &gt; rake db:migrate
    ==  CreateBooks: migrating ===================
    -- create_table(:books)
            -&gt; 0.0019s
    ==  CreateBooks: migrated (0.0023s) ==========

    &gt; rails s
    .. 訊息略 ..

打開瀏覽器連上 `http://127.0.0.1:3000/books` 應該就能看到剛剛建立的頁面。

![](/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBclVCIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--bf4710ae709ffe4f4a36e2c6ef007c5b48ddd8c9/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUJXa0NBQVE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--578d6799c87a604ca574298502ba874c9075e929/heroku-scaffold.png)

如果各位對 Ruby on Rails 不熟悉的話，建議可以參考一下 Rails 官網上的這篇文章[Getting Started with Rails](http://guides.rubyonrails.org/getting_started.html)。

### 部署

網站做好後，接下來就是要把東西上傳到 Heroku 上。請在剛剛建立的專案底下輸入指令：

    &gt; git init .
    Initialized empty Git repository in /tmp/my_heroku_demo/.git/

    &gt; git add .

    &gt; git commit -m &#39;first commit&#39;
    .. 訊息略 ..

再來要把遠端的 Heroku 加進來：

    &gt; git remote add heroku git@heroku.com:deep-spring-4010.git

最後再一個 `git push` 指令，就可以把做好的東西&quot;推&quot;上 Heroku：

    &gt; git push heroku master

接下來你應該會看到一些訊息，並且在 Heroku 上自動幫你安裝一些需要的 gem。再來，因為我們有用到資料庫，所以也需要做一下 `rake db:migrate`，不過跟在本機做的時候稍有不同：

    &gt; heroku rake db:migrate

這樣就會對 Heroku 上的資料庫做 migration 的動作了。完成之後，請打開瀏覽器輸入網址`http://deep-spring-4010.heroku.com/`，或是輸入`heroku open`，也會幫你打開預設的瀏覽器。

![](/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBcllCIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--15159dfa441ff8d76a96eacefa76c5ad556476b6/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUJXa0NBQVE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--578d6799c87a604ca574298502ba874c9075e929/heroku-rails-init.png)

如果看到 Rails 預設的首頁的話，表示應用程式已經順便傳上去了。再來輸入網址`http://deep-spring-4010.heroku.com/books`，順利的話，你應該就可以看到剛剛寫好的程式了。

到這裡你大概就已經學會如何 Heroku 佈署你的 Rails 應用程式了。在 Rails 3.1 之前的版本應該都會滿順利的，但如果你用的是 Rails 3.1 的話（包括之後的版本），你可能不會這麼順利.. 讓我們繼續看下去。

## 問題

雖然 Heroku 很方便，但有個比較大的問題是 Heroku 是個「唯讀」的平台，所以如果你想類似檔案上傳或相簿功能的網站的話，上傳的東西需要另外想辦法傳到別的地方（例如上傳到 Amazon 的 S3）。而在 Rails 3.1 之後引進了 `asset pipeline`，靜態檔案會動態產生，而 Heroku 沒辦法讓你這樣做，所以，你需要先在本機先把 asset 編譯好之後再推一次上去：

    &gt; rake assets:precompile RAILS_ENV=productioran
    .. 訊息略 ..

    &gt; git add .

    &gt; git commit -m &#39;add precompied assets&#39;
    .. 訊息略 ..

    &gt; git push heroku
    .. 訊息略 ..

另外，如果你在做 `heroku rake db:migrate` 這個步驟的時候出現這個錯誤訊息的話：

    &gt; heroku rake db:migrate
    rake aborted!
    Please install the postgresql adapter: `gem install activerecord-postgresql-adapter` (pg is not part of the bundle. Add it to Gemfile.)

    Tasks: TOP =&gt; db:migrate =&gt; db:load_config
    (See full trace by running task with --trace)

請打開你的 Gemfile，加上這一段：

    group :production do
        gem &quot;pg&quot;
    end

加完之後再執行：

    &gt; bundle install --without production

應該就可以正常運作了。

## Heroku 的後台管理

我們回到 Heroku 網站，登入之後可以看到目前有建立哪些 app：

![](/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBcmNCIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--1a673a3d8703fe6642208dac600ba83322561144/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUJXa0NBQVE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--578d6799c87a604ca574298502ba874c9075e929/heroku-applist.png)

例如我們看看我們剛剛建立的那個 `deep-spring-4010`：

![](/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBcmdCIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--87c545c10a62b699fba52cb43232c5ec648bdf18/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFJQUJXa0NBQVE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--578d6799c87a604ca574298502ba874c9075e929/heroku-app.png)

可以看到關於這個 app 的使用情況。如果這個專案不要了，也可以直接從後台刪除掉。

## 結論

Heroku 提供了一個可以簡單、快速佈署 Ruby 應用程式的平台，不用自己維護主機，不需要的時候隨時可以停掉服務，或是萬一臨時要加大硬體需求或頻寬，只要線上刷卡就可以輕鬆解決，設定上相當簡單。

不過就以就費用來看的話，加大 dyno 數來應付更大需求是很方便，但它可能不會是最便宜的方案（甚至其實還滿貴的）。我個人覺得它很適合試一些簡單的小專案，或是一些臨時想到的 idea，用 Rails 快速的 idea 做出來，再丟上 Heroku 的免費額度試一下大家的反應如何，如果真的越做越大的話，也許再考慮正式投資更多的預算或硬體。

畢竟開發專案，最重要的就是先把東西做出來，之後要做更大規模的，現在的雲端平台的延展性（Scalability）都還不錯，通常只要花錢就可以幾乎無痛昇級。

不久前 Heroku 還提供了對 Facebook app 的支援，對想要在 Facebook 上建立應用程式的人來說也是一大福音，連 Ruby 的發明者松本行弘也在不久前加入了 Heroku，受聘為首席架構師，相信 Heroku 能提供的服務會越來越豐富。如果各位有在寫 Ruby 應用程式卻還苦於找不到地方放的話，建議不妨可以試試看 Heroku。


