Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Wie führe ich Redis auf Amazon OpsWorks für eine Rails-Anwendung aus?

Ein möglicher Weg, dies zu tun, besteht darin, einen "ElastiCache-Cluster" auf AWS zu erstellen und Rails mitzuteilen, dass er ihn verwenden soll.

Ich habe meine Rails-App mit einem OpsWorks-Stack ausgeführt und verwende Redis aus zwei verschiedenen Gründen:Verwenden Sie Sidekiq für verzögerte Jobs und verwenden Sie den Cache-Speicher.

Es ist sehr wichtig, die richtige Sicherheitsgruppe einzustellen für Ihren Redis ElastiCache-Cluster muss diese Sicherheitsgruppe für Ihren OpsWorks-Stack verfügbar sein.

Erstellen Sie zuerst Ihren Redis ElastiCache-Cluster. Gehen Sie dann in Ihre AWS-Konsole, klicken Sie auf „EC2“ und dann auf „Sicherheitsgruppe“ (unter NETZWERK &SICHERHEIT). Suchen Sie die Sicherheitsgruppe anhand der Sicherheitsgruppen-ID, die Ihrem Elasticache-Cluster zugeordnet ist.

Legen Sie nun eine Eingangsregel fest, bei der die Quelle die opsworks-Sicherheitsgruppe ist, die Sie in opsworks haben.

In Ihrer EC2 -> Sicherheitsgruppe:

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

Bearbeiten Sie am Ende in Ihrem Rails-Projekt Ihre config/production.rb Datei (vorausgesetzt, Sie arbeiten für die Produktionsumgebung) und fügen Sie eine Zeile wie diese hinzu, um Ihren Cache-Speicher festzulegen:

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

Damit Sidekiq dann Redis verwendet, benötigen Sie eine config/sidekiq.rb Datei wie folgt:

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

Sie können die Redis-URL und den Port in Ihrem ElastiCache-Dashboard der AWS-Konsole abrufen, indem Sie in der Spalte „Knoten“ für Ihren Cluster klicken.

Sie benötigen ein Rezept nur zum Starten und Stoppen von sidekiq, es sei denn, Sie möchten es manuell über ssh in Ihre Maschine starten (natürlich nicht gut für die Produktion).

In diesem Fall müssen Sie Ihrem OpsWorks-Stack für das Deploy-Ereignis ein benutzerdefiniertes Rezept hinzufügen. Dieses Rezept sieht in etwa so aus:

# 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

Hoffe es hilft!