Možným způsobem, jak to udělat, je vytvořit "ElastiCache cluster" na AWS a říct Rails, aby jej použil.
Mám svou aplikaci rails spuštěnou se zásobníkem OpsWorks a používám redis ze dvou různých důvodů:pro zpožděnou práci používám Sidekiq a používám úložiště mezipaměti.
Je velmi důležité nastavit správnou bezpečnostní skupinu pro váš cluster redis ElastiCache musí být tato skupina zabezpečení dostupná pro váš stack OpsWorks.
Nejprve vytvořte svůj cluster Redis ElastiCache. Poté přejděte do konzole AWS, klikněte na „EC2“ a poté klikněte na „Security Group“ (v části SÍŤ &ZABEZPEČENÍ). Vyhledejte skupinu zabezpečení pomocí ID skupiny zabezpečení přidružené k vašemu clusteru elasticache.
Nyní nastavte příchozí pravidlo, kde zdrojem je bezpečnostní skupina opsworks, kterou máte uvnitř opsworks.
Ve vaší EC2 -> Security Group:
V OpsWorks -> Vrstvy -> Zabezpečení serveru Rails App Server:
Na konci ve svém projektu Rails upravte config/production.rb soubor (za předpokladu, že pracujete pro produkční prostředí) a přidejte řádek jako tento pro nastavení úložiště mezipaměti:
config.cache_store = :redis_store, "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/0/cache", { expires_in: 90.minutes }
Chcete-li, aby Sidekiq používal Redis, potřebujete config/sidekiq.rb soubor takto:
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
Adresu URL a port redis můžete získat z ovládacího panelu ElastiCache konzoly AWS kliknutím na sloupec Nodes související s vaším clusterem.
Recept potřebujete pouze ke spuštění a zastavení sidekiq, pokud jej nechcete spustit ručně ve vašem stroji přes ssh (samozřejmě to není dobré pro výrobu).
V tomto případě musíte přidat vlastní recept do svého zásobníku OpsWorks pro událost Deploy. Tento recept bude vypadat nějak takto:
# 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
Doufám, že to pomůže!