2012-06-06 11 views
6

मुझे पासवर्ड-संरक्षित Redis सर्वर से कनेक्ट करने के लिए, यूनिकॉर्न के तहत चलने वाली रेल ऐप प्राप्त करने का प्रयास करने में अप्रत्याशित और महत्वपूर्ण समस्याएं आ रही हैं।Resque Redis कॉन्फ़िगरेशन सेटिंग्स नहीं उठा रहा है

कमांड लाइन पर bundle exec rails c production का उपयोग करके, मैं Resque.redis के माध्यम से आदेश जारी कर सकता हूं। हालांकि, ऐसा लगता है कि जब यूनिकॉर्न के तहत फोर्क किया जाता है तो मेरी कॉन्फ़िगरेशन खो जाती है।

गैर-पासवर्ड-सुरक्षित Redis सर्वर का उपयोग करना बस काम करता है। हालांकि, मैं अन्य सर्वरों पर श्रमिकों को चलाने का इरादा रखता हूं जहां रेडिस सर्वर रहता है, इसलिए मुझे पासवर्ड सुरक्षित होने की आवश्यकता है।

मुझे पासवर्ड सुरक्षित (उसी तकनीक का उपयोग करके) का उपयोग करने में भी सफलता मिली है, लेकिन यूनिकॉर्न की बजाय यात्री का उपयोग करना।

# 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 

उत्तर

4

अद्यतन@lmarlow's comment to a resque issue पर आधारित पूरी तरह से अलग विचार।

मैं शर्त लगाता हूं कि जहां भी आपके पास रेडिस ~> 3 है (मेरा मतलब है रूबी क्लाइंट संस्करण, सर्वर संस्करण नहीं)।

इस लेखन के अनुसार, रेस्क को रेडिस ~> 2 की आवश्यकता है लेकिन यह अपने gemspec में निर्दिष्ट नहीं करता है। इसलिए आप अपने Gemfile को यह जोड़कर मदद करने के लिए है:

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

इसके अलावा, यह सुनिश्चित करें कि बंडलर हर जगह इस्तेमाल किया जा रहा है या नहीं। अन्यथा, यदि आपके सिस्टम में रेडिस मणि का एक नया संस्करण है, तो इसका उपयोग किया जाएगा और Resque पहले की तरह विफल हो जाएगा।

अंत में, एक कॉस्मेटिक टिप्पणी ... आप के लिए config को आसान बनाने में कर सकते हैं:

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

और फिर

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

मैंने कोशिश की है (सरलीकृत करना, एक वैश्विक में कॉन्फ़िगरेशन को संग्रहित करना) और बाद में 'फर्क्यूड्रेड = "रेडिस: // उपयोगकर्ता: [email protected] के रूप में बाद_फोर हुक में कनेक्ट स्ट्रिंग को हार्ड-कोड किया गया: 637 9 "' लेकिन हां, कोई सफलता नहीं। कर्मचारियों को काम करने के लिए, रेल वेब ऐप इसका उपयोग करने में विफल रहता है। अगर मैं बंदरगाह बदलता हूं, तो श्रमिक इसे ट्रैक करते हैं, ऐप नहीं करता है। –

+0

यदि आप उत्पादन पर रेल कंसोल शुरू करते हैं, तो 'Resque.redis' का आउटपुट क्या है? –

+1

कंसोल से, सब कुछ ठीक वैसे ही काम करता है, और Resque.redis.info (उदाहरण के लिए) सर्वर से जानकारी देता है। अगर मैं एक अवैध पासवर्ड का उपयोग करता हूं, तो मुझे "पासवर्ड गलत है" शैली त्रुटि मिलती है, इसलिए मुझे पता है कि यह कंसोल पर ठीक से कनेक्ट हो रहा है। यहां तक ​​कि 'Resque.redis.quit' को चलाने के बाद भी 'Resque.redis =" url "' कमांड कंसोल से काम करता है। –

6

ठीक है, अन्य लोगों को जो इस समस्या googling किया जा सकता है के लिए, मैंने इसे अपने लिए कम से कम

मूल समस्या Redis को बुला रही है। कोड में अन्य सभी स्थानों, उदाहरण के लिए अपने geocoder सेटअप या यूनिकॉर्न कॉन्फ़िगरेशन फ़ाइल में।

बस यह सुनिश्चित करें कि हर बार जब आप रेडिस को प्रारंभ करते हैं तो आप उपयुक्त मान उदा।

REDIS = Redis.connect(:url => ENV['REDISTOGO_URL']) 
हर जगह

की तरह कुछ और आप

Redis.new 

कभी नहीं होना चाहिए के रूप में यह स्थानीय होस्ट और डिफ़ॉल्ट पोर्ट

+0

धन्यवाद, यह मेरी समस्या थी साथ ही –

+0

धन्यवाद - यह मेरे लिए हल हो गया –

2

लागू हो जाएगी यह मेरे लिए मददगार था:

स्रोत: 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

क्या मेरे लिए काम किया यहाँ गेंडा config था: 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

मुझे लगता है कि इस मुद्दे को Resque-वेब के साथ किया गया था। इसकी कॉन्फ़िगरेशन फ़ाइल, उन्होंने इसे अभी तय किया है। संस्करण 0.0.11 में, वे के रूप में अच्छी एक टिप्पणी में यह उल्लेख: https://github.com/resque/resque-web/blob/master/config/initializers/resque_config.rb#L3

इससे पहले, उनकी फ़ाइल इस तरह देखा: https://github.com/resque/resque-web/blob/v0.0.9/config/initializers/resque_config.rb

और, यदि कारण कोई कारण के लिए, आप अपग्रेड नहीं कर सकते, तो बजाय सेट करने का प्रयास env वैरिएबल RAILS_RESQUE_REDIS=<host>:<port> इसके बजाए, प्रारंभिक लोड होने के बाद इनडिस्टाइज़र लोड हो रहे हैं (और असफल)।

संबंधित मुद्दे