【问题标题】:Sinatra Rack Session lost after 5 to 10 secondsSinatra 机架会话在 5 到 10 秒后丢失
【发布时间】:2016-01-18 00:48:40
【问题描述】:

我有以下设置:

通过 nginx 代理的 Sinatra 应用,在 nginx-configuration 中定义了重定向:

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

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

有人可以帮忙吗?

类似的问题是:

Rack Sessions getting lost in Chrome

Sinatra not persisting session with redirect on Chrome

【问题讨论】:

  • 您的 Sinatra 应用程序运行情况如何?
  • 你的意思是:“rerun -- unicorn -c unicorn.rb -E test”?顺便说一句,当我使用答案 stackoverflow.com/a/19251746/2767626(基于 Rack::Session:Cookie)时,一切正常!
  • 使用rerun 可以解释它。如果rerun 出于某种原因重新启动您的应用程序,那么基于内存的会话(在Rack::Session::Pool 中)将会丢失。基于 Cookie 的会话仍然有效。目录中是否有任何更改会导致rerun 重新启动应用程序?

标签: ruby nginx sinatra rack


【解决方案1】:

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

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

我不知道是否有办法连接这些池,但我认为转移到外部会话存储(如 Redis)会更容易。 Redis 通过 redis-rack gem 轻松与 Rack 集成,因此您应该尝试一下。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 2011-05-26
    • 2013-03-31
    • 2012-08-26
    • 2012-04-08
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多