Ett möjligt sätt att göra det är att skapa ett "ElastiCache-kluster" på AWS och berätta för Rails att använda det.
Jag har min rails-app igång med en OpsWorks-stack och jag använder redis av två olika anledningar:använd Sidekiq för försenat jobb och använd cachelagret.
Det är mycket viktigt att ställa in rätt säkerhetsgrupp för ditt redis ElastiCache-kluster måste denna säkerhetsgrupp vara tillgänglig för din OpsWorks-stack.
Skapa först ditt Redis ElastiCache-kluster. Gå sedan till din AWS-konsol, klicka på "EC2", klicka sedan på "Säkerhetsgrupp" (under NÄTVERK &SÄKERHET). Sök i säkerhetsgruppen med det säkerhetsgrupp-id som är kopplat till ditt elastiska kluster.
Ställ nu in en inkommande regel där källan är opsworks-säkerhetsgruppen som du har i opsworks.
I din EC2 -> Säkerhetsgrupp:
I OpsWorks -> Lager -> Rails App Server Security:
I slutet, i ditt Rails-projekt, redigera din config/production.rb fil (förutsatt att du arbetar för produktionsenv) och lägg till en rad så här för att ställa in din cachelagring:
config.cache_store = :redis_store, "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/0/cache", { expires_in: 90.minutes }
För att sedan få Sidekiq att använda Redis behöver du en config/sidekiq.rb fil så här:
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
Du kan hämta redis URL och port inuti din AWS Console ElastiCache Dashboard genom att klicka på kolumnen Noder relaterad till ditt kluster.
Du behöver bara ett recept för att starta och stoppa sidekiq, såvida du inte vill starta det manuellt genom att gå in i din maskin via ssh (naturligtvis inte bra för produktion).
I det här fallet måste du lägga till ett anpassat recept till din OpsWorks-stack för Deploy-händelsen. Det här receptet blir ungefär så här:
# 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
Hoppas det hjälper!