You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:27:12