使用nginx工作在Phusion Passenger上的Sequel DB连接的正确位置

我使用Sinatra + Sequeltesting了使用ruby编写的应用程序。

config.ru:

require './main' run Sinatra::Application 

示例代码:

 require 'sinatra' require 'haml' require 'sequel' DB=Sequel.connect('oracle://test:test@test') class Tarification < Sequel::Model(DB[:test_table]) end get '/' do haml :index end 

在我的testing环境中开始使用Phusion Passenger之前,一切正常。 现在我在nginx error.log中有exception:

Sequel :: DatabaseError – RuntimeError:连接不能在分叉进程中重用。

将数据库连接例程放置在rackup文件config.ru中是正确的,还是以不同的方式做到这一点? 如果第一个变体比如何从应用程序代码中调用连接正确?

PS:我知道我可以做passenger_spawn_method conservative并继续在应用程序代码中打开连接,但由于速度和资源使用问题,这不是我要找的方式。

这个问题记录在Phusion乘客手册的附录C.3中。 通常的方法是钩入post-fork回调并在那里重新建立连接。

对不起,我没有在Passenger上检查它的能力,我不知道它会工作,但是在配置块中连接是更正确的:

 configure do Sequel.connect(ENV['DATABASE_URL'] || 'sqlite://blog.db') end 

例如形式为Scanty – 另一个伟大的Sinatra + Sequel应用程序。