Sinatra Rack Session在5到10秒后丢失

时间:2015-10-19 15:30:52

标签: ruby nginx sinatra rack

我有以下设置:

Sinatra app通过nginx代理,并在nginx配置中定义了重定向:

http://www.example.com/apihttp://api.example.com

我使用以下内容初始化会话:

use Rack::Session::Pool

现在我可以使用以下方式存储和检索会话数据

  get '/make_it_so' do
    session[:data] = 'yes indeed.'
  end

  get '/what_gives' do
    session[:data]
  end

对于3到5次重新加载http://www.example.com/what_gives我可以看到会话数据,然后突然消失为零。

有人可以帮忙吗?

类似的问题是:

Rack Sessions getting lost in Chrome

Sinatra not persisting session with redirect on Chrome

1 个答案:

答案 0 :(得分:0)

我认为你的问题可能是独角兽工人。据我所知,Unicorn为每个工人创建一个应用程序实例。不幸的是,这些实例中的每一个都会有一个单独的会话池,因此这只适用于1名工作人员。

我遇到了同样的问题,并不是说会话随着时间的推移而丢失,而是这些请求正由不同的工作人员处理。假设您的第一个请求命中工作者1并且它设置了会话密钥' sessionkey1',您将获得具有相同值的cookie。然后你发出第二个请求并且它命中工人2,它将找不到你的密钥,因此你将被分配一个新的会话和cookie,使你的会话看起来像是丢失了。

我不知道是否有办法连接这些池,但我认为移动到Redis这样的外部会话商店会更容易。 Redis可以通过redis-rack gem轻松地与Rack集成,因此您应该尝试一下。

希望这有帮助。