puma 服务器上的 sinatra 应用程序通过非引导可执行文件设置为端口 80

sinatra app on puma server set to port 80 via non-bootstraped executable

我正在尝试将我的应用程序绑定到端口 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 之外,我找不到其他设置端口的方法。 我正在使用 chef 来配置应用程序并启动它,它应该具有超级用户访问权限。

P.s。以防万一它不明显,当我说非引导时我的意思是不执行运行 rackup 或其他东西的系统命令。

在深入研究 rack 和 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) }