woshidan's blog

あいとゆうきとITと、とっておきの話。

PhusionPassengerモジュールをインストール

WEBrickの話調べてるうちに用語が頭に少し馴染んできて、新鮮みが失せてきて、時間予想以上に食うし嫌になってきました。
明日朝までに終わらせたいですね。

次は、Railsを動かすためのApacheのモジュールPhusion Passengerを入れます。
Railsを動かすため、と書いていますが、Ruby,node.js,Pythnで書かれたコードに対してApacheをWEBサーバ・アプリケーションサーバとして動かすためのモジュールらしいです。
(と、公式に書いてありました)

 

あとはRailscapistranoです。

 

そういえばGithubのGistのlanguageにApacheConfってあるんですね。

少し古いのですが、
http://redmine.jp/tech_note/apache-passenger/
を参考にしながら作業していました。いちおう、公式のgithub見に行ってもコマンドに違いが無くてよかったです。

 

内容

  • Phusion Passengerとは
    • Apacheが動いているのにWEBrickも動かしちゃった時のassetsの話
  • インストールコマンド
  • 大元のApacheの設定ファイルの変更
    • Passengerを使えるようにする
    • VirtualHostを使えるようにする
      • VirtualHostで公開するドキュメントを入れるディレクトリを用意する
      • (ついでに)Apacheを動作させるユーザをデプロイ作業をするユーザに設定
  • VirtualHostの設定ファイル
    • <virtualhost *:80>
    • ServerName www.app.com
    • DocumentRoot /var/www/app_name/current/public
    • RailsEnv production
    • PassengerEnabled on
    • <Directory /var/www/app_name/current/public>
    • AllowOverride all
    • Options -MultiViews
  • シンボリックリンクの設定について

 

Phusion Passengerとは

Railsアプリケーションを実行するためのApacheモジュールです。
Phusion社が開発。スタンドアロン版もあって、もう訳が分からないです(おい)。

rubyのプログラムなのでApacheに組み込む前にgemの形でCentOSにインストールします。

 

Apacheが動いているのにWEBrickも動かしちゃった時のassetsの話

Apache+Phusion PassengerでRailsを動かしている横で、WEBrickでも立ち上げてしまった時、少し面白いな、と思って後から調べてみたのですが、

urlはどこから来るの? みたいな話になりかけてぐだりました。
http://woshidan.hatenablog.com/entry/2014/12/29/062635
http://woshidan.hatenablog.com/entry/2014/12/31/215914

 

インストールコマンド

結構http://redmine.jp/tech_note/apache-passenger/のまんまです。

もう一度になりますが、passengerはrubyで書かれていてるのでgemでインストールします。

 

Apacheモジュールのビルドとインストールを行います。このコマンドを打ち込むと、対話式で処理が進んでいきます。
全体の処理は、

  • 必要なソフトウェアの存在チェック
  • モジュールのビルドおよびインストール
  • httpd.confの設定方法の表示

の順に進みます。
はじめのほうで、
Which languages are you interested in?
と聞かれたので今回はRubyだけ選択しました。

 

その後、

そして、もう一度、

を実行すると、

とPassengerを使うための処理がほとんど終了したことと、Passengerのmoduleを使うためにApacheの設定ファイルのhttpd.confに追加する必要があるファイルが表示されます。

 

大元のApacheの設定ファイルの変更

の内容の追加とhttp://redmine.jp/tech_note/apache-passenger/の下の方にVirtualHostを使うように書いてあったので、VirtualHostを使うための設定をします。

 

Passengerを使えるようにする

/etc/httpd/conf/httpd.confに上記内容を追加すればよいです。

一応ディレクティブについて補足します。

LoadModuleディレクティブ

事前にインストールした静的モジュールのファイルをApache起動時に組み込むように設定します。
モジュールファイルのインストール先のパスには、/から始まる絶対パスか、ServerRootから指定したディレクトリからの相対パスを使用します。
今回は絶対パスを使用しています。

LoadModule モジュール識別子 モジュールファイル

の形で記述します。

IfModuleディレクティブ

インストールされている拡張モジュールを使う設定を書いていたとして、
そのモジュールのインストールに失敗していた場合、その部分の設定はApacheの起動時のエラーの原因になります。
なので、 拡張モジュールの設定はIfModuleディレクティブ内に書いて、
それらの設定がモジュールがインストールされている場合のみ有効になるようにします。

VirtualHostを使えるようにする

参考:http://dotinstall.com/lessons/basic_sakura_vps/8013
NameVirtualHostのところのコメントアウトを外します。
あと、今回は、元のホストの設定と区別するため、別のファイルにバーチャルホスト用のconfファイルを用意します。
ファイルの内容は後で確認するとして、そのディレクトリの場所が/etc/httpd/conf/httpd.confの以下の場所に書かれていることを確認しておきます。

VirtualHostで公開するドキュメントを入れるディレクトリを用意する

VirtualHostで公開するドキュメントを入れるディレクトリとして、/var/www/app_nameディレクトリを用意します。
どっとインストールでは、ここで、chownでログイン中のユーザを上記ディレクトリの所有者に設定しているのですが、たぶんテスト用のhtmlファイルをsudo使わずに書きたいだけだと思うので、VirtualHostの使用だけなら用意するだけでいい気がします。

まあ、普通はデプロイ作業のどこかで絶対必要になるので、ここで設定します。

chown -R デプロイ作業用ユーザのname:デプロイ作業用ユーザのgroup /var/www/app_name

デプロイ作業用ユーザのものにしておかないと、アクセス権減の設定が777でもない限り、capistranoがPermission Deninedとエラーをはいて止まります。

(ついでに)Apacheを動作させるユーザをデプロイ作業をするユーザに設定

そして、ついでにですね、httpd.confのapacheのユーザもいまさっき指定してきたユーザに変更します。

そうしておかないと公開対象のディレクトリにたいし、

  • apache(Passengerを通してRails)を操作するユーザ
  • deployで書き込むユーザ

の両方に書き込み・実行権限を与える必要があるからです。
つまり、ディレクトリを所有していない一般ユーザ・あるいは同一グループの関係ないユーザにも権限を与える必要になることになるので怖いです。

capistranoも警告はいてきます。

 

後で戻ってくるより、いまここで変えておきます。私は警告を見てから戻ったんですけどね。
/etc/httpd/conf/httpd.confの以下の箇所を編集します。

保存して、

で、設定の変更を反映しておきます。

最後に 

とします。

VirtualHostの設定ファイル

/etc/httpd/conf.d以下に作成します。名前は何でもいいので、
/etc/httpd/conf.d/my_app.confあたりにします。

設定内容はこんな感じです。

以下、各項目について補足を行います。

<VirtualHost *:80>

ここの設定は/etc/httpd/conf/httpd.confでコメントを外したNameVirtualHostディレクティブの引数と同じにする必要があります。

また、VirtualHostを1つでも設定した時点で元のホストは使用されなくなるので、
元のホストは元のホストとして動作して欲しい場合は、元のホストとして動作するVirtualHostを別に用意する必要があります。
http://httpd.apache.org/docs/2.2/ja/vhosts/name-based.html
のメインホストは無くなります、の部分から。

ServerName www.app.com

ServerName ディレクティブは、サーバが自分自身を示すスキーム名、ホスト名とポート番号を設定します。
これは、リダイレクトするURLを生成する際に利用されます。

ServerNameは何を設定しても関係ない、と言われることがありますが、

1つのApacheが,1つのWebサイトしか
公開していないなら,
ServerNameに記述されているURLとは異なるURLで
要求されたときであっても,1つのWebサイトの
ドキュメントを送信してしまいます。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1430082724

知恵袋だけではあれだったので、http://httpd.apache.org/docs/current/ja/vhosts/details.htmlより、

The first name-based vhost in the configuration file for a given IP:port pair is significant because it is used for all requests received on that address and port for which no other vhost for that IP:port pair has a matching ServerName or ServerAlias. It is also used for all SSL connections if the server does not support Server Name Indication.

これですかね。英語力が無いので、一番はじめの奴が他に条件に合うVirtualHostが無かったときに使われるので重要(一部訳)と書いてあるふうに見えます。

まあ、そういうことがあるそうです。
なので、今回のように1つのWebサイトしか設定していない場合はたしかに関係ないのかもしれません。

あと、その場合(どうも、その場合に限らない?)、クライアント側からリクエストされた形で
リダイレクトするURLを生成するのに使われるホスト名が決定されているみたいです。
http://httpd.apache.org/docs/current/ja/vhosts/details.html 

DocumentRoot /var/www/app_name/current/public

これはこのVirtualHostのドキュメントルートです。ドキュメントルート自体については前記事(http://woshidan.hatenablog.com/entry/2015/01/01/022640)をみてください。

ドキュメントルートに指定しているディレクトリの位置についてですが、これはPhusionPassengerで動かすホストなので、Railsプロジェクト内のpublicディレクトリを指定する必要があります。
currentというのがぱっと見分かりにくいですね。これはデプロイに使っているcapistranoの設定で、capistranoでデプロイを行ったときのディレクトリ構成が、

となっているのが原因です。

RailsEnv production

passenger経由でRailsを起動する時、どの環境で立ち上げるかの設定です。
development環境で立ち上げたい時はRailsEnv development
と設定したらよいです。

PassengerEnabled on

offにするとPassengerを使わず、このVirtualHostではApacheのみが動作することになります。
http://redmine.jp/tech_note/passenger-options/

<Directory /var/www/app_name/current/public>

Directoryディレクティブは引数に与えたディレクトリの設定をする、という意味です。

AllowOverride all

.htaccessファイルを見つけた場合、そのファイル中に書かれたどのディレクティブを見つけた場合、それより前に見つけていた設定を上書きするのか、どうかの設定です。
というと分かりにくいのですが。.htaccessファイルにそもそも<>無い場合あるし。
.htaccessについて詳しい話はhttp://htaccess.cman.jp/sense/とか他にいろいろあると思うので今度にします。


サーバがファイルシステムの中のファイルを読んでいくとき、木構造の上のほうから読んでいきます。
たとえば

みたいな構造のディレクトリを用意していたとして、parentディレクトリとchild1ディレクトリに.htaccessファイルをおいていたとします。
そうすると、parentディレクトリの.htaccess=>child1ディレクトリの.htaccessの順に読まれるのですが、
2つの.htaccessの内容が違ったときにchild1ディレクトリの.htaccess内容で上書きするか、ということ。
特定のDirectiveを指定するとそのDirectiveの中身だけを上書きし、
Noneで.htaccessファイルの内容をすべて無視、
Allでは.htaccessを見つけるたびに上書きする、という感じ。デフォルト値はallです。

Options -MultiViews

Options MultiViewsだとサーバが/some/dir/fooディレクトリへのリクエストを受け取ったとき、fooディレクトリが無いとfooがつくファイルを探して、それが/some/dir/fooディレクトリへのリクエストに対応するように、事実上それらのファイルをマップするタイプマップを作って、クライアントのリクエストについているファイルタイプ等をもとに出し分けるようにします。
今回はオフにします。
http://httpd.apache.org/docs/current/content-negotiation.html

 

シンボリックリンクの設定について

そういえば、前回の記事でシンボリックリンクが云々って書いていますが、
バーチャルホストのドキュメントルートに指定しているディレクトリに対しては無効にしていません。


忘れてました


というのは半分冗談で、Railsが動作しているcurrentというパスはディレクトリじゃなくて、releases内で一番あたらしいコードがはいっているディレクトリへのシンボリックリンクになっていまして、
これをOffにするとcapistranoでデプロイし直すたびに日付の識別子がついた最新版のコードのディレクトリに
ドキュメントルートを設定し直す必要がありますので、今回はoffにしませんでした……。