如何使用Kamal部署Rails Web及Solid Queue任务服务并解决健康检查问题
解决Kamal部署Rails Web与Solid Queue任务服务的健康检查问题
下面是几种可行的部署方案,覆盖不同场景需求:
方案1:自定义Ruby健康检查脚本
针对Solid Queue无端口的特性,编写脚本直接验证服务可用性,比如通过其依赖的Redis或内部状态判断:
- 在项目根目录创建
check_solid_queue.rb脚本:
#!/usr/bin/env ruby require 'redis' require 'solid_queue' # 匹配Solid Queue的Redis配置 redis = Redis.new(url: ENV['REDIS_URL']) begin # 尝试读取Solid Queue队列列表,验证服务正常 SolidQueue::Queue.all exit 0 # 返回0代表健康 rescue => e puts "Solid Queue健康检查失败: #{e.message}" exit 1 # 返回1代表不健康 end
- 赋予脚本执行权限:
chmod +x check_solid_queue.rb - 在
kamal.rb中为worker服务配置自定义健康检查:
service :worker do image "你的镜像标签" command "bundle exec rake solid_queue:start" healthcheck do command "/rails/check_solid_queue.rb" interval 10 timeout 5 retries 3 end end
方案2:进程存在性检查
直接检查Solid Queue进程是否在运行,逻辑简单直接:
- 在
kamal.rb中配置健康检查命令:
service :worker do image "你的镜像标签" command "bundle exec rake solid_queue:start" healthcheck do command "ps aux | grep '[s]olid_queue:start' || exit 1" interval 10 timeout 5 retries 3 end end
注:[s]olid_queue:start的写法是为了避免grep自身进程被误匹配,确保只检测目标任务进程。
方案3:为任务服务添加健康检查端口
通过启动一个轻量Rack服务暴露健康端点,配合进程管理工具同时运行Solid Queue和健康服务:
- 创建
config/health_check.ru文件:
run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
- 在项目根目录创建
Procfile定义多进程:
worker: bundle exec rake solid_queue:start health: rackup config/health_check.ru -p 3001
- 在
kamal.rb中配置用foreman启动服务,并基于端口做健康检查:
service :worker do image "你的镜像标签" command "bundle exec foreman start" healthcheck do port 3001 path "/" interval 10 timeout 5 retries 3 end end
方案4:禁用健康检查(不推荐)
若任务服务稳定性极高,可临时禁用健康检查,但会丢失Kamal自动重启故障进程的能力:
service :worker do image "你的镜像标签" command "bundle exec rake solid_queue:start" healthcheck false end
内容的提问来源于stack exchange,提问作者Encore PTL
相关产品推荐
相关产品推荐

