さくらVPSにzncをインストール

以前、自宅のPC (MMX 133MHz!) でNetBSDを運用しておりまして、
その上でIRCゲートウェイ(というのかプロキシーというのか)を走らせていたんですが、
ずいぶん前に雷でマシンごとやられまして、そのままになっていたのを急に思い出しました ^^;

今度はさくらVPSにインストールすることにして、
ゲートウェイはどれにしようか悩んだのですが、最近はtiarraよりzncのようなので、
zncにしてみます。以前動かしていたのはなんだったかもう思い出せませんでした。年か ^^;

CentOSはyumでzncを入れればいいです。epelに入っているみたいです。

$ sudo yum -y install znc
...(略)...
Installed:
  znc.x86_64 0:1.2-1.el6                                                                                                       

Complete!

というわけで、znc 1.2 がインストールできました。単に

$ znc

と起動してやると、かってにバックグランドで起動します。起動する前に設定を
しなくていはいけませんが、–makeconf をつけて起動すると対話的に
設定を作ることができます。

$ znc --makeconf
[ ok ] Checking for list of available modules... 
[ ** ] Building new config
...(略)...

設定は適当にやりますが、zncでは複数のユーザーを作成することができます。ひとつzncを起動するだけで、
複数の人からの接続を許すことができます。最近のバージョンでは、ひとりのユーザーにつき、複数のネットワーク
(IRCサーバー)を指定することができ、同時にあっちのサーバーとこっちのサーバーにつなぐことができます。
主な設定を抜粋しておくとこんなかんじ。

[ ?? ] What port would you like ZNC to listen on? (1025 to 65535): 6667 
       ↑クライアントがzncに接続するポートの指定

[ ?? ] Would you like ZNC to listen using SSL? (yes/no) [yes]: yes
       ↑クライアントとの接続にSSLを使うか (yesにしました)

[ ?? ] Would you like to create a new pem file now? (yes/no) [yes]: yes
[ ok ] Writing Pem file [/home/iwa/.znc/znc.pem]... 
       ↑pemファイルを作るかどうか (作ります)

[ ?? ] Would you like ZNC to listen using ipv6? (yes/no) [no]: no
       ↑ipv6 は無効に

[ ?? ] Listen Host (Blank for all ips): 
       ↑ブランクでいいみたい

[ ** ] -- Network Modules --
...(略)...モジュール類はぜんぶnoにしておいて、あとから追加すればいいでしょう。

[ ** ] Now we need to set up a user...
       ↑ユーザーの作成をします

[ ** ] 
[ ?? ] Username (AlphaNumeric): hoge
[ ?? ] Enter Password: 
[ ?? ] Confirm Password: 
       ↑クライアントがzncに接続するユーザー名とパスワード

[ ?? ] Would you like this user to be an admin? (yes/no) [yes]: yes
       ↑クライアントがzncに接続するユーザー名とパスワード

[ ?? ] Nick [hoge]: kenic
[ ?? ] Alt Nick [kenic_]: kenip
       ↑IRCのニックの指定

[ ** ] -- IRC Servers --
[ ** ] -- Channels --
       ↑大胆に省略しますが、IRCサーバーとチャンネルを指定します。複数指定できます。

[ ** ] To connect to this ZNC you need to connect to it as your IRC server
[ ** ] using the port that you supplied.  You have to supply your login info
[ ** ] as the IRC server password like this: user/network:pass.
[ ** ] 
[ ** ] Try something like this in your IRC client...
[ ** ] /server  +16668 iwa:
[ ** ] And this in your browser...
[ ** ] https://:16668/
       ↑注意がきです

[ ?? ] Launch ZNC now? (yes/no) [yes]: yes
       ↑yes ってすると起動します。

できた設定は ~/.znc/configs/znc.conf に書かれています。これを手で書き換える場合は次のようにします。

IRCクライアントで /znc SaveConfig
~/.znc/configs/znc.conf を編集
IRCクライアントで/znc Rehash

複数のネットワークを指定したばあいは、クライアントはどのネットワークを使いたいか、
指定する必要があります。ネットワークの指定(切替)は、クライアントから /znc jumpnetwork
でネットワークをそのつど切り替えるか、クライアントの接続の設定で、パスワードに
「user名/ネットワーク名:パスワード」として、あらかじめネットワークを指定するかします。
ここのところが良くわからなくて少し悩みました。よくみたらちゃんとメッセージが出てたんですけど。

moduleはいろいろあるみたいですが、とりあえずlogぐらいはとるようにしたいです。IRCクライアントから
ロードできます。 /znc loadmodule log としさえすれば、あとはかってに ~/.znc/users/hoge/moddata/log/
の下に、チャンネル別、日付別にログができます。便利です。

その他、くわしいことは /znc help でわかるみたいです!

参考文献

さくらのレンタルサーバーにRuby on Rails 2.0.2をインストールする方法

数日前、読者のかたからメールをいただきました。「rubygemsが1.1.1になっており、記事通りにしてもインストールできない」とのことでした。前の記事さくらのレンタルサーバーにRuby on Railsをインストールする方法を書いてから、9箇月たちまして、Ruby on Railsもrubygemsも新しいバージョンがでています。前の記事を書いたときと状況がかわっているので、今のバージョンでのインストールの方法を新たにまとめてみました。

インストールするのは次のものです。

  • rubygems 1.1.1
  • Ruby on Rails 2.0.2

例によって、rubyは標準のものを使用します。最新版は1.8.7が現在preview2 ですが、標準でインストールされているのは1.8.5です。確認しておきます。

% ruby --version
ruby 1.8.5 (2006-08-25) [i386-freebsd6]

railsをいれるまえに、rubygemsをイントールします。2008年5月時点での最新版は1.1.1です。バグも修正されたようで、以前よりインストールが簡単になっています。ふつうに$HOME以下にインストールすればOK。$HOME/src以下にrubygemsのソースコードをもってきます。$HOME/srcがなかったらこの機会に作ってしまおう。

% mkdir $HOME/src
% cd $HOME/src
% ftp http://rubyforge.org/frs/download.php/35283/rubygems-1.1.1.tgz
Requesting http://rubyforge.org/frs/download.php/35283/rubygems-1.1.1.tgz
Redirected to http://rubyforge.rubyuser.de/rubygems/rubygems-1.1.1.tgz
Requesting http://rubyforge.rubyuser.de/rubygems/rubygems-1.1.1.tgz
100% |*************************************|   413 KB   85.21 KB/s    00:00 ETA
423308 bytes retrieved in 00:04 (85.21 KB/s)

tar+gzipを展開して、その中に移動し、早速インストール。標準だと/usr/local/以下にインストールされるようですが、さくらのレンタルサーバーではもちろんそんなところにインストールできないので、$HOME以下にインストールするよう、オプションをつけます。

% tar zxf rubygems-1.1.1.tgz
% cd rubygems-1.1.1
% ruby setup.rb --prefix=$HOME
mkdir -p /home/narak/lib
mkdir -p /home/narak/bin
install -c -m 0644 rubygems.rb /home/narak/lib/rubygems.rb
...
RubyGems installed the following executables:
 /home/narak/bin/gem18

If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.

gem18という名前で$HOME/binの下にインストールできたようなので、確認します。その前に$HOME/binがコマンドサーチパスに入っていないひとは、入れておきます。railsは$HOME/lib/ruby/gem/binにはいるので、そっちもついでに追加。$HOME/.cshrcに次のように書いておきます。

set path = (/sbin /bin /usr/sbin /usr/bin ...(中略)... $HOME/bin $HOME/lib/ruby/gem/bin)

ついでに$HOME/.cshrc中で環境変数RUBYLIBとGEM_HOMEも指定しておきます。rubygems.rbがインストールされる場所が変わったので、RUBYLIBもちょっとかわっています。

setenv RUBYLIB $HOME/lib
setenv GEM_HOME $HOME/lib/ruby/gem

できたらsourceして、インストール直後はコマンドサーチパス内にあってもみつからないので、rehashしてからバージョンの確認。

% source $HOME/.cshrc
% rehash
% gem18 --version
1.1.1

できました。つづいてrailsのインストール。 railsは$HOME/lib/ruby/gem/binの下にインストールされます。コマンドドサーチパスにはすでにはいってますね? railsのインストールは簡単。

% gem18 install rails --include-dependencies

できたらrehashしてバージョンの確認。

% rehash
% rails --version
Rails 2.0.2

できた! だいぶ簡単になりましたねー。

参考文献

  1. rubygems
  2. Ruby on Rails
  3. オブジェクト指向スクリプト言語 Ruby
  4. さくらのレンタルサーバにRuby on Railsをインストールする方法, がんちゃんのブログ, 2007

たいへんお行儀の悪いMJ12botとは?

先日のエントリ「さくらのレンタルサーバーで503」で掲載したグラフで、急にアクセスが多くなっているところがあります。再掲しますと、下記のグラフです。

a traffic cused by majestic 12 virus

図1. 1月15日に妙なピークが

ログを確認すると、「MJ12bot/v1.0.8 (http://majestic12.co.uk/bot.php?+)」というボットが15日に15070 Hitsしてきています。朝の9時にアクセスし始めて、夜の9時に終わっていますから12時間で15000Hitsです。15000/12/60=20、つまり1分間に20Hits、3秒に1リクエストです。すごすぎ。

http://majestic12.co.uk/をみると、majestic12はSETI@homeの技術を応用した分散コンピューティングによる検索エンジンらしくて、 いろんなチームが処理結果を競っています。それでめちゃくちゃアクセスしてくるのかー、とおもったのですが…majestic12のbotの説明書をみてみると、

Fake MJ12bot v1.0.8 (virus based botnet)

どうも去年の10月ぐらいから、ウイルスによって拡大するニセモノのMJ12botが跋扈しているようで ^^;; ちなみにホンモノのボットの最新版はv1.2.1らしいです。majestic12のなかのひともたいへんですね。よくよく調べてみると、ホンモノのMJ12bot (v1.2.1でした)もときどきアクセスにきているようです。そっちは大変お行儀がよく、4, 5ページクロールしたらすぐいなくなってるようでした。

今回やってきたウイルスのにせMJ12botは、なにもしなくても12時間ちょっとでいなくなりましたが、とりあえずブロックしておきました。ブロックの方法は「.htaccess」に下記のように書きます。

order allow,deny
allow from all
# reject fake mj12
SetEnvIfNoCase User-Agent "^MJ12bot/v?1.[01].[0-9]{1,2}" block
Deny from env=block

まあ、こんかいの503病はこれが原因ではなさそうですが、みょーなのがやってきて遅くなったらいやだしね。

参考文献

  1. MJ12bot, Majestic 12 Distributed Search Engine, 2007

さくらのレンタルサーバで503 Service Temporarily Unavailableが出る謎

さくらのレンタルサーバのスタンダードを借りているのですが、2、3日前から503 Service Temporarily Unavailableがでるようになりました。phpのみで、ふつうのhtmlはOK。URLでphpを直接指定すると503で、URLでディレクトリを指定してphpを参照すると403 Forbiddenになっちゃいます。

503.jpg

図1. 503 Service Temporarily Unavailable

performancepartscentral.comってのがさくらの上で動いているドメインです。これをみたとき、なにがおこったのかさっぱりわからず、てっきりサーバが壊れたのかと思ってさくらに問合せをしたところ、下記のようなお返事をいただきました。

「503 Service Temporarily Unavailable」というエラーメッセージは、
一時的にウェブアクセスが集中している、もしくは、お客さまにて設置
されているCGIプログラムが誤作動を起こしている場合において表示され
ます。

▼ オンラインマニュアル エラーメッセージ集
http://support.sakura.ad.jp/support/manual/rs/errmsg_web.shtml#503

弊社「さくらのレンタルサーバ」サービスは1台のサーバを複数のお客様と
共有して使用いただく、いわゆる”共用サーバ”となります。
そのため、1人のお客様がサーバの性能を使い果たし、サーバの負荷に
よって他のお客様へご迷惑をおかけすることのないよう様々な制限が
設けられております。

お客様のサーバを確認いたしましたところ、お客様のアカウントに対して
CGIやPHPによるアクセス制限が設けられておりました。今回こちらの制限の
緩和を行なわせていただきました。
しかしながら、今後同様にサーバに許容範囲を超える過負荷等が発生しま
した場合、再度制限が設けられる可能性がございますのでご注意ください
ますようお願いいたします。

なお、これらの制限につきましてはサーバへの負荷がかかる状態を確認
すると制限を掛かり、負荷が緩和されると制限を解除いたします。
弊社にて定めている具体的なしきい値につきましては時流により変動いた
しますため、申し訳ございませんが
公表させていただいておりません。あらかじめご了承ください。

要するに具体的な制限値があるわけではなく、「負荷が掛かる状態」を確認すると制限がかかるということらしいです。
つまり、わたしが動かしているサイトのどれかが負荷をかけたので、503の規制がかかったということですね。
でも、10月や11月とくらべると、わたしのサイトへのアクセスは激減しているはずなのに、10月や11月には503にならず、
1月に急に503になるのはおかしい気がします。そこで、 アクセス数と503の回数をグラフにしてみました。

hits-503.jpg

図2. 1日あたりの503の回数とhit数

ログを見ると1月8日の夜23時ごろから規制がはじまってます。でもねえ、グラフにしてみるとはっきりわかるとおり、
やっぱり10月とくらべるとだんぜんアクセス数も少ないし、規制がはじまったときの
絶対的な値もいちにち2000ヒットや4000ヒットですよ? なにがきっかけで規制がはじまったのかちっともわからん…

今回の件があるまでぜんぜんしらなかったけど、さくらは「503」になることがよくあるらしいですね。それで文句が
よく出ているようですが、なんか、503規制をはじめるアルゴリズムがダサイのが文句が出る原因じゃないかって気がしてきた。
ちゃんと理解可能な理由で503規制がはじまれば、ユーザー側で対策もとれるし文句はでないのでは….?

この件は、またあとでさくらに問合せしてみるかも。

参考文献

  1. 共有さくら鯖の503の謎, またたび.ws, 2005
  2. さくら(sakura)インターネットの503 Service Temporarily Unavailableについて, 時事ネタに釣られるブログ, 2007

wordpressのビジュアルエディタを無効にする方法

以前さくらのレンタルサーバーにwordpressをインストールする方法で使い始めたwordpressですが、記事を書いてみるとなぜか<div>が<p>になってしまいます。divの中に入っているpもなんか変換されちゃってへんなかんじ…なんだろうと思ったら参考文献[1]に書いてありました。ビジュアルエディタにバグが! へんなバグだなあしかし…

解決するにはビジュアルエディタを無効にするか、そのバグそのものを直すパッチをあてればいいようです。わたしはビジュアルエディタはぜんぜん使わないので、無効にすることにしました。これがまた、無効にする方法がわからん…うーん。ユーザー→編集ってどこよ! ないし!

悩むこと3分、参考文献[2]を発見。ディレクトリ「wp-includes/js/tinymce/」をリネームすればいいらしい。簡単だね!

$ cd wordpressをインストールしたディレクトリ
$ mv wp-includes/js/tinymce wp-includes/js/tinymce.bk

案外簡単になおりました。オタメシアレ!

参考文献

  1. WordPressの文章整形機能でdivタグがpタグに…, lovelog, 2007
  2. Disable Visual Editor, wordpress.org, 2007

さくらのレンタルサーバーにWordPressをインストールする方法

ちょっと思い立ったので、さくらのレンタルサーバにWordPressをインストールしてみました。WordPressのインストールって、ちょう簡単なのねえ…しらなかった。作業開始から動作確認まで3分ぐらいで完了しました。さくらのレンタルサーバーをかりてるひとは、wordpress.comとか借りる必要まったくないですね。とかいいつつ、これはblogger.comだけど! その、今回インストールしたのはこちら、Performance Parts Central。まあなんていうんですか、普通のブログです。

インストールは簡単に言うと、ダウンロードして、展開して、パーミッションなおして、データベースの設定をするだけなんです。というわけで、さっそくやってみよう。用意するものはtelnetの端末とウェブブラウザだけです。WindowsのひとはコマンドプロンプトかTera termを、Mac OS Xのひとは「ターミナル」を使ってください。WindowsやMac OS Xのftpクライアントとかは必要ありません。

ではまず、コマンドプロンプト/Tera Term/ターミナルをつかって、さくらのレンタルサーバーにログインしましょう。ログインの仕方はだいじょうぶですかー?

% ssh ****.sakura.ne.jp -l ****  ←借りるときに指定したサブドメイン名とユーザー名ね
****@****.sakura.ne.jp's password: ←パスワード入力
Last login: Tue Dec 18 10:11:03 2007 from xxxx.xxxx.xx
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
 The Regents of the University of California.  All rights reserved.

FreeBSD 6.1-RELEASE-p17 (SAKURAx) #0: Mon Jun 11 20:40:49 JST 2007

Welcome to FreeBSD!

%

では、つぎにWordPressをダウンロードしましょう。日本語版のひとはWordPress Localizationリリースファイル・リストを、英語版でいいひとはDownload WordPressを見て、ダウンロードするファイルのURLを見つけてください。現在のところ、日本語版のひとは「http://prdownloads.sourceforge.jp/wordpress/27093/wordpress-me223.zip」、英語版のひとは「http://wordpress.org/latest.zip」です。そうしたらこれをさくらのサーバー上でダウンロードします。場所はどこでもいいですが、ホームディレクトリにしておきましょうか。ここでは英語版にしました。

% cd ~/
% ftp http://wordpress.org/latest.zip
Requesting http://wordpress.org/latest.zip
  1040 KB  296.92 KB/s 
1065215 bytes retrieved in 00:03 (296.92 KB/s)
% ls -l ./latest.zip
-rw-r--r--  1 narak  wheel  1065215 Dec 19 17:32 ./latest.zip

ダウンロードできたら、展開します。これもとりあえずはどこでもいいです。ホームディレクトリで展開しちゃいます。

% unzip latest.zip
Archive:  latest.zip
   creating: wordpress/
  inflating: wordpress/wp-trackback.php  
  inflating: wordpress/wp-config-sample.php 
....
  inflating: wordpress/wp-content/plugins/akismet/akismet.gif  
  inflating: wordpress/wp-content/plugins/akismet/akismet.php  
  inflating: wordpress/wp-content/plugins/hello.php 

これで、「~/wordpress」以下に展開できました。展開できたら、ブツを所望の位置に移します。ここでは仮にxxx.sakura.ne.jp/blog/というディレクトリで動かすことにします。すると、移動する先は「~/www/blog」になるはずです。

% mv wordpress ~/www/blog
% cd ~/www/blog
% ls
index.php  wp-config-sample.php wp-rdf.php
license.txt  wp-content/  wp-register.php
readme.html  wp-cron.php  wp-rss.php
wp-admin/  wp-feed.php  wp-rss2.php
wp-app.php  wp-includes/  wp-settings.php
wp-atom.php  wp-links-opml.php wp-trackback.php
wp-blog-header.php wp-login.php  xmlrpc.php
wp-comments-post.php wp-mail.php
wp-commentsrss2.php wp-pass.php

ターミナルでやる作業はこれでおわりです。あとはweb経由で設定を行います。動かすつもりのディレクトリにブラウザでアクセスすると、次のような画面が出るはず。

wordpress1.jpg

図1. 初めてのアクセス

ここの「create a wp-config.php file through a web interface」というリンクをぽちっとします。

wordpress2.jpg

図2. 次の画面

この画面の「Let’s go」をクリックしましょう。するとこうなるはず。

wordpress3.jpg

図3. データベース設定画面

ここで、さくらでつかえるMySQLサーバー名やデータベース名などを入力します。最後の「Table Prefix」は、WordPressを複数設置するときは、重ならないように適当にユニークな名前にしておきます。入力できたら「Submit」をポチ。

wordpress4.jpg

図4. 準備完了

ここで「run the install!」をポチとします。

wordpress5.jpg

図5. タイトルとe-mail入力

ブログのタイトルと、emailアドレスの入力を求められるので入力します。入力したら「Install WordPress」をポチ。

wordpress6.jpg

図6. インストール完了!

ここで表示されるパスワードは忘れないようにして下さい。あとは、ここで与えられたパスワードをつかって、wp-login.phpにログインすればオッケーです。「wp-login.php」というリンクをポチ。

wordpress7.jpg

図7. ログイン画面

ユーザー名「admin」パスワードは先ほどのものでログインしてください。すると、

wordpress8.jpg

図8. 管理画面

おおっ! そして、ブログの本体の画面はというと…

wordpress9.jpg

図9. てきとうすぎるブログ名のブログ!

できましたー。あとは先ほどの管理画面から投稿すればオッケーです。管理画面は「ブログのURL/wp-admin.php」です。あとは、ユーザーを作成したり、テーマをダウンロードしてブログの見た目をかえたり、パーマリンクのURLのかたちを変えたり、いろいろやりましょう!

参考文献

  1. wordpress.org (WordPressの配布元)
  2. Installing WordPress, WordPress Codex

さくらのレンタルサーバーのRuby on Railsを高速化する方法

以前、さくらのレンタルサーバーにRuby on Railsをインストール、動作を確認し、実際に簡単なアプリケーションをうごかしてみました。

  1. さくらにRailsをインストールする方法
  2. その動作確認
  3. サンプルアプリケーション

しかし、これがどうにも遅い! 通常はApacheに加えてfastCGI等を利用して起動の高速化をはかるのですが、さくらの共用サーバーでは利用できません(参考文献[1])。ただのCGIで動かした場合にどれぐらい遅いかというと、参考文献[2]をごらんください。普通の(?)方法でうごかすのと比較すると、ただのCGIはざっと100倍ぐらい遅い。ひどい!

というわけで、多少でもはやくならんもんかと思い色々と試してみました。速度の測定にはhttperfを使ってみました[3]。Mac OS X の場合はMacPortsで簡単にインストール可能です。ほかのプラットフォームでもいろいろあると思いますが、割愛します。

まずは、RailsもRubyも関係ない、静的ファイルの場合を測定してみます。ファイルの内容はあとで出てくるRailsのものとおなじです。

% httperf --server=narak.sakura.ne.jp --port=80 --uri=/test.html --num-conns=100 --num-calls=1
httperf --client=0/1 --server=narak.sakura.ne.jp --port=80 --uri=/test.html --send-buffer=4096
  --recv-buffer=16384 --num-conns=100 --num-calls=1
httperf: warning: open file limit > FD_SETSIZE; limiting max. # of open files to FD_SETSIZE
Maximum connect burst length: 1

Total: connections 100 requests 100 replies 100 test-duration 8.095 s

Connection rate: 12.4 conn/s (80.9 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 77.5 avg 80.9 max 88.4 median 80.5 stddev 2.2
Connection time [ms]: connect 27.0
Connection length [replies/conn]: 1.000

Request rate: 12.4 req/s (80.9 ms/req)
Request size [B]: 78.0

Reply rate [replies/s]: min 12.2 avg 12.2 max 12.2 stddev 0.0 (1 samples)
Reply time [ms]: response 27.3 transfer 26.6
Reply size [B]: header 231.0 content 5512.0 footer 0.0 (total 5743.0)
Reply status: 1xx=0 2xx=100 3xx=0 4xx=0 5xx=0

CPU time [s]: user 1.83 system 6.17 (user 22.7% system 76.2% total 98.9%)
Net I/O: 70.2 KB/s (0.6*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

httperfは指定のサイトの指定のページにある回数アクセスして、速度を測定します。今回は100回にしてみました。結果が色々出てますが、とりあえず

Request rate: 12.4 req/s (80.9 ms/req)

ここだけみることにします。これは1リクエストあたり80.9msかかり、1秒間に12.4リクエストの処理が可能ということです。Railsの処理時間をいくらみじかくしても、これより速くなることはないという値です。

ではつぎに、サンプルのtodoリストの速度を測定してみます。

Request rate: 0.5 req/s (1851.1 ms/req)

うーん、100倍は遅くありませんが、静的ファイルの場合と比較すると25倍ぐらい遅いですね。これをベースに、どれぐらい高速化できるか検討します。

まずは実行環境です。実は上記todoリストはdevelopment環境で稼働していました。これをproduction環境に変更します。production環境の方が速い。らしいです。変更の仕方は、

  1. config/database.ymlでproduction環境にもデータベースの設定を書く。
  2. config/environment.rb で「ENV['RAILS_ENV'] ||= 'production'」の行のコメントを外す。

です。これでプロダクション環境になります。ではさっそく、速度を測ってみよう!

Request rate: 0.6 req/s (1675.0 ms/req)

ビミョーに速くなりました!

さらに、今回の例はセッションを使っていないので、セッションを無効にしてみます。無効にする方法はapp/controllers/application.rbを下記のように変更します。

class ApplicationController < ActionController::Base
  # Pick a unique cookie name to distinguish our session data from others'
  # session :session_key => '_Todo_session_id'
  session :disabled => true
end

このときの速度は下記の通り。

Request rate: 0.6 req/s (1752.7 ms/req)

うーん、あまりはやくならない。ていうかむしろすこし遅くなったような。セッションはDBに保存するので、DBが遅い場合はセッションを無効にすると劇的に改善することがあるようです。しかし、さくらのようにデータベースがMySQLで別のサーバになっている場合は効果があまりない。残念。

気を取り直して今回の最後の手段。必要のないモジュールをロードしないようにします。具体的には、config/environment.rbの下記の行のコメントアウトをとります(行頭の#を削除して行を有効にします)。

  # Skip frameworks you're not going to use (only works if using vendor/rails)
  config.frameworks -= [ :action_web_service, :action_mailer ]

このときの速度は下記の通り。

Request rate: 0.9 req/s (1103.7 ms/req)

おおっ、だいぶはやくなった! 静的ファイルと比較して25倍から13倍によくなりました! というわけでみなさんもお試しあれ。焼石に水という気もしますが...

参考文献

  1. Movable Type 3.34 アップグレード, blog kazuking, 2007
  2. 優しいRailsの育て方, 2006
  3. Welcome to the httperf homepage, HP Labs, 2005

さくらのレンタルサーバでRuby on Railsをうごかしてみた…らかなり遅いかも…

その1
その2
さくらのレンタルサーバにRuby on Railsをインストールして、
動作確認をするところまでやりました。今回は簡単なアプリケーションを作って、どれぐらいの速度で
うごくのか確かめてみたいと思います。題材は「ToDoリスト」です。

その2の続きで、$HOME/Railsの下にTodoというアプリケーションを作ります。

% cd ~/Rails
% rails Todo

mySQLで「todos」という名前のテーブルを作っておきます。sqlサーバー、ユーザー名、パスワード、DB名はそれぞれ自分のものにかえてください。

% mysql --host=mysqlhoge.db.sakura.ne.jp --user=xxxx --password=yyyy xxxx
...
mysql> create table todos (
  -> id int primary key not null auto_increment,
  -> desctiption varchar(100) not null,
  -> done tinyint not null default 0);
Query OK, 0 rows affected (0.03 sec)

mysql> desc todos;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      |      | PRI | NULL    | auto_increment |
| desctiption | varchar(100) |      |     |         |                |
| done        | tinyint(4)   |      |     | 0       |                |
+-------------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

テーブルが出来たら、各種設定です。

  1. config/environment.rbの設定
  2. public/.htaccessの設定
  3. tmpとlogのパーミッション
  4. config/database.ymlの設定

(1)(2)(3)はその2に詳しいので、そちらをご参照の上、設定してください。(4)は、DBの設定です。
development:とtest:とproduction:の3セクションがありますが、今回はdevelopment:を下記のように
設定します。

development:
adapter: mysql
database: xxxx
username: xxxx
password: yyyy
host: mysqlxx.db.sakura.ne.jp

次にアプリケーションのモデルとコントローラーを生成します。

% cd ~/Rails/Todo
% ruby script/generate model Todo
% ruby script/generate controller todo

詳しい説明は省きますが ^^;; app/controllers/todo_controller.rb を以下のようなかんじにします。

% cat app/controllers/todo_controller.rb
class TodoController < ApplicationController
 model :todo
 def index
   redirect_to :action => :list
 end
 def list
   @items = Todo.find_all
   @newitem = Todo.new
 end
 def edit
  @edititem = Todo.find(params[:id])
 end
 def update
  item = Todo.find(params[:id])
  item.update_attributes(params[:todo])
  if item.save
        redirect_to(:action => "list")
  else
        render_text "Couldn't update an item"
  end
 end
 def add_item
  item = Todo.new(params[:todo])
  if item.save
        redirect_to(:action => "list")
  else
        render_text "Couldn't add new item"
  end
 end
end

app/views/todo/edit.rhtmlを下記のように。

% cat app/views/todo/edit.rhtml
<html>
  <head>
    <title>Edit an item - My todo list</title>
  </head>
 
  <body>
  Edit the item:<br>
  <% form_for :todo, @edititem, :url => { :action => :update , :id => @edititem } do |f| %>
    <%= f.check_box :done %>
    <%= f.text_field :description %>
    <%= submit_tag 'Update' %>
  <% end %>
  </body>
</html>

app/views/todo/list.rhtmlを下記のように。

% cat app/views/todo/list.rhtml
<html>
  <head>
    <title>My todo list</title>
  </head>
 
  <body>
    <% @items.each do |i| %>
    <%= check_box_tag("i", i.done, (i.done == 1)) %>
    <%= i.description %>
    <%= link_to("Edit", :action => "edit", :id => i.id) %>
    <br />
    <% end %>
  <hr>                                                   
  <% form_for :todo, @newitem, :url => { :action => :add_item } do |f| %>
    New item:
    <%= f.text_field :description %>
    <%= submit_tag 'Add item' %>
  <% end %>
  </body>
</html>

config/routes.rbに下の2行を追加。

map.connect '', :controller => "todo"
map.connect 'list', :controller => "todo", :action => 'list'

webで見られるところから、publicにシンボリックリンクを張る。

% ln -s /home/xxxx/Rails/Todo/public ~/www/todo

そんなこんなで完成。「My todo list」でうごいています。みてみるとわかりますが、かなり遅い。リロードに3秒ぐらいかかりますね。さくらのレンタルサーバーはfcgiが使えなくって、cgiなのが原因みたい。ちょっとこの遅さではツカエナイカモ…

参考文献

  1. テスト
  2. さくらのレンタルサーバーにRuby on Railsをインストールする方法
  3. さくらのレンタルサーバーにRuby on Railsをインストールする方法 その2
  4. Rail’s wiki

さくらのレンタルサーバにRuby on Railsをインストールする方法


2008.5.10追記

rubygemsもRailsも新しいバージョンが出ており、インストールの手順が多少かわりましたので、それにもとづいた記事をかいております。アップデート版さくらのレンタルサーバーにRuby on Rails 2.0.2をインストールする方法をご覧ください。


6月にあった人工知能学会の全国大会でもまつもとさんが招待講演をしたりして、なにげにもりあがっているRuby on Railsですが、わたしもさくらのレンタルサーバでRuby on Railsしてみようとおもい、インストールしてみました。そのための手順をまとめておきます。インストールに当たっては参考文献[1]と[2]を参考にしました。

まずはrubyがはいっていることの確認。

% ruby --version
ruby 1.8.5 (2006-08-25) [i386-freebsd6]

もんだいありませんね。rubyを新規にインストールしているひとが多いようですが、rubyをインストールし直す必要は「ありません」。既に入っているものを利用可能です。ただし「environment.rb」というファイルに環境変数「GEM_HOME」を設定する必要があります。詳しくは

続編「さくらのレンタルサーバーにRuby on Railsをインストールする方法 その2」をあわせてごらんください。

次にrubygemsをインストールします。rubygemsはrubyのパッケージ管理システムみたいなやつです。むしろgemsはrailsのインストール手段として有名になってきたらしい。なるほど。で、インストール方法ですが、標準のインストール先は/usr/localのようですが、もちろんさくらのレンタルサーバーではそんなところには入れられないので、$HOME(=/home/hogehoge)に入れることにします。$HOME/lib/ruby/gemと$HOME/binにはいります。ディレクトリがない場合は作っておきます。

% mkdir ~/bin
% mkdir ~/lib
% mkdir ~/lib/ruby
% mkdir ~/lib/ruby/gem

/usr/localじゃなくて$HOMEを見るように環境変数を設定しておきます。~/.cshrcに以下の行を追加。

setenv RUBYLIB $HOME/lib/ruby/site_ruby/1.8:$HOME/lib/ruby
setenv GEM_HOME $HOME/lib/ruby/gem

.cshrcをセーブしたら% source ~/.cshrcなどとして環境変数をセットしておきます。

rubygemsをダウンロードして展開します。2007年8月現在の最新版は0.9.4です。展開先は~/srcの下あたりがいいでしょう。なかったらこの際だから作っておきましょう。

% mkdir ~/src
% cd ~/src
% ftp http://rubyforge.org/frs/download.php/20989/rubygems-0.9.4.tgz
% tar xvzf rubygems-0.9.4.tgz

gemsをインストールします。setup.rbを実行するとconfig, setup, installの順で勝手に実行されるのですが、下で述べる理由で今回は1ステップづつ手で実行します。まずはconfigです。インストール先は$HOMEなのでその旨指定します。

% cd rubygems-0.9.4
% ruby setup.rb config --prefix=$HOME

このあとはsetupしてinstallするのですが、このままだとうまくいきません。あまり追求していませんが、おそらくrubygemsのバグでgemsが入るlibのパスが、configのprefixで指定したやつにならないのね。しょうがないので修正します。configsするとできる「.config」というファイルをviかなんかで以下のように修正するか、sedでもかけるか、patchするかなんかして修正してください。6行ほど修正。

% diff -u .config.org .config
--- .config.org Sun Aug 19 19:50:15 2007
+++ .config     Sun Aug 19 19:51:40 2007
@@ -5,12 +5,12 @@
 mandir=$prefix/man
 sysconfdir=$prefix/etc
 localstatedir=$prefix/var
-libruby=/usr/local/lib/ruby
-librubyver=/usr/local/lib/ruby/1.8
-librubyverarch=/usr/local/lib/ruby/1.8/i386-freebsd6
-siteruby=/usr/local/lib/ruby/site_ruby
-siterubyver=/usr/local/lib/ruby/site_ruby/1.8
-siterubyverarch=/usr/local/lib/ruby/site_ruby/1.8/i386-freebsd6
+libruby=$libdir/ruby
+librubyver=$libdir/ruby/1.8
+librubyverarch=$libdir/ruby/1.8/i386-freebsd6
+siteruby=$libdir/ruby/site_ruby
+siterubyver=$libdir/ruby/site_ruby/1.8
+siterubyverarch=$libdir/ruby/site_ruby/1.8/i386-freebsd6
 rbdir=$siterubyver
 sodir=$siterubyverarch
 rubypath=/usr/local/bin/ruby18

「.config」を修正したら、setupしてinstallです。

% ruby setup.rb setup
% ruby setup.rb install

これでgemsがインストールできたはず。出来たら確認しよう。出来たばかりだとコマンドがコマンドサーチパス内にはいっててもみつからないので、実行前にrehashします。

% rehash
% gem -v
0.9.4

オッケーですね。ではいよいよRailsをインストールしましょう。以下のようにします。

% gem install rails --include-dependencies

1回めはパッケージの情報がとれなかったみたいで失敗しました。2回めはオッケー。–include-dependenciesオプションをつけると、Railsのために必要なパッケージもインストールしてくれます。成功したら$HOME/lib/ruby/gem/bin/のしたにrailsとrakeというコマンドが入っています。$HOME/binあたりへシンボリックリンクを張ってもいいけど、面倒なのでまるごとコマンドサーチパスに入れておきます。~/.cshrcを編集して$pathに$HOME/lib/ruby/gem/bin を追加。

set path = (/sbin…(略)…/usr/X11R6/bin $HOME/bin $HOME/lib/ruby/gem/bin)

出来たらsourceしてrehashしてrailsの確認。

% source ~/.cshrc
% rehash
% rails -v
Rails 1.2.3

できたー。けっこう簡単。かな?

続編「さくらのレンタルサーバーにRuby on Railsをインストールする方法 その2」では、Railsの動作確認をします。つづく。

参考文献

  1. [Ruby]さくらにrubygems0.9.4インストール, qw/Perる PHP 日誌/, 2007
  2. [Ruby]さくらにRailsインストール, qw/Perる PHP 日誌/, 2007
  3. シリーズ パッケージマネジメント, rubyist magazine, 2006
  4. ruby on rails