SidekiqをSystemdで管理しCapistranoでデプロイする
株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい
また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。
前提
Sidekiqのv6系からSystemdでプロセスを管理するようになったので、その方法についてまとめました。
付随してCapistranoでのデプロイまでできるようにします。
作業内容
基本的には、SidekiqのGitHubの以下のURLを参考にして作業していきます。
ファイルの作成
(CentOSの場合)/usr/lib/systemd/system/
に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へ登録して、起動します。
sudo systemctl enable sidekiq
sudo systemctl start sidekiq
Capistranoの設定
gem 'capistrano-sidekiq'`のインストール
group :development do
gem 'capistrano-sidekiq', require: false
end
bundle install
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
を実行するようにします。
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
の一番下などに以下の記述を追加します。
if $programname == 'sidekiq' then {
action(type="omfile" file="/var/www/アプリケーション名/shared/log/sidekiq.log")
}
記述し保存したら、以下のコマンドでサービスを再起動します。
sudo systemctl restart rsyslog
sudo systemctl restart sidekiq.service
そうすると/var/www/アプリケーション/shared/log/sidekiq.log
にログファイルが出力されるようになります。
それをAWSLogsの設定で読み込むようにします。
sudo vim /etc/awslogs/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
参考にした記事
Discussion