Resque is not picking up Redis configuration settings
redis, resque, ruby-on-rails, unicorn
Solution
UPDATED Totally different idea based on @lmarlow's comment to a resque issue.
I bet it breaks wherever you have Redis ~>3 (I mean the ruby client version, not the server version).
As of this writing, Resque needs Redis ~>2 but doesn't specify that in its gemspec. Therefore you have to help it out by adding this to your Gemfile:
gem 'redis', '~>2' # until a new version of resque comes out
gem 'resque'
Also, make sure that bundler is being used everywhere. Otherwise, if your system has a new version of the Redis gem, it will get used and Resque will fail like before.
Finally, a cosmetic note... you could simplify the config to:
# config/initializers/redis.rb
$resque_redis_url = uris_per_environment[rails_env] # note no URI.parse
Resque.redis = $resque_redis_url
and then
# unicorn.rb bootup file
after_fork do |server, worker|
Resque.redis = $resque_redis_url
end
Problem
I am having unexpected and significant problems trying to get a Rails app, running under Unicorn, to connect to a password-protected Redis server. Using `bundle exec rails c production` on the command line, I can issue commands through Resque.redis. However, it seems that my configuration is being lost when it's forked under Unicorn. Using a non-password-protected Redis server Just Works. However, I intend to run workers on other servers than where the Redis server lives, so I need this to be password protected. I have also had success in using a password protected (using the same technique) but using Passenger rather than Unicorn. I have the following setup: ``` # config/resque.yml development: localhost:6379 test: localhost:6379 production: redis://user:PASSWORD@oak.isc.org:6379 ``` . ``` # 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) ``` . ``` # 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 ``` .