Ruby on Rails 在佈署上面,有兩種模型:出自ihower.tw
全自動模型 Apache/Nginx + Passenger
Passenger 又叫做 mod_rails,是目前佈署 Ruby on Rails 最方便的方式,直接將對 Rails 的支援變成 Apache 或 Nginx 的模組,就像 mod_php 一樣。
Apache 是一套功能非常豐富、非常多人使用的開放原始碼 HTTP 伺服器,要在 Ubuntu 上安裝 Apache + Passenger 指令如下:
sudo apt-get install -y apache2-mpm-prefork apache2-prefork-dev libapr1-dev libaprutil1-dev sudo gem install passenger sudo passenger-install-apache2-module
執行完 passenger-install-apache2-module 後會有一段設定,請將此設定加入 /etc/apache2/conf.d/mod_rails 檔案之中,例如:
passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15/ext/apache2/mod_passenger.so PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15 PassengerRuby /usr/local/bin/ruby
假設你的 Rails 專案放在 /home/ihower/your_rails_app 目錄下,那麼可以新增 /etc/apache2/sites-enabled/your_rails_app.conf 這個專案的設定,例如:
ServerAdmin [email protected] ServerName your_rails_app.ruby.tw DocumentRoot /home/ihower/your_rails_app/public ErrorLog /var/log/apache2/error-your_rails_app.log CustomLog /var/log/apache2/access-your_rails_app.log combined # Deflate AddOutputFilterByType DEFLATE text/html text/xml text/plain text/css application/x-javascript text/javascript; BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html Options FollowSymLinks Order allow,deny Allow from all AllowOverride all Options -MultiViews FileETag none
注意到 DocumentRoot 和 Directory 是指向 public 這個靜態檔案的目錄。設定好之後,執行 sudo apache2ctl restart 便會啟用。如果之後你的 Rails 有任何修改要重新載入,但是並不想把 Apache 重開,請在你的 Rails 應用程式目錄下執行 touch tmp/restart.txt,這樣 mod_rails 就會知道要重新載入 Rails,而不需要重開 Apache。
Nginx + Passenger
Nginx 則是另一套在 Rails 世界上還蠻常被使用的第二選擇,相較於 Apache 雖然功能較少,但執行效率更為良好。要讓 Nginx 裝上 Passgener 不需要先裝 Nginx,只需要執行以下指令:
sudo passenger-install-nginx-module
這是因為 Passenger 必須與 Nginx 一起編譯安裝的關係,所以 Passenger 的安裝指令就包括了安裝 Nginx。
反向代理(Reverse proxy)模型 Apache/Nginx + Mongrel/Thin/Unicorn
反向代理(Reverse proxy)模型就比較複雜了,它分成 Web 伺服器和 Application 伺服器,圖示如下:
其中 Web 伺服器會是 Apache 或 Nginx,但是它除了提供靜態檔案之外,其餘的任務就只是做 reverse proxy 將 request 分發到 Application 伺服器。
而 Application 伺服器負責執行 Ruby on Rails 程式,這有不少選擇:
- Mongrel http://mongrel.rubyforge.org/
- Thin http://code.macournoyer.com/thin/
- Unicorn http://unicorn.bogomips.org/
相較於 Passenger,設定上會比較複雜。
多執行序架構 和 EventMachine 架構
(TODO) 參考 Does Rails Performance Need an Overhaul? 這一篇文章
Ruby on Rails 主機代管服務
可以參考這篇文章 The Best Ruby on Rails Hosting Services ,這些服務可以概分為:
- Dedicated Server 專屬主機租用,一整台機器給你用
- VPS (Vitual private server),使用 VM 技術將一整台機器分租給多人,因此你可以獲得 root 權限安裝你想裝的軟體。
- Shared Host,提供固定的執行環境,例如只能執行 PHP 或 Rails。一台機器同時租用給非常多人。
相較於 PHP,Rails 的確是比較耗費資源的,所以會推薦 VPS 等級以上。
以上的租用方式都是以月來計算,比較沒有彈性。如果需要以小時計算、租用資源非常彈性的服務,那就是雲端了:
- IaaS,例如 Amazon EC2 服務,你可以獲得一整台的 root 權限。
- PaaS 則是固定的執行環境,例如比較有名的 Google App Engine (只提供 Java 和 Python 環境,如果要執行 Rails 需改用 JRuby)。而 Rails 也有專屬的 PaaS 服務, Heroku ,非常推薦一用,它的最基本方案是免費的。
Heroku
- Heroku 簡介
安裝步驟
- 安裝 Heroku 套件 gem install heroku
- 在你的 Rails 目錄下執行 heroku create your_app_name
$ heroku keys:add "%homedrive%%homepath%/.ssh/id_rsa.pub"
發佈步驟
- git push heroku master (發佈程式到 Heroku 上)
- heroku rake db:migrate (第一次發佈或有新 migration 需要執行時)
第三方服務
處理例外
(TODO) 請參考這篇文章 Why? 主動攔截 Rails exception 錯誤
- Hoptoad http://www.hoptoadapp.com/
- Exceptional http://getexceptional.com/
效能監控
(TODO) NewRelic
自動化部署
- Capistrano http://www.capify.org