FastCGI でRedmineが実用レベルになった

Debian(lenny)での情報。

自分アプリのバグをtracで管理していて、その後redmineに移行しようと思ったもののredmineが重くてやる気にならず、オープンソースならgithubでチケットを管理するという方針にしたものの、オープンソースじゃないアプリやタスクをプライベートにしたい場合にやっぱりredmineが使いたくなった。

最新版のredmineなら速くなってるんじゃないかというのも期待して最新版にしてみることに。インストール済みなのは0.8でこの時点では1.0がリリースされている。1.0なら速いはずだ。

1. バックアップ

プログラムは別ディレクトリにいれるのでデータベースだけバックアップ。
http://www.redmine.org/wiki/redmine/RedmineUpgradeには
/usr/bin/mysqldump -u <username> -p<password> <redmine_database> | gzip > /path/to/backup/db/redmine_`date +%y_%m_%d`.gz
とあるが、普通にdumpする。

mysqldump -u root -p redmine > /tmp/redmine.dump.sql

2. Rubyモジュールの更新

redmine 0.8->1.0においてrubyは1.8.xのままでいいので、rails, rackを更新。apacheで動かすのでmod_railsことpassengerも更新しておく。一応rakeも。

rails (2.1.2) -> 2.3.5
rake (0.8.5) -> 0.8.7
passenger (2.2.2) -> 3.0.2

gem install rails -v=2.3.5
gem install rack -v=1.0.1
gem update rake passenger

2.1 passengerの設定

最終的にfastcgiを使ったのでpassengerはなくてもよい

passengerをapacheに組み込む。
/var/lib/gems/1.8/bin/passenger-install-apache2-module

The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-3.0.2/ext/apache2/mod_passenger.so
   PassengerRoot /var/lib/gems/1.8/gems/passenger-3.0.2
   PassengerRuby /usr/bin/ruby1.8

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Deploying a Ruby on Rails application: an example

Suppose you have a Rails application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      DocumentRoot /somewhere/public    # <-- be sure to point to 'public'!
      <Directory /somewhere/public>
         AllowOverride all              # <-- relax Apache security settings
         Options -MultiViews            # <-- MultiViews must be turned off
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /var/lib/gems/1.8/gems/passenger-3.0.2/doc/Users guide Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
http://www.modrails.com/

という感じ。debianのapacheの管理方法に基づき、passengerモジュールの設定を入れる。

vi /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-3.0.2/ext/apache2/mod_passenger.so

vi /etc/apache2/mods-available/passenger.conf

<IfModule passenger_module>
   PassengerRoot /var/lib/gems/1.8/gems/passenger-3.0.2
   PassengerRuby /usr/bin/ruby1.8
</IfModule>

をそれぞれ入力。

以下のコマンドでこの作った設定ファイルを有効にする。

a2enmod passenger
/etc/init.d/apache2 restart

3. remine-1.0を入れる

常に最新版を入れたいのでsubvresionで入れる。

cd /path/to/ror-apps/
svn co http://redmine.rubyforge.org/svn/branches/1.0-stable redmine-1.0

0.8の設定をコピー。新規の場合は.sampleをコピーしてつくる。

cp redmine-0.8/config/database.yml redmine-1.0/config/database.yml
cp -p redmine-0.8/public/dispatch.cgi redmine-1.0/public/dispatch.cgi

あとはhttp://www.redmine.org/wiki/redmine/RedmineInstallにしたがってすすめる。

rake generate_session_storeはi18nモジュールがなくて怒られたので

cd redmine-1.0
gem install -v=0.4.2 i18n
rake generate_session_store

RAILS_ENV=production rake db:migrateはmysqlモジュールがないといって怒られたので

gem install mysql
RAILS_ENV=production rake db:migrate

デフォルトデータ

RAILS_ENV=production rake redmine:load_default_data

でjaを選択。

apacheから書き込めるようにしておく

mkdir tmp public/plugin_assets
chown -R www-data:www-data files log tmp public/plugin_assets
chmod -R 755 files log tmp public/plugin_assets

vhostの設定で

Alias /redmine "/path/to/ror-apps/redmine-0.8/public"
Alias /redmine "/path/to/ror-apps/redmine-1.0/public"に更新。

passengerをいれたときにMultiViewsを無効にしとけと言われたので

public/.htaccess
#Options +FollowSymLinks +ExecCGI
Options +FollowSymLinks +ExecCGI -MultiViews

とする。

さらにRewriteBase /redmineを入れる。

config/environment.rb
ENV['RAILS_ENV'] ||= 'production'

のコメントを外しておく。

config/additional_environment.rb
config.action_controller.relative_url_root='/redmine'

を書く。

4. cgiで動かない件

apache以前にスクリプトが動かない。

public/dispatch.cgi
/var/lib/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/cgi_process.rb:22:in `__send__': undefined method `env_table' for nil:NilClass (NoMethodError)
        from /var/lib/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/cgi_process.rb:22:in `dispatch_cgi'
        from /var/lib/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:101:in `dispatch_cgi'
        from /var/lib/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:27:in `dispatch'
        from public/dispatch.cgi:10

Rails 2.3.2, Apache2 and CGI not working
http://www.ruby-forum.com/topic/182327

undefined method `env_table’ for nil:NilClass (NoMethodError) with rev 3335
http://www.redmine.org/issues/4610

あたりに報告があるけど解決されてない模様。回避策としてFastCGI使えば?という感じなので仕方なく従うことに。

5. FastCGIでrubyを動かす

これもhttp://www.redmine.org/wiki/1/HowTo_configure_Apache_to_run_Redmineに情報がある。

aptitude search fastcgilibapache2-mod-fastcgiを確認。

aptitude install libapache2-mod-fastcgi 
/etc/init.d/apache2 restart

特に依存モジュールでfcgiが入らなかったのでおとなしくソースから入れる。

cd /usr/local/src/
wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
tar -zxvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure
make
make install

最後に以下を実行。

gem install fcgi

dispatch.fcgiはそのままサンプルのを使う。
cp -p public/dispatch.fcgi.example public/dispatch.fcgi

dispatch.fcgiを確実に参照させるように。

public/.htaccess
#<IfModule mod_fastcgi.c>
#       RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
#</IfModule>
#<IfModule mod_fcgid.c>
#       RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
#</IfModule>
#<IfModule mod_cgi.c>
#       RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
#</IfModule>
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

これでtrac並のレスポンスが得られるようになった。www.redmine.org 自体もFastCGIを使ってるらしいし、おとなしくFastCGIを使うのがよさげ。