如何将ruby thin与CGI脚本一起使用?

如何将ruby thin与CGI脚本一起使用?,ruby,cgi,rack,thin,Ruby,Cgi,Rack,Thin,我已经编写了一些ruby CGI脚本(使用ruby CGI类),我使用lighttpd从生产服务器提供这些脚本。我想在我的开发服务器上使用thin测试它们。基本上,我希望将所有CGI脚本放到一个目录中,然后在该目录中开始精简。那么,有什么要求吗http://localhost:3000/ 应该只在当前目录中执行并返回结果。如果thin有一个内置的方法来做这件事,我找不到它。如果你知道你在做什么的话,我想这个机架配置文件很容易,但我不知道 更新: 这个档案似乎有用。我不确定这是否是最好的解决方案,

我已经编写了一些ruby CGI脚本(使用ruby CGI类),我使用lighttpd从生产服务器提供这些脚本。我想在我的开发服务器上使用thin测试它们。基本上,我希望将所有CGI脚本放到一个目录中,然后在该目录中开始精简。那么,有什么要求吗http://localhost:3000/ 应该只在当前目录中执行并返回结果。如果thin有一个内置的方法来做这件事,我找不到它。如果你知道你在做什么的话,我想这个机架配置文件很容易,但我不知道

更新:

这个档案似乎有用。我不确定这是否是最好的解决方案,但对于开发环境来说应该是不错的

run(lambda do |env|
  require 'rubygems'
  require 'systemu'
  script = env['REQUEST_PATH'][1..-1] + '.rb'
  response = '' 
  err = ''
  systemu(['ruby', script], 'stdout' => response, 'stderr' => err, 'env' => { 
    'foo' => 'bar' })
  if err.length > 0 
    [ 500, {'Content-Type' => 'text/plain'}, err ]
  else
    idx = 0
    status = -1
    headers = {}
    while true
      line_end = response.index("\n", idx)
      line = response[idx..line_end].strip
      idx = line_end+1

      if status < 0
        if line =~ /(\d\d\d)/
          status = $1.to_i
        else
          raise "Invalid status line: #{line}"
        end
      elsif line.empty?
        break
      else
        name, value = line.split /: ?/
        headers[name] = value
      end
    end
    content = response[idx..-1]
    [status, headers, content]
  end
end)
run(lambda do|env|
需要“rubygems”
需要“systemu”
script=env['REQUEST_PATH'][1..-1]+'.rb'
响应=“”
错误=“”
systemu(['ruby',script],'stdout'=>response,'stderr'=>err,'env'=>
‘foo’=>‘bar’})
如果err.length>0
[500,{'Content-Type'=>'text/plain'},错误]
其他的
idx=0
状态=-1
标题={}
虽然是真的
行\u end=response.index(“\n”,idx)
line=响应[idx..line\U end]。条带
idx=线端+1
如果状态<0
如果行=~/(\d\d\d)/
状态=$1.5至$1
其他的
引发“无效状态行:#{line}”
终止
艾尔希夫行。空吗?
打破
其他的
名称,值=line.split/:/
标题[名称]=值
终止
终止
内容=响应[idx..-1]
[状态、标题、内容]
终止
(完)

我有点不清楚为什么机架是必需的。如果您使用Ruby的内置CGI模块编写脚本,您应该能够告诉thin将目录视为
CGI-bin
,就像这样,Ruby CGI将处理其余部分。如果thin不能做到这一点,那么lighttpd可能是更好的解决方案