【问题标题】:Using Puma with Rails application在 Rails 应用程序中使用 Puma
【发布时间】:2019-09-08 22:22:28
【问题描述】:

我的配置:

Rails 5.2.3
Ruby 2.6.3
rbenv
puma
capistrano
nginx
Ubuntu 18.04

我一直在阅读有关如何进行所有这些设置和配置以进行部署的信息,但我似乎无法找到一个地方,那里有一个清晰而完整的指南。

最让我困惑的事情之一是 Puma。一些指南,没有提到任何关于在服务器上配置 Puma 的内容,所有的说明,都参考了 Puma Gem。其他一些指南,讨论在服务器上设置和配置 Puma,以及 /etc/init 文件夹中的修改。

我是否需要在服务器上单独设置和配置 Puma,然后才能开始将它用于我的 Rails 应用程序?

【问题讨论】:

    标签: ruby-on-rails capistrano puma


    【解决方案1】:

    不,您不需要在服务器上设置和配置 Puma。彪马是一颗宝石。因此,如果您在应用程序的 Gemfile 中列出它,当您为 Rails 应用程序运行 bundle install 时,Puma 将自动安装。

    puma 的任何配置都应该在您的应用程序中,在config/puma.rb 下。

    这是否回答了您的问题?

    【讨论】:

    • 嗯,仔细看看你的问题,我想我还没有回答。我刚刚偶然发现github.com/seuros/capistrano-puma 并怀疑您的问题可能与此更相关
    • 我看过 gem 文档,在启动 Rails 之前,它并没有提到仅服务器设置,但一些指南提到了服务器设置。那里有很多错误信息,但我找不到一个完整且有用的 Rails 5.2 + Puma + Capistrano + Rbenv + Puma + Nginx
    • 您看过哪些关于服务器设置的指南?我可以看看他们。
    • 这是一个:digitalocean.com/community/tutorials/… 这是另一个:coderwall.com/p/ttrhow/… 如果您已经成功部署了我列出的配置,并且您使用了特定的指南,我将不胜感激链接
    • 这些文章的一个问题是它们已经过时了。 DigitalOcean 面向 DO 客户,因为 DO 提供类似于 AWS EC2 的服务器托管。 Coderwall 更好,因为它显示了与 Capistrano 以及 Puma 和 Nginx 相关的各种步骤。我无法评论一些特定于 Ubuntu 的东西,因为我们(我工作的公司)使用 AWS 和 AL2(Amazon Linux 2)。
    【解决方案2】:

    在本地运行 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。

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 2018-11-19
      • 2016-10-10
      • 2018-01-30
      • 2015-06-23
      • 2016-02-10
      • 2014-09-23
      • 2016-08-25
      • 2020-04-22
      相关资源
      最近更新 更多