我有一个sinatra应用程序,它有一个get
路由。它做了相当多的工作,因此大约需要一分钟才能完成任务。当我尝试curl
时,一切都很好,但我没有得到响应代码或任何相关的东西。curl
超时,如果我在浏览器上尝试,它也会超时。而且两者都在30秒内超时。
我一直在努力寻找增加服务器超时的方法。有线索吗?
似乎有一种方法可以使用将设置传递给Sinatra使用的服务器
set :server_settings, :timeout => 60
因此,如果您使用thin,您可以使用Fábio Perez所述的超时设置。
GitHub中有关于这个设置的讨论,所以如果你决定使用它,你应该阅读它。
我遇到了类似的问题,我找到了两种解决方案:
- 显式运行
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
:相同的目录中添加了一个机架配置文件
# 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