puma服务器上的sinatra app通过非引导可执行文件

时间:2015-07-03 14:32:29

标签: ruby sinatra puma

我试图将我的应用绑定到端口80,它绑定到' 0.0.0.0'很好,但使用

set :port,80

不会将其设置更改为端口。

我不能使用任何需要我在外部设置端口的东西,因为我从这样的可执行文件中启动我的应用程序:

    if options[:daemonize]
        use Rack::Deflater
        pid = fork {Rack::Handler::pick(['puma']).run VCK::App}
        File.open(options[:pid], 'w') {|f| f.write(pid)}
        Process.detach(pid)
    else
        use Rack::Deflater
        Rack::Handler::pick(['puma']).run VCK::App
    end

我已经查看但超越了使用set我无法找到设置端口的方法。 我正在使用厨师配置应用程序并启动应该具有超级用户访问权限的应用程序。

P.S。为了防止它显而易见,当我说非引导时,我的意思是不执行运行rackup的系统命令。

1 个答案:

答案 0 :(得分:0)

通过机架和puma源代码挖掘后,我得到了答案。

当您使用.run时,您只需将其传递出去:

Rack::Handler::pick(['puma']).run VCK::App, {:Port => 80}

所以我的代码最终会像这样:

    server_config = {
        :Host => options[:host],
        :Port => options[:port],
        :Threads => "0:#{options[:threads]}",
        :Verbose => options[:verbose],
        :environment => options[:environment]
    }
    if options[:daemonize]
        use Rack::Deflater
        pid = fork {Rack::Handler::pick(['puma']).run VCK::App,server_config}
        File.open(options[:pid], 'w') {|f| f.write(pid)}
        Process.detach(pid)
    else
        use Rack::Deflater
        Rack::Handler::pick(['puma']).run VCK::App
    end

在后方网站中显而易见。

另外,我想说明我在机架处理程序代码中找到的用于检索服务器对象的这条线非常聪明:

klass.split("::").inject(Object) { |o, x| o.const_get(x) }