运行 puma 工人在生产中,但不在开发中

Run puma workers in Production, but not in Development

我是运行以下puma配置

threads_count = Integer(ENV["DB_POOL"] || ENV["MAX_THREADS"] || 15)
threads threads_count, threads_count
workers 3
preload_app!

rackup      DefaultRackup
port        ENV["PORT"]     || 3000
environment ENV["RACK_ENV"] || "development"

on_worker_boot do
  ActiveSupport.on_load(:active_record) do
    ActiveRecord::Base.establish_connection
  end
end

before_fork do
  ActiveRecord::Base.connection_pool.disconnect!
end

它非常适合生产,但我不想启动 3 个工人或在开发中使用 webrick。我尝试在环境检查中包装特定于工作人员的代码,但这破坏了 puma DSL。对 运行 puma 在开发中的非集群模式有什么想法吗?

Rails在puma配置文件中没有定义,所以Rails.env不能在这里使用,但是RACK_ENV是可以的。

workers(ENV["RACK_ENV"] == "production" ? 3 : 0)

在看到我接受的 scorix 的回答之前,我找到了一个可行的解决方案,但我最终得到了一个稍微不同的解决方案。这允许您设置工作人员数量,例如,我可以 运行 1 个在暂存中,3 个在生产中。

threads_count = Integer(ENV["DB_POOL"] || ENV["MAX_THREADS"] || 15)
threads threads_count, threads_count
rackup      DefaultRackup
port        ENV["PORT"]     || 3000
environment ENV["RACK_ENV"] || "development"

if ENV["RACK_ENV"] == "production"
  workers ENV.fetch("WEB_CONCURRENCY") { 3 }
  preload_app!
  ActiveSupport.on_load(:active_record) do
    ActiveRecord::Base.establish_connection
  end
  before_fork do
    ActiveRecord::Base.connection_pool.disconnect!
  end
end

查看文档中的 Configuration 部分。

我所做的是在 config/puma/production.rb 上设置生产配置,所以在生产中你会 运行 puma 和 puma -C config/puma/production.rb(或者你 运行 它在产品上) 并且在开发中,rails server 不会使用该配置