如何在 Amazon OpsWorks 上为 Rails 应用程序运行 Redis?

Posted

技术标签:

【中文标题】如何在 Amazon OpsWorks 上为 Rails 应用程序运行 Redis?【英文标题】:How to run Redis on Amazon OpsWorks for a Rails application? 【发布时间】:2016-06-14 23:02:19 【问题描述】:

我正在尝试在 Amazon OpsWorks 环境中设置 Redis 实例/层以用于缓存目的和 Sidekiq,但无法使 Rails 应用程序与 Redis 通信。

无论如何我都需要厨师食谱吗?我尝试在单独的层上创建 Redis,向该层添加了一个实例,但无法找到一种方法使 Rails 和 Redis 相互通信。

有什么制作方法的建议吗?

谢谢

【问题讨论】:

请考虑将我的答案标记为有效答案。谢谢 【参考方案1】:

一种可能的方法是在 AWS 上创建一个“ElastiCache cluster”并告诉 Rails 使用它。

我的 Rails 应用程序使用 OpsWorks 堆栈运行,我使用 redis 有两个不同的原因:使用 Sidekiq 延迟作业和使用缓存存储。

为您的 redis ElastiCache 集群设置正确的安全组非常重要,该安全组必须可用于您的 OpsWorks 堆栈。

首先创建您的 Redis ElastiCache 集群。 然后进入您的 AWS 控制台,单击“EC2”,然后单击“安全组” (在网络和安全下)。使用与您的 elasticache 集群关联的安全组 ID 搜索安全组。

现在设置一个入站规则,其中源是您在 opsworks 中拥有的 opsworks 安全组。

在您的 EC2 -> 安全组中:

在 OpsWorks -> 层 -> Rails 应用服务器安全性:

最后,在您的 Rails 项目中,编辑您的 config/production.rb 文件(假设您正在为生产环境工作)并添加如下一行来设置缓存存储:

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

那么要让 Sidekiq 使用 Redis,你需要一个像这样的 config/sidekiq.rb 文件:

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

您可以在 AWS 控制台 ElastiCache 仪表板中检索 redis URL 和端口,单击与您的集群相关的节点列下方。

你只需要一个配方来启动和停止 sidekiq,除非你想通过 ssh 手动启动它进入你的机器(当然不适合生产)。

在这种情况下,您必须为 Deploy 事件添加自定义配方到 OpsWorks 堆栈。 这个食谱是这样的:

# 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

希望对你有帮助!

【讨论】:

谢谢@DiegoD。使用 ElastiCache 是否也具有足够的可扩展性? @user984621 ElastiCache 像 RDS 一样扩展。我认为这是一个不错的选择,但当然这取决于您的需求。如果您认为这对您有所帮助,请将我的回答标记为已接受。

以上是关于如何在 Amazon OpsWorks 上为 Rails 应用程序运行 Redis?的主要内容,如果未能解决你的问题,请参考以下文章

在 Amazon OpsWorks 上使用 Ruby 2.0

AWS OpsWorks新增Amazon RDS支持

如何在 Amazon EC2 上为应用程序设置自定义域?

使用基于负载的实例时,Amazon OpsWorks 自定义说明书未更新

如何在 AWS EB Amazon Linux 2 平台上为 cron.d 添加环境属性引用

OpsWorks基于负载的实例与自动扩展组?