Een mogelijke manier om dit te doen, is door een "ElastiCache-cluster" op AWS te maken en Rails te vertellen om het te gebruiken.
Ik heb mijn rails-app met een OpsWorks-stack en ik gebruik redis om twee verschillende redenen:gebruik Sidekiq voor uitgestelde taken en gebruik de cacheopslag.
Is erg belangrijk om de juiste beveiligingsgroep in te stellen voor uw redis ElastiCache-cluster moet deze beveiligingsgroep beschikbaar zijn voor uw OpsWorks-stack.
Maak eerst uw Redis ElastiCache-cluster. Ga vervolgens naar uw AWS-console, klik op "EC2" en klik vervolgens op "Beveiligingsgroep" (onder NETWERK &BEVEILIGING). Zoek in de beveiligingsgroep met behulp van de beveiligingsgroep-ID die is gekoppeld aan uw elasticache-cluster.
Stel nu een inkomende regel in waarbij de bron de opsworks-beveiligingsgroep is die u binnen opsworks hebt.
In uw EC2 -> Beveiligingsgroep:
In OpsWorks -> Lagen -> Rails App Server-beveiliging:
Aan het einde, in je Rails-project, bewerk je config/production.rb bestand (ervan uitgaande dat u voor productie-env werkt) en voeg een regel als deze toe om uw cache-archief in te stellen:
config.cache_store = :redis_store, "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/0/cache", { expires_in: 90.minutes }
Om Sidekiq Redis te laten gebruiken, hebt u een config/sidekiq.rb . nodig bestand als volgt:
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
U kunt de redis-URL en -poort ophalen in uw AWS Console ElastiCache-dashboard door te klikken onder de kolom Nodes gerelateerd aan uw cluster.
Je hebt alleen een recept nodig om sidekiq te starten en te stoppen, tenzij je het handmatig in je machine wilt starten via ssh (natuurlijk niet goed voor productie).
In dit geval moet je een aangepast recept toevoegen aan je OpsWorks-stack, voor de Deploy-gebeurtenis. Dit recept ziet er ongeveer zo uit:
# 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
Ik hoop dat het helpt!