¥È¥Ã¥× «Á°¤ÎÆüµ­(2008-12-05) ºÇ¿· ¼¡¤ÎÆüµ­(2008-12-10)» ÊÔ½¸

2008-12-06 [ĹǯÆüµ­]

_ CGI ¤ò rackup ¤·¤Æ¤ß¤¿

Ruby ¤Ï¼«Ê¬¤ÎÂç¹¥¤­¤Ê¸À¸ì¤À¤¬¡¢¼Â¤ÏŤ¯±¿ÍѤ¹¤ë Web ¥¢¥×¥ê¤ò Ruby ¤Ç½ñ¤¤¤¿¤³¤È¤Ï¤Ê¤¤¡£cgi.rb ¤ÎɾȽ¤Ï¤º¤¤¤Ö¤óÁ°¤«¤é˧¤·¤¯¤Ê¤¤¤·¡¢·èÄêÂǤȤʤë¥Õ¥ì¡¼¥à¥ï¡¼¥¯¤ÎÉԺߤ¬Ä¹¤¯Â³¤¤¤¿¤³¤È¡¢¤¹¤Ç¤Ë PHP ¤ò»È¤Ã¤Æ¤¤¤¿¤³¤È¤¬Â礭¤ÊÍýͳ¤À¤Ã¤¿¡£

Rails ¤¬Åо줷¤¿¡£ÊÙ¶¯¤·¤¿¡£¡Ö¤¦¡¼¤ó¡¢¤Ê¤ó¤« DBMS ¤È¤«Íפé¤Ê¤¤¤ó¤À¤±¤É¡¢¤É¤¦¤·¤¿¤é¤¤¤¤¤Î¤è¡©¡×¤È»×¤Ã¤Æ¤¤¤ë¤¦¤Á¤ËÀ¤´Ö¤Ç¤Ï¤¹¤Ã¤«¤êÄêÃå¡¢Âå¤ï¤ê¤Ë¼«Ê¬¤ÎÃæ¤Ç¤Ï¶½Ì£¤ÏÇö¤ì¤Æ¤¤¤Ã¤¿¡£¤½¤¦¤³¤¦¤·¤Æ¤¤¤ë¤¦¤Á¤Ë Rails ¤ÎÌäÂêÅÀ¤â¤Á¤ç¤³¤Á¤ç¤³»ØÅ¦¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¡¢prototype.js ¤È¤È¤â¤ËÀè¶î¼Ô¤æ¤¨¤Î¶ìÆñ¤òÌ£¤ï¤Ã¤Æ¤¤¤ë¤Ê¤¡¤È´¶¤¸¤Æ¤¤¤ëº£Æü¤³¤Îº¢¡£

Merb ¤À¤Ê¤ó¤À¤È¸À¤ï¤ì¤Æ¤¤¤¿Ãæ¡¢Rack ¤¬Åо줷¤¿¡£¤³¤ì¤À¡ª¤È»×¤Ã¤¿¡£¤³¤¦¤¤¤¦¥·¥ó¥×¥ë¤Ê¤ä¤Ä¤¬Íߤ·¤«¤Ã¤¿¤ó¤À¤è¡ª¡¡¤·¤«¤·¤½¤ì¤«¤éÆÃ¤Ë²¿¤ÎÍýͳ¤â¤Ê¤¤¤Þ¤Þ°ìǯȾ¤Î·îÆü¤¬Î®¤ì¤¿¡£¤Ê¤ó¤«¤³¤ó¤Ê¤ó¤Ð¤Ã¤«¤À¤Ê¡£RSS ¤ÎÅоì¤Ë¤è¤ê¾ðÊó¤Î¼ý½¸¤Ï®¤¯¤Ê¤Ã¤¿¤±¤É¡¢Ãμ±¤Ë¤¹¤ë¤¿¤á¤Î»þ´Ö¡¢¼ê¤òư¤«¤·¤Æ¡Ö¤Ä¤«¤à¡×¤Þ¤Ç¤Î»þ´Ö¤Ï¡¢¼«Ê¬¤È¤¤¤¦¿Í´Ö¤ÎÀ­Ç½¤¬ÊѤï¤é¤Ê¤¤*1¤Î¤Ç¤Á¤Ã¤È¤âû¤¯¤Ê¤é¤Ê¤¤¡£

¤½¤ó¤Ê¥ª¥ì¸ì¤ê¤Ï¤É¤¦¤Ç¤â¤è¤¯¡¢º£²ó¤Ï¤è¤¦¤ä¤¯¼«Ê¬¤Ç Rack ¤ò»È¤Ã¤Æ¤ß¤Þ¤·¤¿¤è¤È¤¤¤¦¤ªÏᣤ·¤«¤â¡¢¤¢¤ó¤Þ¤ê¸«¤Ê¤¤¡¢WEBrick ¤È CGI ¤ÎÆóËÜΩ¤Æ¡£»î¤·¤¿¤Î¤Ï gem ¤ÇÆþ¤ì¤¿ rack 0.4.0

Rack ¤Î»È¤¤Êý¤ÏÆóÃʳ¬¤¢¤ë

Ķ´Êñ¤Ê¥Á¥å¡¼¥È¥ê¥¢¥ë¤òÆÉ¤ó¤Ç¤â¥ê¥Õ¥¡¥ì¥ó¥¹¤ò¸«¤Æ¤â¤³¤Î°ã¤¤¤òÌÀ³Î¤Ë°Õ¼±¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Æ¶ìÏ«¤·¤¿¡£Rack ¤Îµ¡Ç½¤Ë¤Ï°Ê²¼¤ÎÆóÃʳ¬¤¬¤¢¤ë¡£

  1. Handler ¤Ë¤è¤Ã¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥µ¡¼¥Ð¤Î°ã¤¤¤òÃê¾Ý²½¤¹¤ë
  2. rackup ¤Ë¤è¤Ã¤ÆÊØÍø¤Ê¥ß¥É¥ë¥¦¥§¥¢¤ò»È¤¦

¤³¤Î°ã¤¤¤Ï

  • ruby ¤«¤éľÀÜ Rack::Handler::FOO.run( App.new )
  • rackup ¤«¤é run( App.new )

¤Î°ã¤¤¤«¤é¤¯¤ë¡£Íפ¹¤ë¤Ë

¥ß¥É¥ë¥¦¥§¥¢¤ò use ¤·¤¿¤±¤ì¤Ð rackup ¤·¤í

¤Ã¤Æ¤³¤È¡£

µÕ¤Ë¸À¤¦¤È rackup ¤·¤Ê¤¯¤Æ¤â Request, Response ¤ÎÃê¾Ý²½¤Ï¹Ô¤¨¤ë¤Î¤Ç´ðËÜŪ¤Ê¤³¤È¤Ï¤Ç¤­¤ë¡£

¤Ç¤Ï¤½¤ì¤¾¤ì¤ÎÊýË¡¤ò¤â¤¦¾¯¤·¾Ü¤·¤¯¸«¤Æ¤ß¤ë¡£

¢¨ ¥Ö¥³¥á¤¤¤¿¤À¤­¤Þ¤·¤¿¡£¥ß¥É¥ë¥¦¥§¥¢¤ÎÃæ¤Ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òÆÍ¤Ã¹þ¤ó¤Ç¡¢¥ß¥É¥ë¥¦¥§¥¢¤ò Handler ¤ËÅϤ¹¤È¤¤¤¦ÊýË¡¤â¤¢¤ë¤è¤¦¤Ç¤¹¡£¤Ê¤ó¤«¤Á¤ç¤Ã¤ÈÉԻ׵Ĥʴ¶¤¸¤â¤·¤Þ¤¹¤¬¡¢¤½¤â¤½¤âÆâÉô¤Ç¤Ï¥ß¥É¥ë¥¦¥§¥¢¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òºÆµ¢Åª¤Ë wrap ¤¹¤ë¹½Â¤¤Î¤è¤¦¤Ç¤¹¡£

lib/rack/lobster.rb at master from chneukirchen's rack ¡½ GitHub

ruby ¤«¤éľÀÜ Handler ¤ò¸Æ¤ÖÊýË¡

WEBrick ¤ÎÎã

komagata ¤µ¤ó¤Îµ­»ö¤«¤éÇÒ¼Ú¡£

¥¦¥Î¥¦¥é¥Ü Unoh Labs: Rack¤ÇWeb¥¢¥×¥ê¤ÎWeb¥µ¡¼¥Ð¡¼°Í¸¤ò̵¤¯¤¹

#!/usr/bin/env ruby
require 'rubygems'
require 'rack'

class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
  end
end

Rack::Handler::WEBrick.run HelloRack.new, :Port => 3000

¤³¤Î hello-rack.rb ¤ò

ruby hello-rack.rb

¤Çµ¯¤³¤·¡¢¤³¤ì¤Ë¥Ö¥é¥¦¥¶¤«¤é¥¢¥¯¥»¥¹¤¹¤ë¤È

Hello, Rack

¤Èɽ¼¨¤µ¤ì¤ë¡£¤¦¤à¡£

CGI ¤ÎÎã

Ʊ¤¸¤³¤È¤Ï CGI ¤Ç¤âÅöÁ³¤Ç¤­¤ë¡£

#!/usr/bin/env ruby
require 'rubygems'
require 'rack'

class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
  end
end

Rack::Handler::CGI.run HelloRack.new

¤³¤ó¤Ê´¶¤¸¤Ç Handler ¤ò CGI ¤Ë¤·¤Æ¤ä¤ì¤Ð ok. ¤³¤ì¤ò

  • Web ¥µ¡¼¥ÐÇÛ²¼¤Î CGI ¤Î¼Â¹Ô²Äǽ¤Ê¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤¤¤Æ
  • ¼Â¹Ô¸¢¸Â¤òÉÕ¤±¤Æ

¥Ö¥é¥¦¥¶¤«¤é¥¢¥¯¥»¥¹¤·¤Æ¤ä¤ë¤È¤µ¤Ã¤­¤ÈƱ¤¸¤è¤¦¤Ë

Hello, Rack

¤Èɽ¼¨¤µ¤ì¤ë¡£¤á¤Ç¤¿¤·¤á¤Ç¤¿¤·¡£

¤³¤ì¤Ç cgi.rb ¤ò»È¤ï¤Ê¤¯¤Æ¤â Ruby ¤Ç CGI ¤ò½ñ¤±¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤è¡ª

¡ÊCGIAlt ¤¬¤¢¤ë¤È¤«¸À¤ï¤Ê¤¤¤Ç¤Í¡£¡Ë

µ¤¤ò¤Ä¤±¤Ê¤­¤ã¤¤¤±¤Ê¤¤¤³¤È

°Ê²¼¤Ï¼«Ê¬¤Î¤¿¤á¤Î¥á¥â

  • CGI ¤Î¾ì¹ç¤Ï Web ¥µ¡¼¥Ð¤¬¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¾¡¼ê¤Ëµ¯¤³¤·¤Æ¤¯¤ì¤ë¤±¤É¡¢¼Â¹Ô¸¢¸Â¤ÎÉÕÍ¿¤¬É¬Í×
  • WEBrick¡Ê¤Ê¤É¡Ë¤Î¾ì¹ç¤Ï¼«Ê¬¤Ç¥¢¥×¥ê¤òµ¯¤³¤·¤Æ¤ä¤é¤Ê¤¤¤È¤¤¤±¤Ê¤¤

¼«Ê¬¤Î¾ì¹ç¤ÏÀ¸ CGI ¤ò¿¨¤ëµ¡²ñ¤¬¸º¤Ã¤Æ¤¤¤ë¤Î¤Ç¼Â¹Ô¸¢¸Â¤ÎÉÕÍ¿¤ò¤·¤ç¤Ã¤Á¤å¤¦Ëº¤ì¤ë¡£

¤Ç¤â Rack ¤ÎËÜÅö¤Î°ÒÎϤòÌ£¤ï¤¦¤Ê¤é rackup

rackup ¤Ï

rackup -s webrick [config file]

¤Ê¤É¤È¤·¤Æ server(handler) ¤ò»ØÄꤷ¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥µ¡¼¥Ð¤òµ¯Æ°¤¹¤ë¡£rackup ¤¬¹Ô¤ï¤ì¤ë¤È¡¢Ãæ¤Ç

Rack::Builder

¤¬¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥µ¡¼¥Ð¤Î´Ä¶­¤òºî¤Ã¤Æ¤¯¤ì¡¢¼«Ê¬¤Î½ñ¤¤¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¤³¤ÎÃæ¤Ç¼Â¹Ô¤µ¤ì¤ë¡£

¤³¤³¤Ç½é¤á¤Æ use ¤¬»È¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£

¤â¤¦¤Á¤ç¤Ã¤ÈºÙ¤«¤¯¸«¤Æ¤ß¤è¤¦¡£

use ¤Ï Rack::Builder ¤Î instance_method

Rack ¤Ç¥ß¥É¥ë¥¦¥§¥¢¤òÄɲ乤ë use ¤Ï Rack::Builder ¤Î instance_method ¤È¤Ê¤Ã¤Æ¤¤¤ë¡£

irb(main):001:0> require 'rack'
=> true
irb(main):002:0> Rack::Builder.methods.grep( /use/ )
=> []
irb(main):003:0> Rack::Builder.instance_methods.grep( /use/ )
=> ["use"]

¤Ä¤Þ¤ê

require 'rack'

¤·¤¿¤À¤±¤Ç¤Ï use ¤Ï»È¤¨¤Ê¤¤¡£

rackup ¤Îή¤ì

rackup ¤òÆÉ¤ó¤Ç¤ß¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï rackup ¤ÎÃæ¤Ç°Ê²¼¤Î¤è¤¦¤Ë¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¡£¡Ê¾ÜºÙ¤ÏüÀޤäƤ¢¤ë¡Ë

Rack::Builder.new {
  run inner_app
}

¤Ä¤Þ¤ê¤½¤¦¤¤¤¦¤³¤È¡£Rack ¤ÎÊØÍøµ¡Ç½¤ò»È¤¤¤¿¤±¤ì¤Ð rackup ¤¹¤Ù¤·¡£

¤Ç¤Ï¼ÂºÝ¤Ë rackup ¤·¤Æ¤ß¤ë¡£

WEBrick ¤ÎÎã
ľÀܵ¯Æ°¤Ç use ¤Î»È¤¨¤Ê¤¤ÍÍ»Ò

¤µ¤­¤Û¤É¤Î hello-rack.rb ¤Ë use ¤ò²Ã¤¨¤ë¡£

#!/usr/bin/env ruby
require 'rubygems'
require 'rack'

use Rack::ShowExceptions

class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
  end
end

Rack::Handler.WEBrick.run HelloRack.new, :Port => 3000

¤¹¤ë¤È¡¢ÅöÁ³¤Ê¤¬¤é

$ ruby hello-rack.rb
hello-rack.rb:6: undefined method `use' for main:Object (NoMethodError)

Åܤé¤ì¤ë¡£use ¤Ê¤ó¤Æ»È¤¨¤Ê¤¤¡£

rackup ¤·¤Æ¤ß¤ë
#! /usr/bin/env ruby
require 'rubygems'
require 'rack'

use Rack::ShowExceptions

class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
    cho_www
  end
end

run HelloRack.new

¤³¤³¤ÇÃíÌܤ·¤Æ¤Û¤·¤¤¤Î¤Ï¡¢

  • cho_www ¤È¤¤¤¦ syntax error ¤ò¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÃæ¤Ë»Å¹þ¤ó¤Ç¤¢¤ë¤È¤³¤í
  • run ¤Î¸Æ¤ÓÊý¤òÊѤ¨¤¿¤È¤³¤í

¤É¤¦¤â

rackup ¤¹¤ë¤È¤­¤Ï Handler ¤Ï³°¤«¤é¡Êrackup ¤Î -s ¥ª¥×¥·¥ç¥ó¤Ç¡Ë»ØÄꤷ¤Æ¤¢¤²¤¿Êý¤¬¤Ê¤ó¤«¤¦¤Þ¤¯¤¤¤¯´¶¤¸¡£

¤³¤ì¤ò hello-rack.ru ¤Î̾Á°¤ÇÊݸ¤·¡¢

rackup -s webrick -p 3000 hello-rack.ru

WEBrick ¤ò rackup ¤·¤Æ¥Ö¥é¥¦¥¶¾å¤Ç Trace Back

¤Ç¼Â¹Ô¡£

¤´Í÷¤Î¤è¤¦¤Ë¥Ö¥é¥¦¥¶¾å¤Ë Exception ¤òɽ¼¨¤Ç¤­¤ë¡£²èÁü¤Ç¤ÏüÀޤäƤ¢¤ë¤¬ TraceBack ¤âɽ¼¨¤Ç¤­¤ë¡£ÅöÁ³¤Î¤³¤È¤Ê¤¬¤é cho_www ¤òºï½ü¤¹¤ì¤ÐÉáÄÌ¤ËÆ°¤¯¡£

CGI ¤ÎÎã

ľÀܵ¯¤³¤·¤Æ use ¤·¤Æ¥À¥á¤Ê¤Î¤Ï¤µ¤Ã¤­ WEBrick ¤Ç¸«¤¿¤Î¤Ç¾Êά¡£

rackup ¤¹¤ë

ru ¥Õ¥¡¥¤¥ë¤Ï¤µ¤Ã¤­ÍѰդ·¤¿ hello-rack.ru ¤ò¤½¤Î¤Þ¤ÞÍøÍÑ¡£CGI ¤ÎÊý¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤¹¤ë¡£

#! /bin/sh

/opt/local/bin/rackup hello-rack.ru

CGI ¤Ç¤â use Rack::ShowExceptions ¤¬»È¤¨¤¿¡ª

¥Ñ¥¹¤¬ /opt/local/bin ¤Ê¤Î¤Ï MacPorts ¤ÇÆþ¤ì¤¿ Ruby ¤Ç gem ¤ò»È¤Ã¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤·¤Æ¤¤¤ë¤«¤é¡£rackup ¤Î¥Ñ¥¹¤ÏŬµ¹Ä´À°¤¹¤ë¤³¤È¡£

¤³¤ì¤ò hello-rack.cgi ¤Î̾Á°¤ÇÊݸ¡¢¤´¤Ë¤ç¤´¤Ë¤ç¤·¤Æ¥Ö¥é¥¦¥¶¤«¤é¥¢¥¯¥»¥¹¤·¤Æ¤ß¤ë¡£²èÁü¤ÎÃæ¤Î URL ¤Î°ã¤¤¤ËÃíÌÜ¡£³Î¤«¤Ë CGI ¤Çư¤¤¤Æ¤¤¤ë¡£

¤¿¤À¤·¡¢ÅöÁ³¤Î¤³¤È¤Ê¤¬¤é CGI ¤Ç rackup ¤¹¤ë¤Î¤ÏÉé²ÙŪ¤Ë¤ÏÉÔÍø¡£

½¾Íè¤Îή¤ì
  1. shebang ¤«¤é Ruby ¤òµ¯Æ°
  2. ¼«Ê¬¼«¿È¤òÆÉ¤ß¹þ¤Þ¤»¤ë
rackup »þ¤Îή¤ì
  1. shebang ¤Ç sh ¤ä¾¤Î¥¤¥ó¥¿¥×¥ê¥¿¤«¤é
  2. rackup ¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤·
  3. ¤½¤³¤«¤é ruby ¤¬¸Æ¤Ð¤ì
  4. ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬¥í¡¼¥É¤µ¤ì¤ë

¤È¤¤¤¦Ä¹¤¤Æ»¤Î¤ê¤òÍפ¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡£¤Ç¤â¥á¥ê¥Ã¥È¤Ç¤«¤¤¤·¡£

¤ï¤¶¤ï¤¶ÊÌ¥×¥í¥»¥¹¤Î rackup ¤«¤éµ¯Æ°¤·¤Ê¤¯¤Æ¤â¤¤¤ó¤¸¤ã¤Í¡©¤È»×¤¤¤¿¤¤¤Î¤Ïʬ¤«¤ë¡£¼«Ê¬¤â»×¤Ã¤¿¡£¤Ç¤â·ë¶É rackup ¤ÈƱ¤¸¤È¤Þ¤Ç¤Ï¤¤¤«¤Ê¤¤¤Þ¤Ç¤â»÷¤¿¤è¤¦¤Êή¤ì¤Ç Rack::Builder ¤ò¸Æ¤ó¤Ç¤¢¤²¤Ê¤­¤ã¤¤¤±¤Ê¤¤¤Î¤Ç¡¢Rack ¤ËÍê¤ë¤¦¤Þ¤ß¤¬Çö¤ì¤Á¤ã¤¦¤è¤Í¡©¤È»×¤¦¤Î¤Ç¤½¤¦¤¤¤¦¤³¤È¤Ï¤·¤Ê¤¤¤³¤È¤Ë¤·¤¿¡£

¤Þ¤È¤á

²¿¤Ï¤È¤â¤¢¤ì¡¢Rack ¤Î´ðËÜŪ¤Ê»È¤¤Êý¤Ïʬ¤«¤Ã¤¿¡£map ¤È¤«¤Ïʬ¤«¤Ã¤Æ¤Ê¤¤¤±¤É¡¢¤³¤ì¤Ç

  1. WEBrick ¤Ç³«È¯
  2. ¤È¤ê¤¢¤¨¤º CGI ¤Ç deploy
  3. Éé²ÙŪ¤Ë¤Þ¤º¤¤¤Î¤Ç FastCGI ¤Ë¤·¤Þ¤·¤ç¤¦¤«

¤È¤¤¤Ã¤¿½ÀÆð¤Ê±¿ÍѤ¬²Äǽ¤Ë¤Ê¤Ã¤¿¡£

¤è¤·¤è¤·¡£

»²¹Í

Tags: Rack Ruby Web

*1 ¤È¤¤¤¦¤«²ÃÎð¤È¤È¤â¤ËÍî¤Á¤ë°ìÊý¤À¤¼¡ª ¥ª¥ì¤Ï10Âå¤Î¼ã¼Ô¤¸¤ã¤Í¤§¡ª