Ruby Sinatra应用程序在生产中存在会话问题

Ruby Sinatra应用程序在生产中存在会话问题,ruby,session,sinatra,passenger,Ruby,Session,Sinatra,Passenger,我一直在使用Sinatra开发Ruby中的web应用程序。在开发过程中,我从来没有遇到过很多关于会话的问题。然而,现在我使用passenger来实际部署应用程序,我有很多关于会话数据不断“重置”的问题 我见过其他与此问题相关的堆栈溢出问题,但还没有为我解决。我试过几件事: (给我一个错误:Rack application对象中的异常NoMethodError(nil:NilClass的未定义方法'foreign_key')) 似乎什么也帮不上忙真的。。。我要么最终出错,要么每次请求都会

我一直在使用Sinatra开发Ruby中的web应用程序。在开发过程中,我从来没有遇到过很多关于会话的问题。然而,现在我使用passenger来实际部署应用程序,我有很多关于会话数据不断“重置”的问题

我见过其他与此问题相关的堆栈溢出问题,但还没有为我解决。我试过几件事:

  • (给我一个错误:Rack application对象中的异常NoMethodError(nil:NilClass的未定义方法'foreign_key'))
似乎什么也帮不上忙真的。。。我要么最终出错,要么每次请求都会重置会话。我知道passenger可能使用了多个线程,这就是会话无法工作的原因,但我似乎无法找到解决问题的方法

我是不是漏掉了什么明显的东西?有什么建议吗

Gemfile

source "https://rubygems.org"

gem 'mongo', '1.8.6'
gem 'sinatra', '1.4.8'
gem 'mongo_mapper'
gem 'bson_ext'
gem 'active_model_serializers'
gem 'activemodel-serializers-xml'
gem 'sinatra-flash'
gem 'sinatra-param', require: 'sinatra/param'
gem 'rack-recaptcha2', git: 'https://github.com/nicolas-simplex/rack-    recaptcha'
gem 'mail'
gem 'slugify'
gem 'biz'
gem 'bcrypt'
gem 'redis-rack'

group :development do
  gem 'mailcatcher', '~> 0.6.4'
end
require 'rubygems'
require 'bundler/setup'
require 'sinatra'

require 'slugify'

class App < Sinatra::Base
  use Rack::Protection

  set :bind, '0.0.0.0'
end

require_relative './config/init'  # Initialize configuration files
require_relative './helpers/init' # Initialize helpers
require_relative './routes/init'  # Initialize routes
require_relative './models/init'  # Initialize models

require_relative './util/tokens'  # Token utility

... # Some database seeding, basic setup for some data I use
config.ru
它有不同的形式,这取决于我是使用Rack::Session::Pool、Memcache还是Redis。这是我在redis上使用的:

require 'rubygems'
require 'sinatra'
require File.expand_path '../app.rb', __FILE__

require 'rack'
require 'rack/session/redis'

require_relative './app'

app = App.new

sessioned = use Rack::Session::Redis.new(app)

run sessioned
App.rb

source "https://rubygems.org"

gem 'mongo', '1.8.6'
gem 'sinatra', '1.4.8'
gem 'mongo_mapper'
gem 'bson_ext'
gem 'active_model_serializers'
gem 'activemodel-serializers-xml'
gem 'sinatra-flash'
gem 'sinatra-param', require: 'sinatra/param'
gem 'rack-recaptcha2', git: 'https://github.com/nicolas-simplex/rack-    recaptcha'
gem 'mail'
gem 'slugify'
gem 'biz'
gem 'bcrypt'
gem 'redis-rack'

group :development do
  gem 'mailcatcher', '~> 0.6.4'
end
require 'rubygems'
require 'bundler/setup'
require 'sinatra'

require 'slugify'

class App < Sinatra::Base
  use Rack::Protection

  set :bind, '0.0.0.0'
end

require_relative './config/init'  # Initialize configuration files
require_relative './helpers/init' # Initialize helpers
require_relative './routes/init'  # Initialize routes
require_relative './models/init'  # Initialize models

require_relative './util/tokens'  # Token utility

... # Some database seeding, basic setup for some data I use
需要“rubygems”
需要“捆绑机/设置”
需要“sinatra”
需要“slagify”
类应用程序
TL;DR

Sinatra和Passenger一起在生产中重置会话,而这在开发中不会发生。

在进一步研究后,我发现了配置选项Passenger\u Stick\u sessions。因为在我的web应用程序中,会话存储非常重要,这对我来说很好。但是,不建议在所有用例中都使用此选项,因为所有客户端发送的消息都将路由到相同的原始应用程序进程

文件:

启用nginx/sites中我的conf文件中的这个配置参数“on”,我就可以使用简单的机架会话池:

use Rack::Session::Pool, path: '/', expire_after: 2592000