2016-03-02 79 views
0

我試圖在Amazon OpsWorks環境中爲緩存目的和Sidekiq設置Redis實例/圖層,但無法使Rails應用程序與Redis進行通信。如何在Amazon OpsWorks上爲Rails應用程序運行Redis?

無論做什麼,我都需要廚師食譜嗎?我試圖在分離的圖層上創建Redis,爲此圖層添加了一個實例,但無法找到使Rails和Redis在彼此之間進行通信的方法。

任何建議如何使它?

謝謝

+0

請考慮將我的答案標記爲有效答案。謝謝 –

回答

3

一個可能的方式做到這一點是在AWS上創建一個「ElastiCache cluster」,並告訴Rails的使用它。

我有我的rails應用程序與OpsWorks堆棧運行,我使用redis有兩個不同的原因:使用Sidekiq延遲作業並使用緩存存儲。

爲您的redis ElastiCache集羣設置正確的安全組非常重要,此安全組必須可用於您的OpsWorks堆棧。

首先創建您的Redis ElastiCache羣集。然後點擊「EC2」,然後點擊「安全組」 (在NETWORK &安全下)。使用與您的彈性緩存集羣關聯的安全組ID來搜索安全組。

現在設置一個Inbound規則,其中的源代碼是opsworks內部的opsworks安全組。

在您的EC2 - >安全組: enter image description here

在OpsWorks - >圖層 - > Rails應用程序服務器安全性: enter image description here

最後,在你的Rails項目,編輯配置/ production.rb文件(假設你正在爲生產ENV),並添加這樣一行來設置緩存存儲:

config.cache_store = :redis_store, "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/0/cache", { expires_in: 90.minutes } 

然後使Sidekiq使用Redis的,你需要一個配置/ sidekiq.rb文件是這樣的:

Sidekiq.configure_server do |config| 
    config.redis = { url: "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/12", network_timeout: Rails.application.secrets.redis_timeout } 
end 

Sidekiq.configure_client do |config| 
    config.redis = { url: "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/12", network_timeout: Rails.application.secrets.redis_timeout } 
end 

您可以擷取AWS控制檯ElastiCache儀表板內Redis的URL和端口,在相關節點欄點擊你的羣集。

你只需要一個配方來啓動和停止sidekiq,除非你想通過ssh手動啓動它(當然不適合生產)。

在這種情況下,您必須爲您的OpsWorks堆棧中的Deploy事件添加自定義配方。 本食譜是這樣的:

# Recipe used for a deploy event 
Chef::Log.info("Restart Sidekiq...") 

node[:deploy].each do |application, deploy| 
    deploy_to = node[:deploy][application][:deploy_to] 
    rails_env = node[:deploy][application][:rails_env] 

    execute "sidekiq stop" do 
    user "deploy" 
    cwd "#{deploy_to}/current/" 
    command "bundle exec sidekiqctl stop tmp/pids/sidekiq.pid" 
    environment "RAILS_ENV" => rails_env 
    only_if { "ps aux | grep [s]idekiq" } 
    end 

    bash "bundle" do 
    user "deploy" 
    cwd "#{deploy_to}/current/" 
    code <<-EOH 
     RAILS_ENV="#{rails_env}" bundle exec sidekiq --index 0 --pidfile tmp/pids/sidekiq.pid --environment "#{rails_env}" --logfile log/sidekiq.log --daemon 
    EOH 
    end 
end 

希望它能幫助!

+0

謝謝@DiegoD。使用** ElastiCache **還可以擴展嗎? – user984621

+0

@ user984621像RDS一樣的ElastiCache規模。我認爲這是一個不錯的選擇,但當然這取決於你的需求。如果您認爲以某種方式幫助了您,請將我的答案標記爲已接受。 –

相關問題