Rails+Capistrano部署:EC2实例上定期检查Sidekiq运行状态的最佳方式
我之前也碰到过类似Sidekiq意外停摆的糟心事,结合你用EC2+Rails+Capistrano的环境,分享几个亲测有效的定期监控方案,从简单入门到云原生进阶都有:
1. 系统级进程监控(快速落地首选)
如果还没给Sidekiq配置systemd服务,强烈建议先做这个——比nohup、screen这类临时方案稳定太多。配置好后,用简单的shell脚本+crontab就能实现定期检查:
步骤:
- 先写个检查脚本
/opt/scripts/check_sidekiq.sh:
#!/bin/bash # 检查Sidekiq服务状态 if ! systemctl is-active --quiet sidekiq; then # 这里可以加告警逻辑,比如发邮件、Slack通知(用sendmail或slack-cli即可) echo "$(date): Sidekiq已停止,正在重启..." >> /var/log/sidekiq_monitor.log # 自动重启服务 systemctl restart sidekiq else echo "$(date): Sidekiq运行正常" >> /var/log/sidekiq_monitor.log fi
- 给脚本加执行权限:
chmod +x /opt/scripts/check_sidekiq.sh - 配置crontab定时执行(比如每5分钟检查一次):
执行crontab -e,添加一行:*/5 * * * * /opt/scripts/check_sidekiq.sh
如果还没配置systemd服务,也可以用进程检查替代(但不推荐长期用):把脚本里的systemctl命令换成ps aux | grep sidekiq | grep -v grep即可。
2. Sidekiq健康端点+定时校验
Sidekiq自带Web UI,我们可以利用它的健康检查端点(Sidekiq 6.x+免费版支持/sidekiq/health,Pro版有更丰富的/sidekiq/healthcheck)来做HTTP状态校验,适合需要监控业务可用性的场景:
步骤:
- 先确保Rails路由里挂载了Sidekiq Web UI,并且做了安全限制(比如HTTP Basic Auth或仅允许内部IP访问):
# config/routes.rb require 'sidekiq/web' Rails.application.routes.draw do authenticate :user, ->(user) { user.admin? } do mount Sidekiq::Web => '/sidekiq' end end
- 写个HTTP检查脚本
/opt/scripts/check_sidekiq_health.sh:
#!/bin/bash # 替换成你的应用域名或EC2内网IP APP_URL="http://your-app-domain/sidekiq/health" # 如果加了Basic Auth,这里加上-u 参数:curl -s -u username:password ... STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" $APP_URL) if [ "$STATUS_CODE" -ne 200 ]; then echo "$(date): Sidekiq健康检查失败,状态码:$STATUS_CODE" >> /var/log/sidekiq_health.log # 可选:用Capistrano命令重启Sidekiq cap production sidekiq:restart else echo "$(date): Sidekiq健康检查通过" >> /var/log/sidekiq_health.log fi
- 同样用crontab定时执行即可。
3. AWS云原生监控(适合规模化场景)
如果你用AWS生态,推荐用CloudWatch做自定义指标监控,不用自己维护日志和告警渠道:
步骤:
- 写个上报CloudWatch指标的脚本
/opt/scripts/sidekiq_cloudwatch_metric.sh:
#!/bin/bash # 获取EC2实例ID(利用AWS元数据服务) INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) # 检查Sidekiq状态,运行中上报1,停止上报0 if systemctl is-active --quiet sidekiq; then METRIC_VALUE=1 else METRIC_VALUE=0 fi # 上报到CloudWatch自定义命名空间 aws cloudwatch put-metric-data \ --namespace "SidekiqMonitoring" \ --metric-name "RunningStatus" \ --value $METRIC_VALUE \ --dimensions InstanceId=$INSTANCE_ID
- 给EC2实例的IAM角色添加
CloudWatchFullAccess权限(或更精细的权限) - 配置crontab定时上报(比如每分钟一次)
- 在CloudWatch控制台创建告警规则:当
RunningStatus指标为0持续5分钟时,触发SNS通知(可以关联邮件、短信、Slack机器人等)
4. Capistrano部署时的即时检查(补全部署链路)
虽然你主要要解决的是部署后的定期监控,但可以在Capistrano部署流程里加个钩子,确保部署完成后Sidekiq是正常运行的:
# config/deploy.rb after 'deploy:finished', 'sidekiq:post_deploy_check' namespace :sidekiq do desc '部署完成后检查Sidekiq状态' task :post_deploy_check do on roles(:app) do if test('systemctl is-active --quiet sidekiq') info '✅ Sidekiq部署后运行正常' else error '❌ Sidekiq部署后未启动,尝试重启...' execute 'systemctl restart sidekiq' # 再次检查确认 if test('systemctl is-active --quiet sidekiq') info '✅ Sidekiq已成功重启' else error '❌ Sidekiq重启失败,请手动检查!' end end end end end
额外建议
- 一定要给Sidekiq配置日志轮转(比如用logrotate),这样能快速排查停摆原因(比如OOM被系统kill、代码报错导致崩溃等)
- 如果Sidekiq频繁停摆,建议先排查根本原因:比如检查系统内存、Sidekiq日志里的报错、是否有内存泄漏等
内容的提问来源于stack exchange,提问作者Ronan Lopes
相关产品推荐
相关产品推荐

