2012-06-06 8 views
6

Ich habe unerwartete und schwerwiegende Probleme beim Versuch, eine Rails-App unter Unicorn zu erhalten, um eine Verbindung zu einem passwortgeschützten Redis-Server herzustellen.Resque nimmt keine Redis-Konfigurationseinstellungen auf

Mit bundle exec rails c production in der Befehlszeile kann ich Befehle über Resque.redis erteilen. Es scheint jedoch, dass meine Konfiguration verloren geht, wenn sie unter Unicorn gegabelt wird.

Verwenden eines nicht passwortgeschützten Redis-Servers Just Works. Ich beabsichtige jedoch, Mitarbeiter auf anderen Servern als dem, auf dem der Redis-Server lebt, zu betreiben. Daher muss ich dieses Passwort schützen.

Ich hatte auch Erfolg in der Verwendung eines passwortgeschützten (mit der gleichen Technik), aber mit Passenger anstelle von Unicorn.

Ich habe folgendes Setup:

# config/resque.yml 

development: localhost:6379 
test: localhost:6379 
production: redis://user:[email protected]: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 

.

Antwort

4

AKTUALISIERT Völlig andere Idee basierend auf @lmarlow's comment to a resque issue.

Ich wette, es bricht wo immer Sie haben Redis ~> 3 (ich meine die Ruby-Client-Version, nicht die Server-Version).

Zum Zeitpunkt des Schreibens benötigt Resque Redis ~> 2, spezifiziert dies jedoch nicht in seiner Gemspec. Deshalb müssen Sie ihm helfen, indem Sie diesen in Ihre Gemfile aus:

gem 'redis', '~>2' # until a new version of resque comes out 
gem 'resque' 

Stellen Sie außerdem sicher, dass bundler überall verwendet wird. Andernfalls, wenn Ihr System eine neue Version des Redis-Edelsteins hat, wird es verwendet und Resque wird wie zuvor fehlschlagen.

schließlich eine kosmetische Note ... Sie die Config vereinfachen könnte:

# config/initializers/redis.rb 
$resque_redis_url = uris_per_environment[rails_env] # note no URI.parse 
Resque.redis = $resque_redis_url 

und dann

# unicorn.rb bootup file 
after_fork do |server, worker| 
    Resque.redis = $resque_redis_url 
end 
+0

Ich habe dies versucht (vereinfacht, Speichern der Konfig in einem globalen) und sogar hart codiert die Verbindungszeichenfolge in der after_fork Hook als 'Resque.redis =" redis: // user: [email protected]: 6379 "Aber leider kein Erfolg. Rescue-Mitarbeiter arbeiten, Rails Web App kann es nicht verwenden. Wenn ich den Port ändere, verfolgen die Mitarbeiter dies, die App nicht. –

+0

Wenn Sie eine Rails-Konsole in Produktion starten, was ist die Ausgabe von 'Resque.redis'? –

+1

Von der Konsole funktioniert alles genau wie erwartet, und Resque.redis.info (zum Beispiel) gibt Informationen vom Server zurück. Wenn ich ein ungültiges Passwort verwende, erhalte ich den Fehler "password is wrong" (falsches Passwort), so dass ich weiß, dass es korrekt auf der Konsole verbunden ist. Selbst das Ausführen von 'Resque.redis.quit', gefolgt von demselben 'Resque.redis =" url "' - Befehl, funktioniert von der Konsole aus. –

6

Ok, im Interesse der anderen Menschen, die vielleicht dieses Problem werden googeln, Ich habe das für mich selbst gelöst mindestens

Grundproblem ist Redis.new andere Stellen im Code, z in Ihrer Geocoder-Setup- oder Unicorn-Konfigurationsdatei.

nur sicherstellen, dass jedes Mal, wenn Sie Redis initialisieren, übergeben Sie die entsprechenden Werte z.so etwas wie

REDIS = Redis.connect(:url => ENV['REDISTOGO_URL']) 

überall und Sie sollten nie

Redis.new 

haben, wie es auf localhost und der Standardport

+0

danke, das war auch mein Problem –

+0

danke - das hat es für mich gelöst –

2

Dies war hilfreich für mich ausfällt:

Quelle: https://github.com/redis/redis-rb/blob/master/examples/unicorn/unicorn.rb

require "redis" 

worker_processes 3 

# If you set the connection to Redis *before* forking, 
# you will cause forks to share a file descriptor. 
# 
# This causes a concurrency problem by which one fork 
# can read or write to the socket while others are 
# performing other operations. 
# 
# Most likely you'll be getting ProtocolError exceptions 
# mentioning a wrong initial byte in the reply. 
# 
# Thus we need to connect to Redis after forking the 
# worker processes. 

after_fork do |server, worker| 
    Redis.current.quit 
end 
2

Was für mich gearbeitet wurde das Einhorn Config hier: https://stackoverflow.com/a/14636024/18706

before_fork do |server, worker| 
    if defined?(Resque) 
    Resque.redis.quit 
    Rails.logger.info("Disconnected from Redis") 
    end 
end 

after_fork do |server, worker| 
    if defined?(Resque) 
    Resque.redis = REDIS_WORKER 
    Rails.logger.info("Connected to Redis") 
    end 
end 
0

Ich denke, das Problem mit Resque-Bahn war. Seine Konfigurationsdatei, sie haben es jetzt behoben. In der Version 0.0.11, erwähnen sie es in einem Kommentar auch: https://github.com/resque/resque-web/blob/master/config/initializers/resque_config.rb#L3

Früher ihre Datei sah wie folgt aus: https://github.com/resque/resque-web/blob/v0.0.9/config/initializers/resque_config.rb

Und wenn aus irgendwelchen Gründen, können Sie nicht aktualisieren, dann lieber versuchen zu setzen die Variable env RAILS_RESQUE_REDIS=<host>:<port> stattdessen, wie die Initialisierer geladen werden, nachdem es versucht, connect redis (und schlägt fehl).

Verwandte Themen