hirax.net::inside out::2009年04月27日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2009年3月 を読む << 2009年4月 を読む >> 2009年5月 を読む

2009-04-27[n年前へ]

素人がRails入門書を買ってWEBサーバを立ち上げた後の苦難の道 その1 

 これは、あくまで”素人”が、自分で作った「自分のWEB LOG(というより、やはりWEB日記)」を運用するまでの(これからもまだまだ続くだろう)苦難の道の記録です。

 書店に並んでいるRailsプログラミング本を買い、小さなプログラムを書いて、自宅サーバを(手書きHTMLとハイパーニッキシステムから移行し)動かし始めて1年と少し経ちます。今は、趣味サーバとしては普通に動いているようですが、プログラミング素人が書店で入門書を買って、Railsサーバを立ち上げた後は結構大変でした。大変だったといっても、何しろいちばん最初は入門書のステップ1に書いてあるようにInstantRailsをインストールしただけで動かしてみたのです(逆にいえば、一番最初に買った入門書 がそれだけわかりやすく、本を読むだけで簡単にアプリケーションを作ってみることができた、ということでもあります)。当然、キャッシュも使わず、プロセスも1つだけで動かしたわけです。何しろ、知識は書店で買った入門書だけなので、そんな感じで動かしてみたのです。

 すると、たいしたアクセスもないにも関わらず、数分も立たない内にWebrickは反応をしなくなり、サーバはすぐに黙ってウンともスンとも言わなくなってしまいました。今考えてみれば、それは当たり前の話で、画像もファイルも何から何まですべての配信・処理をひとつのプロセスが行おうとしていたのですから、ちょっと無理があり過ぎ、です。そんなわけで、素人が「Rails入門書」のステップ1を読んだだけでサーバを立ち上げた結果は、趣味・個人サーバですら、1時間も安定した稼働をさせることができない状態になりました。

 そこで、次のステップとして、その次に買った本で運用の仕方を学びつつ 、1台のPCでmongrelサーバをクラスタリングさせることにしてみました。次のような感じの(こんな感じというだけで実際に使っているものとは違いますが)スクリプトを書き、10個くらいのmongrelサーバを起動させ、再起動をたまにさせることでメモリーリークや、いろんな問題に目をつぶって動かしてみることにしたのです。

# gem install win32-process
# gem install windows-pr

require 'win32/process'
require 'windows/handle'
include Windows::Process
include Windows::Handle

class ProcessController
 def initialize(command)
  @pi=nil
  start(command)
 end
 def start(command)
  @pi=Process.create(
   :app_name=>command[:cmd], 
   :cwd=>command[:cwd])
 end
 def stop
  Process.kill(9, @pi.process_id)
  CloseHandle(@pi.process_handle)
 end
end

@comands=[
  {:path=>"Z:\\blog",
   :cmd=>'mongrel_rails start -p 8080 -e production'},                                        
  {:path=>"Z:\\blog",
   :cmd=>'mongrel_rails start -p 8081 -e production'}]

while true
 @proccesses=[]
 @comands.each{|comand|
  @proccesses << ProcessController.new(comand)
 }
 sleep 60*60*24
 @proccesses.each{|process|
  process.stop
 }
end

 しかし、素人がRails入門書を買ってWEBサーバを立ち上げた後の苦難の道は、まだまだその先も長かったのです。今もたくさん問題を抱えているのですが、とりあえず、二番目に生じた課題は、プログラミングに時間を使うのが嫌だったので、負荷分散をPCの数で解決しようとした時に起きた色んなトラブルでした。