sql >> Base de Datos >  >> NoSQL >> Redis

¿Cómo ejecutar Redis en Amazon OpsWorks para una aplicación Rails?

Una forma posible de hacerlo es crear un "clúster de ElastiCache" en AWS y decirle a Rails que lo use.

Tengo mi aplicación Rails ejecutándose con una pila de OpsWorks y uso redis por dos razones diferentes:uso Sidekiq para trabajos retrasados ​​y uso el almacén de caché.

Es muy importante configurar el grupo de seguridad correcto para su clúster redis ElastiCache, este grupo de seguridad debe estar disponible para su pila de OpsWorks.

Primero cree su clúster Redis ElastiCache. Luego vaya a su consola de AWS, haga clic en "EC2", luego haga clic en "Grupo de seguridad" (en RED Y SEGURIDAD). Busque el grupo de seguridad usando la identificación del grupo de seguridad asociada a su clúster de elasticache.

Ahora establezca una regla de entrada donde la fuente sea el grupo de seguridad de opsworks que tiene dentro de opsworks.

En su EC2 -> Grupo de seguridad:

En OpsWorks -> Capas -> Rails App Server Security:

Al final, en su proyecto Rails, edite su config/production.rb (suponiendo que esté trabajando para un entorno de producción) y agregue una línea como esta para configurar su almacenamiento en caché:

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

Luego, para hacer que Sidekiq use Redis, necesita un config/sidekiq.rb archivo como este:

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

Puede recuperar la URL y el puerto de redis dentro de su panel de ElastiCache de la consola de AWS, haciendo clic en la columna Nodos relacionada con su clúster.

Solo necesita una receta para Iniciar y Detener sidekiq, a menos que desee iniciarlo manualmente yendo dentro de su máquina a través de ssh (por supuesto, no es bueno para la producción).

En este caso, debe agregar una receta personalizada a su pila de OpsWorks, para el evento de implementación. Esta receta será algo como esto:

# 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

¡Espero que ayude!