Redis
 sql >> Database >  >> NoSQL >> Redis

Come eseguire Redis su Amazon OpsWorks per un'applicazione Rails?

Un possibile modo per farlo è creare un "cluster ElastiCache" su AWS e dire a Rails di usarlo.

Ho la mia app Rails in esecuzione con uno stack OpsWorks e utilizzo redis per due motivi diversi:uso Sidekiq per il lavoro ritardato e uso il cache store.

È molto importante impostare il gruppo di sicurezza corretto per il tuo cluster Redis ElastiCache, questo gruppo di sicurezza deve essere disponibile per il tuo stack OpsWorks.

Per prima cosa crea il tuo cluster Redis ElastiCache. Quindi vai nella tua console AWS, fai clic su "EC2", quindi fai clic su "Gruppo di sicurezza" (sotto NETWORK &SECURITY). Cerca nel gruppo di sicurezza utilizzando l'ID del gruppo di sicurezza associato al tuo cluster elastico.

Ora imposta una regola in entrata in cui l'origine è il gruppo di sicurezza opsworks che hai all'interno di opsworks.

Nel tuo EC2 -> Gruppo di sicurezza:

In OpsWorks -> Livelli -> Rails App Server Security:

Alla fine, nel tuo progetto Rails, modifica il tuo config/production.rb file (supponendo che tu stia lavorando per l'ambiente di produzione) e aggiungi una riga come questa per impostare il tuo archivio cache:

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

Quindi, per fare in modo che Sidekiq utilizzi Redis, è necessario un config/sidekiq.rb file come questo:

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

Puoi recuperare l'URL redis e la porta all'interno della dashboard ElastiCache della console AWS, facendo clic nella colonna Nodes relativa al tuo cluster.

Hai bisogno di una ricetta solo per avviare e fermare sidekiq, a meno che tu non voglia avviarla manualmente andando all'interno della tua macchina tramite ssh (ovviamente non va bene per la produzione).

In questo caso devi aggiungere una ricetta personalizzata al tuo stack OpsWorks, per l'evento Deploy. Questa ricetta sarà qualcosa del genere:

# 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

Spero che ti aiuti!