在Heroku的Sinatra应用程序中,会话不是跨越Dynos共享的

这是有道理的。 但对于这个问题,有哪些首选的工作方法呢?

在我的评论中,我建议使用基于机架cookie的会话 ,但是看一下,Sinatra会话无论如何都是 Rack cookie会话。

再往前看 ,我在Sinatra文档中发现了这一点 :

为了提高安全性,cookie中的会话数据使用会话密钥进行签名。 Sinatra为您生成一个随机秘密。 但是,由于此秘密会随着应用程序的每次启动而改变,您可能希望自己设置秘密,因此所有应用程序实例都共享它:

set :session_secret, 'super secret'

因此,似乎每个Heroku dyno都会生成不同的密钥,因此无法读取每个其他会话cookie,并且您需要指定一个密钥,以便每个dyno使用相同的密钥。

您可能更好地设置环境变量 ,而不是在源代码中添加密钥。

 $ heroku config:add SESSION_KEY=a_longish_secret_key 

然后在你的sinatra应用程序中:

 enable :sessions set :session_secret, ENV['SESSION_KEY'] 

您还可以使用memcached会话来提高性能或安全性。 没试过但看起来很简单。 在heroku上免费5MB。

 # In your app.rb file just add following - enable :sessions set :session_secret, "some_random_value"