Total Pageviews

Monday, 16 December 2013

用Passenger + Apache运行ror项目

目前為了要把RoR和Apache做個整合,所以在網路上找尋可能的實作方式,找著找著,就找到Passenger這個Apache_mod,真是太好了,接下來就是來看一下要如何設定了。

文件參考

以下是用「MAC OSX 10.5.8」、「Apache2.2.13」當工作環境,如果有出入的話麻煩自行微調一下。

剛開始要先有Apache,這是理所當然的,不過原先在蘋果上面已經綁了一個Apache Server,而在Passenger 1.0.3以後有支援原生的Apache Server,因為照理說大家都已經有了,所以我們就直接跳過安裝Apache這一步吧。

接下來就是透過Gem裝一下我們的Passenger寶石。


gem install passenger
view raw gistfile1.sh hosted with ❤ by GitHub

這邊我在裝的時候花了一些時間,可能要耐心等候一下,大概有幾分鐘。

再來就是讓Apache來建立這個Module


passenger-install-apache2-module
view raw gistfile1.sh hosted with ❤ by GitHub

等這個Module安裝成功後,就會得這個畫面:
http://i57.servimg.com/u/f57/12/90/03/86/mod_pa10.png

截取重要的那一段訊息之後:
 
LoadModule passenger_module /Library/Ruby/Gems/1.8/gems/passenger-2.2.10/ext/apache2/mod_passenger.so
PassengerRoot /Library/Ruby/Gems/1.8/gems/passenger-2.2.10
PassengerRuby /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
view raw gistfile1.sh hosted with ❤ by GitHub

現在我們就可以把這一段Apache的設定放入httpd.conf的設定檔。

不知道大家的設定檔位置是在哪,我的話是放在「/private/etc/apache2/httpd.conf」,

接下來就可以把剛剛的那一段設定寫在檔案的最後面,讓Apache會在啟動時去讀取那個模組,並自動設定好Passenger的位置和Ruby bin的位(這一段是因人而異的,所以通常每個人都不太一樣,要寫入自己安裝完Module時的那段設定)。

Good,基本的模組設定如果都成功的話就可以開始設定我們的Rails專案了。

BTW,如果Passenger發生了什麼問題的話,直接修改你的「httpd.conf」把那三行comment掉就可以停止載入Passenger 了。對了忘記提醒一下,只要有「動到」Apache的任何一個設定檔,就一直要reload Apache哦,別傻傻的一直試,想說怎麼都沒有效果出來。

再來是Passenger的簡單應用,
因為原本在「httpd.conf」的最後面有寫入「Include /private/etc/apache2/other/*.conf」,所以我們就在other這個資料夾新增一個適用於自己專案的設定檔,這邊就叫他 「test.conf」吧。(以下用VirtualHost來設定路徑)
然後因為我的專案是叫做「test」,所以我就在「test.conf」這樣設定:


<VirtualHost *>
ServerName app.test
DocumentRoot /Users/EragonJ/Sites/RoR/test/public/
RailsEnv development
<Directory /Users/EragonJ/Sites/RoR/test/public/>
Allow from all
Options -MultiViews
</Directory>
</VirtualHost>
view raw gistfile1.txt hosted with ❤ by GitHub

在這邊有幾點要注意的就是當你要部署一個專案的時候,一定要把「DocumentRoot」指到你的專案的「public」資料夾,而且要「Disable MultiViews」。

所以現在只要打「http://localhost」就可以看到我們的頁面囉。

再來要補充的是進階用法:如果我們不要直接Match我們的專案到該網域的話,那要怎麼做到Sub URI? (如http://localhost/test 可以指向到我們的test專案,而 http://localhost/ 可能就還是我們原先的Apache welcome頁面)

看官方的做法真的是很酷,要利用到Symbolic Link來部署我們的專案,超酷,那該怎麼做呢?來看一下我的設定檔。
  
<VirtualHost *>
ServerName app.test
DocumentRoot /Users/EragonJ/links # 改變原先DocumentRoot的位置
RailsEnv development
<Directory /Users/EragonJ/links> # 還有這邊,指向我們的Links的資料夾
Allow from all
</Directory>
RailsBaseURI /test # 加入這幾行!
<Directory /Users/EragonJ/links/test> #
Options -MultiViews #
</Directory> #
</VirtualHost>
view raw gistfile1.txt hosted with ❤ by GitHub

一步步解釋,因為用到Sybolic Link,所以如果我有很多種不同的專案時(如 /test , /abc , /def ),那我就會有很多個Link,所以先統一放在「/Users/EragonJ/links」這個資料夾內,接下來再把他們指向到你要的專案下的 public資料夾,請看圖例:
http://i57.servimg.com/u/f57/12/90/03/86/ror10.png

Symbolic Link是這樣製作的「ln -s 被指向的位置 symbolic link的名字」,


ln -s /Users/EragonJ/Sites/RoR/abc/public/ abc
view raw gistfile1.sh hosted with ❤ by GitHub

OK,設定好我們的Link後,再來就是要修改一下原先的conf檔(依照上面那個Gist的註解來做修改),那個RailsBaseURI就是我們 「http://localhost/xxxx」的「xxxx」,也就是原本想要實作的Sub URI,只要透過Directory內的Symbolic Link 去幫我們指向到我們的「test/public」,就可以了。

以上是我在玩Passenger的一些小心得,如果有什麼錯誤的地方麻煩留言指正,而更進階的玩法就麻煩參照官網上的資料囉.
----------------------------------------
 * To install Curl development headers with SSL support:
   Please run apt-get install libcurl4-openssl-dev or libcurl4-gnutls-dev, whichever you prefer.

If the aforementioned instructions didn't solve your problem, then please take
a look at the Users Guide:

  /usr/local/ruby/lib/ruby/gems/2.0.0/gems/passenger-4.0.29/doc/Users guide Apache.html
  http://www.modrails.com/documentation/Users%20guide%20Apache.html


Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/local/ruby/lib/ruby/gems/2.0.0/gems/passenger-4.0.29/buildout/apache2/mod_passenger.so
   PassengerRoot /usr/local/ruby/lib/ruby/gems/2.0.0/gems/passenger-4.0.29
   PassengerDefaultRuby /usr/local/ruby/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!


Deploying a Ruby on Rails application: an example

Suppose you have a Rails application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /usr/local/ruby/lib/ruby/gems/2.0.0/gems/passenger-4.0.29/doc/Users guide Apache.html
  http://www.modrails.com/documentation/Users%20guide%20Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
https://www.phusionpassenger.com

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.