我有一个有get
路线的sinatra应用程序。它做了相当多的工作,因此完成任务大约需要一分钟。当我尝试curl
时,一切正常,但我没有收到响应代码或任何相关内容。 curl
超时,如果我在浏览器上试用它也会超时。而且两者都在30秒内超时。
我一直试图找到一种方法来增加服务器超时。任何线索?
答案 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 中讨论此设置,以便您阅读。