Ruby on Rails を Apache2で使う

DebianのsidでRuby on Rails と Apache2 の連携を設定してみてうまくいったのでメモ。RubyRails はインストール済の前提。

連携するRailsのアプリのパスを $RAILS_HOMEにしてます。設定ファイル内では自分の環境に合わせて展開してください。

Fast CGIのインストール

ApacheRuby on Rails を使う時には Fast CGI が必要。でもDebianでは fastcgi はなくて、fcgid というパッケージになってます。

$ sudo apt-get install libfcgi-ruby1.8 libapache2-mod-fcgid

httpd.confの設定

無事にインストールできたら /etc/apache2/site-available の下にある httpd.conf に以下の記述を追加。

Alias /cookbook/ "$RAILS_HOME/public"
Alias /cookbook "$RAILS_HOMEpublic"

<Directory $RAILS_HOME/public/>
    Options ExecCGI FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>

細かい設定は臨機応変に。

.htaccessの設定

$RAILS_HOME/public に .htaccess ファイルがあるので、以下のように修正します。

$ diff -u .htaccess.org .htaccess
--- .htaccess.org       2006-03-01 19:11:40.000000000 +0900
+++ .htaccess   2006-03-01 20:00:58.000000000 +0900
@@ -1,5 +1,5 @@
 # General Apache options
-AddHandler fastcgi-script .fcgi
+AddHandler fcgid-script .fcgi
 AddHandler cgi-script .cgi
 Options +FollowSymLinks +ExecCGI

@@ -25,11 +25,12 @@
 # Example:
 #   Alias /myrailsapp /path/to/myrailsapp/public
 #   RewriteBase /myrailsapp
+RewriteBase /cookbook/

 RewriteRule ^$ index.html [QSA]
 RewriteRule ^([^.]+)$ $1.html [QSA]
 RewriteCond %{REQUEST_FILENAME} !-f
-RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
+RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
 
 # In case Rails experiences terminal errors
 # Instead of displaying this message you can supply a file here which will be rendered instead

「RewriteBase /cookbook/ 」は「RewriteEngine ON」の後に書くこと。あと、cookbook は自分のアプリ名に変更しましょう。

fcgid.conf の修正

/etc/apache2/mods-available/fcgid.conf に以下の設定を追加します。

IPCCommTimeout 40
IPCConnectTimeout 10
DefaultInitEnv  RAILS_ENV production

ここの設定が Fast CGI とは違うのではまりやすいところ。

rewriteモジュールを有効化

rewriteモジュールを有効化します。

 # a2enmod rewrite

apacheの再起動

これで設定は完了。あとはapacheを再起動して確認だ。

 # /etc/init.d/apache2 restart

初回はdispacher.fcgiを起動させるのに若干時間がかかりますが、その後はさくさく動きます。

dispacher.fcgiがたくさん起動しすぎるという時は、fcgid.confに「DefaultMaxClassProcessCount xxx」で最大プロセス数を設定できます。他にも設定項目がたくさんあるのでいろいろとチューニングはできそうです。

Rubyでメール送信

IDDヲヤレルノ.DOC - wemaにメール通知機能を追加
Rubyには標準でSMTPを扱うライブラリがついてるので、それを使う方がよさげ。

require 'net/smtp'

def send_mail
  mail = Kconv.tojis <<EOS
From: foo@bar.com
To: baz@zoo.com
Content-Type: text/plain; charset=iso-2022-jp
MIME-Version: 1.0
Subject: 書き込みがありました。

書き込みがありました。
-----------
#{@source}
-----------
EOS
  Net::SMTP.start('smtp.server', 25) { |smtp|
    smtp.send_mail(mail, 'from_address@mail.address', 'to_address@some.domain')
  }
end