それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rack(sinatra)をPassengerでuser_dirのパスで起動する

そうだ久しぶりに 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/

https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html#_deploying_a_rack_based_ruby_application

http://www.sinatrarb.com/intro.html

http://www.rokurofire.info/2013/11/20/sinatra_builtenv/