Możliwym sposobem, aby to zrobić, jest utworzenie "klastra ElastiCache" na AWS i polecenie Railsom, aby go używali.
Mam aplikację Rails działającą ze stosem OpsWorks i używam redis z dwóch różnych powodów:używam Sidekiq do opóźnionych zadań i używam pamięci podręcznej.
Bardzo ważne jest ustawienie prawidłowej grupy bezpieczeństwa w przypadku klastra redis ElastiCache ta grupa zabezpieczeń musi być dostępna dla stosu OpsWorks.
Najpierw utwórz klaster Redis ElastiCache. Następnie przejdź do konsoli AWS, kliknij „EC2”, a następnie „Grupa bezpieczeństwa” (w sekcji SIEĆ I ZABEZPIECZENIA). Wyszukaj grupę bezpieczeństwa przy użyciu identyfikatora grupy bezpieczeństwa powiązanego z twoim klastrem elasticache.
Teraz ustaw regułę Inbound, gdzie źródłem jest grupa bezpieczeństwa opsworks, którą masz w opsworks.
W Twojej EC2 -> Security Group:
W OpsWorks -> Warstwy -> Rails App Server Security:
Na koniec, w swoim projekcie Railsowym, edytuj swój config/production.rb plik (zakładając, że pracujesz w środowisku produkcyjnym) i dodaj linię taką jak ta, aby ustawić magazyn pamięci podręcznej:
config.cache_store = :redis_store, "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/0/cache", { expires_in: 90.minutes }
Następnie, aby Sidekiq używał Redis, potrzebujesz config/sidekiq.rb plik w ten sposób:
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
Możesz pobrać adres URL redis i port w panelu kontrolnym konsoli AWS ElastiCache, klikając w kolumnie Węzły związanej z klastrem.
Potrzebujesz przepisu tylko do uruchamiania i zatrzymywania sidekiq, chyba że chcesz uruchomić go ręcznie, przechodząc do komputera przez ssh (oczywiście nie jest to dobre dla produkcji).
W takim przypadku musisz dodać niestandardowy przepis do swojego stosu OpsWorks na potrzeby wydarzenia Wdrożenie. Ten przepis będzie wyglądał mniej więcej tak:
# 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
Mam nadzieję, że to pomoże!