【问题标题】:Sinatra is using Thin instead of PumaSinatra 使用 Thin 而不是 Puma
【发布时间】:2015-07-23 09:37:10
【问题描述】:

我正在构建一个需要线程化的 Sinatra 应用程序,因为我正在使用 Sucker-punch 来完成工作,并且我想使用 Puma 服务器来完成它,尽管我以前从未使用过它。

由于某种原因,当我启动我的应用程序时,它会运行 Thin。

我卸载了Thin,它使用了Puma,这很好,但是如果以后再次发生这种情况,我该如何阻止它从Thin开始?

我以rackup 开始我的应用程序,我的主 app.rb 文件中有:

class App < ::Sinatra::Base
  configure  do
    set :show_exceptions, true
    set :root, Info[:root]
    set :threaded, true

    set :server, :puma
    Tilt.register Tilt::ERBTemplate, 'html.erb'

    enable :logging
    use Rack::CommonLogger, Log.file

    if ENV['APP_ENVIRONMENT'] == 'PROD'
      set :environment, :production
      set :bind, '0.0.0.0', HOST
      set :show_exceptions, false
    end
  end
end

【问题讨论】:

    标签: ruby sinatra thin puma


    【解决方案1】:

    您需要在config.ru rackup 文件中设置您的服务器。在这个文件中你可以设置

    Rack::Handler.get('puma').run App.new
    

    文档位于“Module: Rack::Handler”中。

    但是更好的方法是显式运行 Puma:

    bundle exec puma config.ru
    

    或者由@matt 建议:

    rackup -s puma
    

    【讨论】:

    • 您正在使用rackup 启动您的服务器,因此您需要在此处设置服务器类型。如果您只是通过运行ruby app.rb 来启动服务器,那么 Sinatra 将首先运行并选择服务器。
    • 啊!我明白了,我知道我会知道以供将来参考。
    • Rack::Handler::pick(['puma']).run 放入config.ru 不是正确的做法。它会起作用,但是每次停止服务器时都会出现异常(因为您没有为实际配置指定应用程序)并且您在config.ru 中指定的任何中间件都将不起作用。我认为 Rack DSL 没有办法指定要使用的服务器,而是使用 rackup 命令的 -s 选项:rackup -s puma(或按照您的建议直接调用 puma)。
    • 感谢@matt 的评论。添加了您的建议。
    【解决方案2】:

    只需使用bundle exec 运行它。这样可以确保可用的 gem 仅是 Gemfile 中指定的那些。

    所以,即使你安装了瘦,但你的 Gemfile 上有 puma,它也会选择 puma。

    【讨论】:

    • 更好的是,运行 bundle install --binstubs --path vendor 并将每个项目的 gem 沙箱到该特定目录。那么使用bundle exec 就更加安全了!
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2014-01-24
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多