Resque没有获取Redis配置设置

Mic*_*aff 6 ruby-on-rails unicorn resque redis

我试图获得在Unicorn下运行的Rails应用程序连接到受密码保护的Redis服务器时出现意外和重大问题.

使用bundle exec rails c production命令行中,我可以通过Resque.redis发出命令.但是,当它在Unicorn下分叉时,我的配置似乎正在丢失.

使用非密码保护的Redis服务器Just Works.但是,我打算在其他服务器上运行工作程序,而不是Redis服务器所在的服务器,因此我需要密码保护.

我也成功地使用了密码保护(使用相同的技术)但使用Passenger而不是Unicorn.

我有以下设置:

# config/resque.yml

development: localhost:6379
test: localhost:6379
production: redis://user:PASSWORD@oak.isc.org:6379
Run Code Online (Sandbox Code Playgroud)

.

# config/initializers/redis.rb

rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..'
rails_env = ENV['RAILS_ENV'] || 'development'

$resque_config = YAML.load_file(rails_root + '/config/resque.yml')
uri = URI.parse($resque_config[rails_env])
Resque.redis = Redis.new(host: uri.host, port: uri.port, password: uri.password)
Run Code Online (Sandbox Code Playgroud)

.

# unicorn.rb bootup file

preload_app true

before_fork do |server, worker|
  Redis.current.quit
end

after_fork do |server, worker|
  Redis.current.quit
end
Run Code Online (Sandbox Code Playgroud)

.

rei*_*yse 6

好吧,为了其他可能在谷歌上搜索这个问题的人,我至少为自己解决了这个问题

基本问题是在代码中调用Redis.new其他位置,例如在地理编码器设置或独角兽配置文件​​中.

只要确保每次调用初始化Redis时都传递适当的值,例如

REDIS = Redis.connect(:url =>  ENV['REDISTOGO_URL'])
Run Code Online (Sandbox Code Playgroud)

无处不在,你永远不应该

Redis.new 
Run Code Online (Sandbox Code Playgroud)

因为它将默认为localhost和默认端口


Sea*_*ere 5

根据@ lmarlow对resque问题的评论,更新了完全不同的想法.

我打赌它会在你拥有Redis的地方打破〜> 3(我的意思是ruby客户端版本,而不是服务器版本).

在撰写本文时,Resque需要Redis~> 2,但未在其gemspec中指定.因此,您必须通过将其添加到您的Gemfile来帮助它:

gem 'redis', '~>2' # until a new version of resque comes out
gem 'resque'
Run Code Online (Sandbox Code Playgroud)

此外,确保在任何地方都使用捆绑器.否则,如果您的系统有新版本的Redis gem,它将被使用,Resque将像以前一样失败.

最后,一个化妆品说明......你可以简化配置:

# config/initializers/redis.rb
$resque_redis_url = uris_per_environment[rails_env] # note no URI.parse
Resque.redis = $resque_redis_url
Run Code Online (Sandbox Code Playgroud)

然后

# unicorn.rb bootup file
after_fork do |server, worker|
  Resque.redis = $resque_redis_url
end
Run Code Online (Sandbox Code Playgroud)