Apacheで名前ベースのバーチャルホストを定義する

環境
CentOS 5.5
Apache 2.2.3
Phusion Passenger 2.2.15
Ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux]

応答するバーチャルホストを識別する方法によって、バーチャルホストには名前ベースとIPベースの二種類があります。
名前ベースのバーチャルホストは、クライアントがHTTPヘッダの一部として告げたホスト名によってバーチャルホストへのコネクションを決定します。ひとつのIPアドレスを異なる多数のホストで共有することにより、名前ベースのバーチャルホストは不足するIPアドレスの需要を緩和します。したがって、通常は名前ベースのバーチャルホストを使うべきでしょう。
IPベースのバーチャルホストは、IPアドレスによってバーチャルホストへのコネクションを決定します。このため、それぞれのホストに固有のIPアドレスが必要になります。IPベースのバーチャルホストを選択する理由としては、SSLセキュアサーバを構築したい場合や、名前ベースのバーチャルホストに対応していない特殊なクライアントを使いたい場合などが考えられます。

# vim /var/named/mydomain.com.db
production.myapp        IN A            202.212.222.232
staging.myapp           IN A            202.212.222.232
myapp                   IN CNAME        production.myapp

ゾーンファイルに新しいドメイン名を定義します。

# /sbin/service named reload

ゾーンファイルの変更を反映します。

# mkdir /etc/httpd/application
# vim /etc/httpd/conf/httpd.conf
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
#
# NOTE: NameVirtualHost cannot be used without a port specifier 
# (e.g. :80) if mod_ssl is being used, due to the nature of the
# SSL protocol.
#

NameVirtualHostディレクティブを設定します。

#
# Load config files from the config directory "/etc/httpd/conf.d".
#
Include conf.d/*.conf
Include application/*.conf

自分用の設定ファイルは専用のディレクトリに置くため、既存のIncludeステートメントに続けてapplication/*.confをインクルードします。

# vim /etc/httpd/application/myapp.conf
<VirtualHost *:80>
  ServerAdmin mail@mydomain.com

  ServerName production.myapp.mydomain.com
  ServerAlias .myapp.mydomain.com
  DocumentRoot /var/www/myapp/production/current/public
  RailsEnv production

  ErrorLog /var/log/httpd/myapp.error_log
  TransferLog /var/log/httpd/myapp.access_log

  <Directory /var/www/myapp/production/current/public>
    Order Allow,Deny
    Allow from all
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  ServerAdmin mail@mydomain.com

  ServerName staging.myapp.mydomain.com
  DocumentRoot /var/www/myapp/staging/current/public
  RailsEnv staging

  ErrorLog /var/log/httpd/myapp.staging.error_log
  TransferLog /var/log/httpd/myapp.staging.access_log

  <Directory /var/www/myapp/staging/current/public>
    Order Allow,Deny
    Allow from all
  </Directory>
</VirtualHost>

バーチャルホストの定義ファイルを作成します。

# mkdir /var/www/myapp
# chown myuser:myuser /var/www/myapp

$RAILS_ROOTとなるディレクトリを作成し、それ以下のファイルとディレクトリのオーナーをroot以外にします。ここではユーザー"myuser"にしています。

Passengerでは、root権限でRailsアプリケーションを動かすことはできません。Railsアプリケーションが動作するユーザーは$RAILS_ROOT/config/environment.rbのオーナーとなりますが、environment.rbがrootの場合はnobodyユーザーで動作します。このとき、オーナーがrootである$RAILS_ROOT/logディレクトリや$RAILS_ROOT/tmpディレクトリに書き込みができず、アプリケーションが動作しないことがあります。

http://redmine.jp/tech_note/apache-passenger/