Sinatra服务器响应超时

时间:2013-12-13 20:25:52

标签: ruby sinatra

我有一个有get路线的sinatra应用程序。它做了相当多的工作,因此完成任务大约需要一分钟。当我尝试curl时,一切正常,但我没有收到响应代码或任何相关内容。 curl超时,如果我在浏览器上试用它也会超时。而且两者都在30秒内超时。

我一直试图找到一种方法来增加服务器超时。任何线索?

2 个答案:

答案 0 :(得分:3)

我有类似的问题,我找到了两个解决方案:

  • 显式运行thin服务器删除了响应超时。
  • 流处理响应使连接保持打开状态,即使我在处理期间只传输无意义的空白字符。

重现问题

这是我创建的一个简单的示例脚本来显示问题:

# my_app.rb
require 'json'
require 'rubygems'
require 'sinatra'

get '/process/:count' do
  count = params[:count].to_i
  count.times do
    sleep 10
  end
  "Processed #{count} items.".to_json
end

我通过调用ruby my_app.rb启动它。

它表示通过睡眠10秒来处理每个项目的努力。

如果我使用curl请求处理两个项目,则会在20秒后成功响应。如果我尝试处理四个项目,服务器会在30秒后关闭连接。

$ date ; curl http://localhost:4567/process/2 ; echo ; date
Fri Mar 18 11:35:00 PDT 2016
"Processed 2 items."
Fri Mar 18 11:35:20 PDT 2016
$ date ; curl http://localhost:4567/process/4 ; echo ; date
Fri Mar 18 11:35:28 PDT 2016
curl: (52) Empty reply from server

Fri Mar 18 11:35:58 PDT 2016

以瘦

运行

我在my_app.rb所在的目录中添加了一个rackup配置文件:

# config.ru (run with rackup)
require './my_app'
run Sinatra::Application

然后我像这样运行服务器:

thin -R config.ru start

现在它似乎没有任何响应超时。

$ date ; curl http://localhost:3000/process/2 ; echo ; date
Fri Mar 18 13:18:43 PDT 2016
"Processed 2 items."
Fri Mar 18 13:19:03 PDT 2016
$ date ; curl http://localhost:3000/process/4 ; echo ; date
Fri Mar 18 13:19:08 PDT 2016
"Processed 4 items."
Fri Mar 18 13:19:48 PDT 2016

流媒体响应

如果您无法更改启动服务器的方式,则可以通过切换到流响应并在处理每个项目之前返回空格来解决问题。领先的空间不应该破坏JSON或HTML响应。

# my_app2.rb
require 'json'
require 'rubygems'
require 'sinatra'

get '/process/:count' do
  count = params[:count].to_i
  stream do |out|
    count.times do
      out << " "
      sleep 10
    end
    out << "Processed #{count} items.".to_json
  end
end

现在服务器保持连接打开状态。

$ date ; curl http://localhost:4567/process/2 ; echo ; date
Fri Mar 18 11:37:23 PDT 2016
  "Processed 2 items."
Fri Mar 18 11:37:43 PDT 2016
$ date ; curl http://localhost:4567/process/4 ; echo ; date
Fri Mar 18 11:37:48 PDT 2016
    "Processed 4 items."
Fri Mar 18 11:38:28 PDT 2016

答案 1 :(得分:1)

似乎有一种方法可以将设置传递给Sinatra使用的服务器:

set :server_settings, :timeout => 60

因此,如果您使用精简,则可以使用FábioPerez所描述的超时设置。

如果您决定选择使用,请在GitHub 中讨论此设置,以便您阅读