そうだ久しぶりに Passenger 使おう
WEBアプリをアレコレ作ってると、cgiでも良いんだけど、たまにはPassenger使ってもいいんじゃないかと思いました。
Passenger を OSX で使う
Passengerはapacheモジュールとして、内部的にリクエストを取得して指定したアプリを起動してうんぬん。してくれるので、一度設定しておくと後々にらくできる。
brew info passenger
passenger のインストールは次の通り、load_module を書けと
takuya@rena:~/Desktop$ brew info passenger (中略 To activate Phusion Passenger for Apache, create /etc/apache2/other/passenger.conf: LoadModule passenger_module /usr/local/opt/passenger/libexec/buildout/apache2/mod_passenger.so PassengerRoot /usr/local/opt/passenger/libexec/lib/phusion_passenger/locations.ini PassengerDefaultRuby /usr/bin/ruby
最近のbrew は /usr/local/opt 使う感じですね。
インストール
brew install passenger
設定
ファイルができてることを確認
takuya@rena:~/Desktop$ ls -l /usr/local/opt/passenger/libexec/buildout/apache2/mod_passenger.so -rwxr-xr-x 1 takuya staff 2393236 5 20 19:58 /usr/local/opt/passenger/libexec/buildout/apache2/mod_passenger.so
ls -l /usr/local/opt/passenger/libexec/lib/phusion_passenger/locations.ini
Apacheの設定にも
takuya@rena:~/Desktop$ cat /etc/apache2/other/passenger.conf LoadModule passenger_module /usr/local/opt/passenger/libexec/buildout/apache2/mod_passenger.so PassengerRoot /usr/local/opt/passenger/libexec/lib/phusion_passenger/locations.ini PassengerDefaultRuby /usr/bin/ruby PassengerEnabled on
ちなみに/etc/apache2/other に置かれたファイルはhttpd.confでロード設定が書かれている。
takuya@rena:~/Desktop$ cat /etc/apache2/httpd.conf | grep Include | grep other 15:529:Include /private/etc/apache2/other/*.conf
これらが出来たらApache再起動
$sudo apachectl stop $sudo apachectl start
これでPassengerの準備完了
takuya@rena:~/Desktop$ pstree (ry |-+= 12468 root /usr/sbin/httpd -D FOREGROUND | |-+= 12489 root PassengerAgent watchdog | | |--= 12491 root PassengerAgent server | | \--= 12493 nobody PassengerAgent logger | |--- 12495 _www /usr/sbin/httpd -D FOREGROUND | \--- 15409 _www /usr/sbin/httpd -D FOREGROUND (ry
Passengerが起動したら、httpd の子プロセスとして上がってくるのでチェックしておく。
プロセスツリーをコマンドから確認するには
brew install pstree
rack アプリを準備する。
ユーザーのWEB公開ディレクトリに、Rackアプリを作る。今回はSinatraを突っ込む。
場所の作成
$mkdir ~/Sites/example $cd ~/Sites/example
念のため、userdir にアクセスしておく
$ cd ~/Sites/example $ cat - > index.html <html><body>Hello example</body></html> ^D $ curl -I http://localhost/~takuya/example/ HTTP/1.1 200 OK Date: Fri, 05 Jun 2015 14:05:25 GMT Server: Apache/2.4.10 (Unix) PHP/5.5.20 Phusion_Passenger/5.0.8 Last-Modified: Fri, 05 Jun 2015 14:04:54 GMT ETag: "28-517c5c6bfad80" Accept-Ranges: bytes Content-Length: 40 Content-Type: text/html
~/Sites/example にbundlerで sinatra を準備する。
Apacheがmod_userdir で反応してることを確認したら、rackアプリケーションを準備する。
$ cd ~/Sites/example $ bundle init $ cat - > Gemfile source "https://rubygems.org" gem "sinatra" ^D $ bundle install
これで、bundle の準備完了。--path はデフォルト。変更したら動かなかった(要:追調査)
rack アプリケーションを作って起動を確認
main.rb というSinatraクラスを作って
$ cat -> main.rb # mainApp # require 'bundler' require 'sinatra/base' class MyMain < Sinatra::Base get "/" do "Hello Sinatra World" end end
config.ru という rackup 用の設定を作って
$ cat -> config.ru # configuration for rack up # require './main.rb' run MyMain
記述が間違ってないか確認しつつ、Rackupで起動するか確認
Syntaxチェック
$ bundle exec ruby -c main.rb Syntax OK $ bundle exec ruby -c config.ru Syntax OK
起動チェック&& アクセスチェック
$ bundle exec rackup [2015-06-05 23:12:48] INFO WEBrick 1.3.1 [2015-06-05 23:12:48] INFO ruby 2.1.1 (2014-02-24) [x86_64-darwin14.0] [2015-06-05 23:12:48] INFO WEBrick::HTTPServer#start: pid=41407 port=9292 ::1 - - [05/Jun/2015:23:13:08 +0900] "GET / HTTP/1.1" 200 19 0.0207
takuya@rena:~/Sites$ curl http://localhost:9292/
Hello Sinatra World
ここまでで、RackUp でMyMain のAPP が起動できた。
最後に、Passenger から Rackupする。
公開用ディレクトリを作っておく
$ cd ~/Sites/example $ mkdir public
ユーザーディレクトリで、Passengerが起動するように設定
ユーザーごとの設定は/etc/apache2/users/に書くのがルールで、ここはvirtualhostにはなく、メインのサイトとしてロードされる。
/etc/apache2/users/takuya.conf
<Directory "/Users/takuya/Sites/"> (略 </Directory> PassengerEnabled on Alias /~takuya/example /Users/takuya/Sites/example/public <Location /~takuya/example> PassengerAppRoot /Users/takuya/Sites/example PassengerBaseURI /~takuya/example </Location> <Directory /Users/takuya/Sites/example/public> Allow from all Require all granted Options -MultiViews </Directory>
設定としては
/~takuya/example を /Users/takuya/Sites/example/public に貼り直し
/Users/takuya/Sites/example/public の設定を書く
リクエストPATHが/~takuya/exampleのときにPassengerに渡すように書く。
再起動
$ sudo apachectl restart
起動チェック
takuya@rena:~$ curl http://localhost/~takuya/example Hello Sinatra World
これで、無事に、RackupアプリケーションをApache+Passengerでmod_userdir 環境中で、Location設定ができた。
自動再ロード
このままだと、リロードしないので、自動再ロードをして、Try&Errorを出来るようにする。
自動再ロードのディレクトリを作成する
$cd ~/Sites/example $ mkdir tmp $ touch tmp/always_restart.txt # このファイルが在るとPassenger がAppを自動再ロードする。 $ sudo apachectl reload # restart が作られた状態を反映する
実際にファイルを変えてみる
# mainApp # require 'bundler' require 'sinatra/base' class MyMain < Sinatra::Base get "/" do "Hello Sinatra World" end ## 追記 get "/takuya" do "Hello takuya" end end
すかさずアクセスする
takuya@rena:~$ curl http://localhost/~takuya/example/takuya Hello takuya
これで、Rackのアプリケーションを楽チンに実験できるようになった。
参考資料
http://blog.nzakr.com/mac-apache/