アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

さくらのVPS を使いはじめる 7 - Ruby EE、Passenger、Redmine

さくらのVPS への作業メモ 7。今回は Redmine のインストールをおこなう。

ただし前回で入れた Ruby 1.9.1 だとデータベースに初期設定をおこなうところでエラーになるという致命的な問題が起きるので、1.9.1 を消して Ruby Enterprise Edition を入れ直す。実にひどい問題だと思うのだが、直る見込みはなさそうなので受け容れることにする。

ソースからコンパイルした Ruby のアンインストール

Ruby を標準で make install すると /usr/local/bin にインストールされるので中身を表示してみる。

$cd /usr/local/bin
$ ls -l -a
合計 8544
drwxr-xr-x  2 root root    4096  9月 20 13:08 .
drwxr-xr-x 12 root root    4096  8月 10 15:43 ..
-rwxr-xr-x  1 root root    4399  9月 11 00:21 erb
-rwxr-xr-x  1 root root     548  9月 11 00:21 gem
-rwxr-xr-x  1 root root     320  9月 11 00:21 irb
-rwxr-xr-x  1 root root     397  9月 19 20:50 passenger-config
-rwxr-xr-x  1 root root     413  9月 19 20:50 passenger-install-apache2-module
-rwxr-xr-x  1 root root     411  9月 19 20:50 passenger-install-nginx-module
-rwxr-xr-x  1 root root     407  9月 19 20:50 passenger-make-enterprisey
-rwxr-xr-x  1 root root     403  9月 19 20:50 passenger-memory-stats
-rwxr-xr-x  1 root root     403  9月 19 20:50 passenger-spawn-server
-rwxr-xr-x  1 root root     397  9月 19 20:50 passenger-status
-rwxr-xr-x  1 root root     402  9月 19 20:50 passenger-stress-test
-rwxr-xr-x  1 root root     372  9月 20 13:08 rackup
-rwxr-xr-x  1 root root    1250  9月 11 00:21 rake
-rwxr-xr-x  1 root root     699  9月 11 00:21 rdoc
-rwxr-xr-x  1 root root      75  9月 11 00:21 ri
-rwxr-xr-x  1 root root 8651648  9月 11 00:12 ruby
-rwxr-xr-x  1 root root     249  9月 11 00:21 testrb

きちんとアンインストールしたい場合は以下の方法がよいのだが、

今のところ /usr/local/bin には Ruby 系モジュールしか入っていないようなので中身をすべて消す。

$ sudo rm -rf *

あとソースも消しておく。

$ cd /usr/local/src
$ sudo rm -rf ruby-1.9.2-p0/

さよなら Ruby。

Ruby Enterprise Edition をインストール

Ruby 1.8.7 ベースの最適化バージョンである Ruby Enterprise Edition をインストール。これを利用すると Passenger から Ruby on Rails アプリを実行したときのメモリ使用量が節約されるなどのメリットがあるらしい。どうせ 1.8.7 を入れるなら本家ではなくこちらのほうがよいと思う。

まず公式サイトからインストーラをダウンロード & 展開する。現時点の最新版は 1.8.7-2010.02 のようだ。

$ cd /usr/local/src
$ sudo wget http://rubyforge.org/frs/download.php/71096/ruby-enterprise-1.8.7-2010.02.tar.gz
$ sudo tar xzvf ruby-enterprise-1.8.7-2010.02.tar.gz
$ sudo rm -rf ruby-enterprise-1.8.7-2010.02.tar.gz

展開したらインストールする。ありがたいことに Enterprise Edition はインストーラが付属しているのでそれを実行すればよい。Passenger 制作元だけありインストーラは対話形式で親切だ。

$ sudo ./ruby-enterprise-1.8.7-2010.02/installer --no-dev-docs
... 中略 ...
Press Enter to continue, or Ctrl-C to abort.

Checking for required software...

 * C compiler... found at /usr/bin/gcc
 * C++ compiler... found at /usr/bin/g++
 * The 'make' tool... found at /usr/bin/make
 * The 'patch' tool... found at /usr/bin/patch
 * Zlib development headers... found
 * OpenSSL development headers... found
 * GNU Readline development headers... not found

Some required software is not installed.
But don't worry, this installer will tell you how to install them.
Press Enter to continue, or Ctrl-C to abort.

Passenger の時と同様に足りないものを警告してくれる。Zlib と OpenSSL は前回で入れたのだが新たに GNU Readline development headers が必要とのこと。インストーラを Ctrl + C で抜けて以下のようにインストール。

$ sudo yum -y install readline-devel

不足を補ったので再試行。

$ sudo ./ruby-enterprise-1.8.7-2010.02/installer --no-dev-docs
... 中略 ...
Target directory

Where would you like to install Ruby Enterprise Edition to?
(All Ruby Enterprise Edition files will be put inside that directory.)

 : /usr/local

インストール場所を問い合わせられるので標準の Ruby と同様に /usr/local としておく。パスを入力したら Enter で決定する。インストールが再開されてしばらく待たされる。その際に以下のような警告が表示された。

Warning: some libraries could not be installed
The following gems could not be installed, probably because of an Internet
connection error:

 * sqlite3-ruby
 * pg

These gems are not required, i.e. Ruby Enterprise Edition will work fine without them. But most people use Ruby Enterprise Edition in combination with Phusion Passenger and Ruby on Rails, which do require one or more of the aforementioned gems, so you may want to install them later.

To install the aforementioned gems, please use the following commands:
  * /usr/local/bin/ruby /usr/local/bin/gem install sqlite3-ruby
  * /usr/local/bin/ruby /usr/local/bin/gem install pg

Press ENTER to show the next screen.

Ruby 用 SQLite アダプタなどがネットワークの問題でインストールできませんでした、とのこと。今回は MySQL を利用するので関係なし。後から自前で追加することもできるから必要になったときに入れればよい。というわけで Enter を押して続行。

... 前略 ...
If you have any questions, feel free to visit our website:

  http://www.rubyenterpriseedition.com

Enjoy Ruby Enterprise Edition, a product of Phusion (www.phusion.nl) :-)

無事インストール完了。

  • 余談

    • Ruby Enterprise Edition や Passenger はインストールの最後に :-)という顔文字を表示する
    • これをそのまま WordPress の記事中に貼り付けるとスマイリーアイコンを表示するための img タグに変換される
    • そのため SyntaxHighlighter のショートコード内に書くと「顔文字が img タグに変換 → SyntaxHighlighter がソース部分をプレーンテキストに変換 → ソース中の顔文字が img タグとして表示される」という厄介なことになるので、掲載しているソースの顔文字は括弧を全角にしている。

Passenger と Apache の設定

Passenger から Apache モジュールをインストールする。前回で実行済みなので不足モジュールはなくスムーズに進行した。

$ sudo passenger-install-apache2-module
... 中略 ...
   LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
   PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15
   PassengerRuby /usr/local/bin/ruby
...中略 ...
   <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>
...中略 ...
Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

前回と同様に環境依存の設定項目が表示されるのでメモしておく。LoadModule ~ 部分を Apache の httpd.conf 末尾に書き込むために vi で開く。

$ sudo vi /etc/httpd/conf/httpd.conf

そして以下のように編集する。設定内容が変化しているかもしれないので、前に設定したものが残っていたら消してから記述すること。

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
#<VirtualHost *:80>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>

LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15
PassengerRuby /usr/local/bin/ruby

編集を終えたら保存して、設定の確認と Apache の再起動をおこなう。

  • 追記 2010/10/04

    • apachectl restart よりも service httpd restart の方が Apache の状態を表示する分、望ましいと思うので訂正
$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

Redmine 用データベースとユーザー作成

Redmine 用のデータベースとユーザーを作成する。以下のようにコマンドを実行。IDENTIFIED BY の後にはパスワードとなる文字列を指定する。

$ mysql -u root -p
mysql> CREATE DATABASE redmine DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON redmine.*
    -> TO redmine@localhost IDENTIFIED BY 'XXXXXXXXXXXXXXXX';
Query OK, 0 rows affected (0.00 sec)

注意点として 5 行目のユーザー作成の指定方法がある。@localhost のようにホスト名をつけないと % というワイルド カードとして解釈されてしまう。この状態だとパスワードを正しく入力しても MySQL に接続できず Redmine の初期テーブル生成にも失敗するので必ずホスト名を指定すること。

今回は MySQL と Redmine を同じサーバー上で動かすのでホスト名は localhost となる。

Redmine のインストール

いよいよ Redmine をインストールする。バージョンは 1.0.1 のリリース版を使用。イメージは RubyForge の Redmine プロジェクトに公開されているので最新版の tar.gz を示す URL をメモしておく。そして以下のようにインストール。

$ cd $HOME
$ wget http://rubyforge.org/frs/download.php/72201/redmine-1.0.1.tar.gz
$ tar zxvf redmine-1.0.1.tar.gz
$ sudo mv redmine-1.0.1 /var/lib/redmine
$ rm -rf redmine-1.0.1.tar.gz

MySQL を Ruby から操作することになるので Ruby 用 MySQL アダプタが入っていることを確認。

$ gem list
... 中略 ...
mysql (2.8.1)

mysql という表記があれば OK。なければ以下のようにインストール。mysql-devel、アダプタの順に入れる。

$ sudo yum -y install mysql-devel
$ sudo gem install mysql -- --with-mysql-lib=/usr/lib/mysql
Building native extensions.  This could take a while...
Successfully installed mysql-2.8.1
1 gem installed
Installing ri documentation for mysql-2.8.1...
Installing RDoc documentation for mysql-2.8.1...

次は Redmine のデータベース接続に関する設定をおこなう。これは database.yml というファイルに指定する。初期状態では database.yml.example というサンプル ファイルが置かれているので、これをコピーして編集することにした。

$ cd /var/lib/redmine/config/
$ cp database.yml.example database.yml
$ vi database.yml

このファイルを以下のように編集。

MySQL (default setup).

production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: XXXXXXXXXXXXXXXX
  encoding: utf8

ユーザー名とパスワードを「Redmine 用データベースとユーザー作成」で設定した内容に書き換えて保存。

最後にセッション管理用の秘密鍵を生成する。これがないと Redmine の起動でエラーが発生する。

$ rake generate_session_store
(in /var/lib/redmine)

Redmine 用データベースの初期化 {#vps07redmineinit_db}

今回インストールした Redmine のデータベースを初期化するためには rack モジュールが 1.0.1 でなくてはならない。ここまでの手順で導入されているものは 1.2.1 なのでアンインストールしてから入れ直す。

$ sudo gem uninstall rack
... 中略 ...
Successfully uninstalled rack-1.2.1
$ sudo gem install rack -v 1.0.1
Successfully installed rack-1.0.1
1 gem installed
Installing ri documentation for rack-1.0.1...
Installing RDoc documentation for rack-1.0.1...

そして以下のようにテーブルを作成。

$ cd /var/lib/redmine/config/
$ rake db:migrate RAILS_ENV=production
(in /var/lib/redmine)

テーブルに初期設定を反映する。途中で Redmine の言語を問い合わせられるので、ja と入力して Enter を押す。

$ rake redmine:load_default_data RAILS_ENV=production
(in /var/lib/redmine)

Select language: bg, bs, ca, cs, da, de, el, en, en-GB, es, eu, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ja
====================================
Default configuration data loaded.

これで Redmine が日本語環境として設定された。

Redmine を動かす

ここまでくればあと一息。Redmine の起動設定をおこない実際に動かしてみる。

さくらのVPS では Redmine 以外の Web アプリも動かす可能性があるので redmine というサブ ディレクトリを設けて、そこで動かすようにしたい。そのためには Apache のドキュメント ルートに Redmine の RAILS_ROOT/public に対するシンボリック リンクを作成する必要がある。これは以下のコマンドで作成。

$ sudo ln -s /var/lib/redmine/public /var/www/html/redmine

Apache の httpd.conf にも設定しておく。

$ sudo vi /etc/httpd/conf/httpd.conf

ファイルの末尾に以下の内容を追記。

RailsBaseURI /redmine

編集を終えたら保存して、設定のチェック & Apache 再起動。

$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

準備 OK。ではさっそく Redmine へアクセスしてみよう。今回はドメインのサブ ディレクトリ redmine をルートとした。そして私の借りているサーバーはドメインを取っていないので http://XXX.XXX.XXX.XXX/redmine/ というような URL となる。これをブラウザのアドレス バーに入力して表示すると...

Redmine の初期画面

ばっちり Redmine が動いてる。ああ長かった。軽く祝杯をあげよう。

最後に admin のパスワードなどを変えておこうと思ったのだが My account などにアクセスすると 500 エラーになる。なぜ?とりあえずパスワードを変更せずに公開するのは危険なので Apache ごと停止しておく。

$ sudo service httpd stop
httpd を停止中:                                            [  OK  ]

なんとも困ったものだ。最後にこんな落とし穴があるとは。

今回はここまで。次は Redmine の 500エラー解決と、Subversion か Git を入れたい。...と思ったがこのまま終わってしまうのはもったいない。もう少し粘って調べてみようじゃないか。

エラーを解決して admin のパスワードを変える

Redmine 公式 wiki を見ると Ruby や Rails などのバージョンが細かく指定されている。調べてみると Rails が 2.3.5 でなければならない。しかし Ruby Enterprise Edition で入るのは 3.0.0 のようだ。まずはこれを 2.3.5 に戻してみる。

$ sudo gem uninstall rails
... 中略 ...
Successfully uninstalled rails-3.0.0
$ sudo gem install rails -v=2.3.5
... 中略 ...
Installing RDoc documentation for rails-2.3.5...

そして Apache を起動し...

$ sudo service httpd restart
httpd を起動中:                                            [  OK  ]

改めて Redmine にログインして My account をクリック。ダメだ。やはりエラーになる。とはいえ Redmine が公式にサポートするバージョンの Rails にしたということで、他の潜在的な問題が起きなくなるはず。

次はログを解析。Redmine のインストール先が /var/lib/redmine ならログは /var/lib/redmine/log/production.log にある。以下のコマンドを実行してリアルタイムにログ監視をおこなう。実行するとログファイルの末尾が変化する度にコンソールへ内容が追記表示されてゆく。抜ける場合は Ctrl + C

$ tail -f /var/lib/redmine/log/production.log

監視状態にした TeraTerm をブラウザの横に並べる。そして Redmine へログインしてから My account をクリック。すると以下のようなエラーが出力された。

ActionView::TemplateError (missing interpolation argument in "%m/%{count}/%Y" ({:object=>Mon, 20 Sep 2010} given)) on line #17 of app/views/users/show.rhtml:
14:     <li><%=h custom_value.custom_field.name%>: <%=h show_value(custom_value) %></li>
15: 	<% end %>
16: 	<% end %>
17:     <li><%=l(:label_registered_on)%>: <%= format_date(@user.created_on) %></li>
18: 	<% unless @user.last_login_on.nil? %>
19: 		<li><%=l(:field_last_login_on)%>: <%= format_date(@user.last_login_on) %></li>
20: 	<% end %>

日時の書式がおかしいようだ。はっきりいって謎すぎる。しかし Redmine の管理画面に書式を設定するところがあったのでダメもとで設定を変更。これは Redmine 左上のメニューから「Administration」→「Settings」→「Display」と選択してゆくと表示されるページの Date format と Time format となる。

Redmine の表示設定

これで直ったら笑えるなあ、と思いながら再び My account をクリックすると...エラーが出ない!ばっちり直ってる!!なんてことだ。本当に直ってしまった。なんなのだこれは。というわけで admin の設定をおこなう。言語、メールアドレス、パスワードを変更。

個人設定

めでたしめでたし。

...今回はここまで。次は Subversion か Git を入れたい。

Comments from WordPress

  • qabo 2010-09-21T17:42:29Z

    はじめまして。

    こちらのサイトを参考にVPSの設定を行っているモノです。

    他のサイトにくらべ、見やすく、丁寧な説明なのでほんとに助かります~。

    次回の更新(GitよりSubversionがいいなぁ・・・)も楽しみにしています!

    それでは。

  • akabeko akabeko 2010-09-21T22:21:21Z

    Git で考えていたのですが、複数人で開発しないなら Subversion のほうが分かりやすいですね。 標準で yum からインストールできる手軽さもありますし....というわけで Subversion を検討します。

  • qabo 2010-09-22T00:44:53Z

    早々ご返答いただけて光栄です。

    ありがとうございます、ぜひご検討ください。

    応援してますー

  • akabeko akabeko 2010-10-04T14:41:32Z

    貴重な情報ありがとうございます。1.0.2 だとエラーが起きないのですね。

    Redmine 自体のチケットを見るに開発はかなり活発なようなので、品質向上のペースも早いのでしょう。あとはバージョンアップが WordPress 並に楽だと嬉しいのですが、これも近いうちに実現してしまうのかもしれませんね。

  • kakicg kakicg 2010-10-04T14:02:28Z

    redmineの最新バージョン1.0.2でインストールしたせいか上のようなエラーは起きませんでした。railsも3.0.0で今のところ問題なし。

  • akabeko akabeko 2010-12-05T13:58:32Z

    1.0.1 → 1.0.4 にアップグレードしてみたところ、i18n のエラーは発生しませんでした。 Redmine 本家のロードマップを見ると、バージョン更新の度に i18n 関連のチケット対応があるので、 それが効いているのかもしれません。

  • aki aki 2010-11-04T19:37:43Z

    同じ問題ではまりました。

    私のケースでは1.0.3で、Internal ErrorがSettingでも起きていたので難儀しました。

    こちらに情報がありました。

    http://www.redmine.org/boards/2/topics/18879?r=18888

    sudo gem uninstall i18n

    でapache再起動すれば動きました。

  • megane megane 2010-11-05T03:44:22Z

    akabeko様

    はじめまして!

    とてもわかりやすい説明で迷うことなくインストール出来ました。ありがとうございます!

    私もaki様と同じ問題ではまっていましたが、i18nをアンインストールしたら解決しました。

    aki様もありがとうございました!