🌊

SidekiqをSystemdで管理しCapistranoでデプロイする

2021/08/09に公開

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。

  • プロジェクトでRailsエンジニアが足りなくて困っている
  • Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
  • オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。

前提

Sidekiqのv6系からSystemdでプロセスを管理するようになったので、その方法についてまとめました。
付随してCapistranoでのデプロイまでできるようにします。

作業内容

基本的には、SidekiqのGitHubの以下のURLを参考にして作業していきます。
https://github.com/mperham/sidekiq/blob/master/examples/systemd/sidekiq.service

ファイルの作成

(CentOSの場合)/usr/lib/systemd/system/sidekiq.serviceというファイル名で、以下の記述でファイルを設置します。

sidekiq.service
[Unit]
Description=sidekiq
After=syslog.target network.target

[Service]
# v6.0.6以上の場合にはType=notify
# v6.0.5以下の場合にはType=simple
Type=notify

# プロセスがロックアップされた場合に指定されて秒数以内に再起動する
WatchdogSec=10

# アプリケーションディレクトリの指定
WorkingDirectory=/var/www/アプリケーション名/current

# rbenvを利用している場合は以下の記述
ExecStart=/bin/bash -lc 'exec /home/ユーザー名/.rbenv/shims/bundle exec sidekiq -e production'

User=ユーザー名
Group=ユーザーグループ名
UMask=0002

Environment=MALLOC_ARENA_MAX=2

# クラッシュした場合にリスタートする
RestartSec=1
Restart=on-failure

# ログの吐き出し場所
# Ubuntuの場合/var/log/syslog 、CentOSの場合/var/log/messages
StandardOutput=syslog
StandardError=syslog

SyslogIdentifier=sidekiq

[Install]
WantedBy=multi-user.target

ファイルを作成したら以下のコマンドでsystemdへ登録して、起動します。

bash
sudo systemctl enable sidekiq
sudo systemctl start sidekiq

Capistranoの設定

gem 'capistrano-sidekiq'`のインストール

Gemfile
group :development do
  gem 'capistrano-sidekiq',  require: false
end
bash
bundle install

Capfileの設定

Capfileに以下の記述を追記する。

Capfile
require 'capistrano/sidekiq'
...
install_plugin Capistrano::Sidekiq::Systemd

install_plugin Capistrano::Sidekiqを追記すると、sudo systemctl start sidekiqが走り失敗してしまうため記述しませんでした。

deploy.rbの設定

deploy.rbに以下の記述を追記し、sudo systemctl restart sidekiqを実行するようにします。

deploy.rb
namespace :deploy do
  desc "Restart sidekiq"
  task :restart_sidekiq do
    on roles(:app), in: :sequence, wait: 5 do
      execute :sudo, :systemctl, :restart, :sidekiq
    end
  end
  
  after :finishing,  'deploy:restart_sidekiq'
end

番外編

AWSLogsの設定

SidekiqのログをAWSLogsを使って出したい場合の設定方法。
/etc/rsyslog.confの一番下などに以下の記述を追加します。

rsyslog.conf
if $programname == 'sidekiq' then {
    action(type="omfile" file="/var/www/アプリケーション名/shared/log/sidekiq.log")
}

記述し保存したら、以下のコマンドでサービスを再起動します。

bash
sudo systemctl restart rsyslog
sudo systemctl restart sidekiq.service

そうすると/var/www/アプリケーション/shared/log/sidekiq.logにログファイルが出力されるようになります。
それをAWSLogsの設定で読み込むようにします。

bash
sudo vim /etc/awslogs/awslogs.conf
awslogs.conf
[/var/log/redis/redis.log]
datetime_format = %Y-%m-%dT%H:%M:%S.%f
file = /var/log/redis/redis.log
buffer_duration = 5000
log_stream_name = redis_log
initial_position = start_of_file
log_group_name = production_redis.log

参考にした記事

https://qiita.com/ryohashimoto/items/69dac29a63f682143df7#デーモン化を廃止しサービスとして実行するように

https://harpyja.daemon.asia/wiki/Unix/systemd-output-log-each-searvice

Discussion