さくらインターネットでRedmineを高速化するメモ

※2009/11/11 追記あり



アドバイスいただいたのでさっそく適用してみました。
例によっていろんなところに似たような記事がありますが、
さくらサーバのOSアップデートのせいか知りませんが
参考記事そのままだと動かなかったりしたのでやっぱりメモ。


gateway.cgiで動かすとさくらサーバの規約違反にもならず、高速化も望めるようです。*1

環境

redmine 0.8.5
ruby 1.8.7(さくらデフォルト)
rubygems 1.3.1
rails 2.1.2
mysql(さくらで提供されているmysql
rails 2.1.2
fcgi 2.4.0


前回とほぼ同じ。fcgiが増えました。

やるべきことの概要

  • fcgiインストール
  • fcgi用のログディレクトリ作成
  • パッチを当てる
  • relative_url_root の設定

fcgiインストール

ダウンロードしてmake installです。

wget http://fastcgi.com/dist/fcgi-2.4.0.tar.gz
tar zxvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure --prefix=$HOME/local
make
make install

gemでfcgiのインストール。
ちなみにRB_USER_INSTALLはさくらでgem使うときには必ず設定しておいた方が良さげ。

export RB_USER_INSTALL=true
gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib


以後、Railsルートで作業します。

fcgi用のログディレクトリ作成

cd (Railsルート)
mkdir log/drb_gateway
chmod 777 log/drb_gateway

gateway.cgi関連のスクリプトコピー

自分が使ったRedminerails込パッケージなので、
今回はそのパッケージから必要なものを使うことにします。
コピー元はgemのrailsでもOKです。

cp vendor/rails/railties/dispatches/gateway.cgi public/
cp vendor/rails/railties/lib/commands/ncgi/listener script/
cp vendor/rails/railties/lib/commands/ncgi/tracker script/

public/gateway.cgiのパッチ

上の方に以下を追加。

ENV['RAILS_ENV']||='production'

sleepを0.5→1秒に増加。

  10.times do
    sleep 1
    break if (ready = File.exist?(TrackerSocket) && File.exist?(listener_socket(0)))
  end

script/listenerのパッチ

vi script/listener

require 'fcgi_handler'の直前に以下を追加。

require 'rubygems'
gem 'fcgi'

initializeファンクションの
self.stdoutput = output || StringIO.new
直後に以下を追加。

$stdin = self.stdinput
$stdout = self.stdoutput

config/routes.rbに relative_url_root を追加

URL上のRailsルートパスを指定する必要があります。
たとえば、
http://toritori0318.sakura.ne.jp/redmine/
であれば「/redmine」を指定します。

ActionController::Routing::Routes.draw do |map|
ActionController::AbstractRequest.relative_url_root = "/redmine"

確認

http://toritori0318.sakura.ne.jp/redmine/


以上でOKです。
体感では、初回はそこそこ遅いですが
2回目以降はかなりさくさく動いてくれます!やほーい

注意点

おそらく、rubyを独自にインストールしている方は、スクリプトrubyパスも変える必要があります。

ハマりどころ

一度アクセスした後でスクリプト更新してすぐにアクセスしても、
しばらくは更新前のスクリプトが残っていたりして、
更新が即時反映されない場合がありました。
その場合は3分くらい待ってから再度アクセスしてみましょう。*2

2009/11/5 追記

最初のアクセスで「Application error」が発生することが多いですね。
更新すると普通に使えるのでいいんですけど…

*1:90秒間常駐型?

*2:これクリアする方法あると思いますけど、知りません><