Ruby on Rails を Apache2で使う
DebianのsidでRuby on Rails と Apache2 の連携を設定してみてうまくいったのでメモ。Ruby と Rails はインストール済の前提。
連携するRailsのアプリのパスを $RAILS_HOMEにしてます。設定ファイル内では自分の環境に合わせて展開してください。
Fast CGIのインストール
Apache で Ruby 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 とは違うのではまりやすいところ。
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