在本地运行 Rails 时,只需将 config/puma.rb 用于您的 Puma 配置,然后运行 Puma,类似于以下内容:
RAILS_LOG_TO_STDOUT=1 bin/pumactl -F config/puma.rb start
上面将在前台运行 Puma。我个人在开发中使用 Overmind 来运行 Puma、Webpacker、Sidekiq,有时还使用 ngrok。这意味着我只需要一个 iTerm 标签即可。
要获取bin/pumactl,请运行bin/bundle binstubs puma。
您也可以使用bin/rails server 运行 Puma,但 Puma 建议不要这样做,因为并非所有 Puma 的配置选项都可以通过该方法使用。
Puma 配置示例(基于 capistrano3-puma gem 生成的 [https://github.com/seuros/capistrano-puma/blob/v4.0.0/lib/capistrano/templates/puma.rb.erb]):
# frozen_string_literal: true
# config/puma.rb
require 'dotenv/load' # load a .env file for environment variables; gem 'dotenv-rails'
require 'nenv' # nicer ENV handling; gem 'nenv'
directory(File.expand_path('..', __dir__))
rackup(File.expand_path('../config.ru', __dir__))
environment(Nenv.rack_env || Nenv.rails_env || 'development')
# or without nenv
#environment(ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development')
threads(0, (Nenv.max_threads || 16).to_i)
# or without nenv
#threads(0, (ENV['MAX_THREADS'] || 16).to_i)
port((Nenv.port || 3_000).to_i)
# or without nenv
#port((ENV['PORT'] || 3_000).to_i)
workers 0
restart_command 'bundle exec puma'
prune_bundler
on_restart do
puts('Refreshing Gemfile...') # rubocop:disable Rails/Output
Nenv.bundle_gemfile = File.expand_path('../Gemfile', __dir__)
# or without nenv
#ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', __dir__)
end
为了使用 Capistrano 处理 Puma,我推荐使用 capistrano3-puma gem (https://github.com/seuros/capistrano-puma)。这个 gem 有各种任务,其中之一是puma:config,它将在shared 目录中创建一个puma.rb 文件。然后将puma.rb 添加到:linked_files Capistrano 配置选项:
# config/deploy.rb
append(:linked_files, 'puma.rb')
至于设置服务器(您部署到的服务器),您需要安装 Nginx 并将其设置为为您的 Rails 应用程序提供服务。同样,capistrano3-puma gem 可以派上用场,因为它包含一个 Nginx 插件,它提供了将配置上传到服务器的任务。如果您不想使用该插件,那么我至少建议您查看该配置的模板 (https://github.com/seuros/capistrano-puma/blob/v4.0.0/lib/capistrano/templates/nginx_conf.erb),然后根据您的需要进行调整。
正如@matt-v-from-toronto 所提到的,Puma 是作为应用程序的一部分安装的,而不是单独安装在服务器上。执行bin/bundle install 或类似操作将安装 Puma 以及您在Gemfile 中列出的所有其他 gem。