如何将Thin运行在不同的端口?

7

我有一个非常基本的测试应用程序。当我执行此命令时,服务器忽略我指定的端口并在4567端口上运行Thin。为什么会忽略我指定的端口?

$ruby xxx.rb start -p 8000

== Sinatra/1.3.3 has taken the stage on 4567 for production with backup from Thin
>> Thin web server (v1.4.1 codename Chromeo)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop

xxx.rb 文件

require 'Thin'

rackup_file = "config.ru" 

argv = ARGV
argv << ["-R", rackup_file ] unless ARGV.include?("-R")
argv << ["-e", "production"] unless ARGV.include?("-e")

puts argv.flatten

Thin::Runner.new(argv.flatten).run!

config.ru文件

require 'sinatra'
require 'sinatra/base'

class SingingRain < Sinatra::Base
    get '/' do
        return 'hello'
    end
end

SingingRain.run!
3个回答

16
#\ -p 8000

将此代码放在config.ru文件的顶部。


这个命令可以在Sinatra/Thin中运行,命令是“rackup”。完美! - chrisallick

14

您的问题出在这一行:

SingingRain.run!

这是Sinatra的run方法,它告诉Sinatra启动自己的Web服务器,默认情况下在端口4567上运行。这在您的config.ru文件中,但config.ru只是Ruby,因此该行会像在任何其他.rb文件中一样运行。这就是为什么您会看到Sinatra在该端口上启动的原因。
当您使用CTRL-C停止此服务器时,Thin将尝试继续加载config.ru文件以确定要运行的应用程序。实际上,您没有在config.ru中指定应用程序,因此您将看到类似以下内容的内容:
^C>> Stopping ...

== Sinatra has ended his set (crowd applauds)
/Users/matt/.rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/builder.rb:129:in `to_app': missing run or map statement (RuntimeError)
        from config.ru:1:in `<main>'
        ...

这个错误只是告诉你在配置文件中没有实际指定要运行的应用程序。
请使用 SingingRain.start,而不是 SingingRain.run!
run SingingRain

run是一个Rack方法,用于指定要运行的应用程序。您也可以执行run SingingRain.new - Sinatra采取措施使您能够在此处仅使用类本身或实例。

现在这个的输出应该只是:

>> Thin web server (v1.4.1 codename Chromeo)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:8000, CTRL+C to stop

您看到的“== Sinatra/1.3.2 has taken the stage on 4567 for production with backup from Thin”信息是因为Sinatra并未运行其内置服务器,而只是按照您配置的方式使用了Thin服务器。请注意保留HTML标签。

有时候很难得到像你这样好的答案。非常感谢 :) - Roman
你的回答对我很有帮助,但我有另一个问题。现在当我运行 $ ruby thinx.rb start -d 命令时,即使服务器正常启动,我也会得到两个 exit 输出。你知道这是怎么回事吗? - Roman
@Arman 抱歉,我不知道你的两个输出出了什么问题 - 我这边没有出现过这种情况。 - matt

-3
在你的config.ru中添加以下内容:

set :port=> 8000

此外,我强烈建议使用Sinatra与像passenger+nginx这样的东西,这可以让你轻松部署到生产环境。但如果你将要部署到Heroku上,就无需担心这个问题。

Thin:Runner 构造函数是否按照此处文档所述解析命令行参数?https://github.com/macournoyer/thin/blob/master/lib/thin/runner.rb - Roman
看起来像是那样,但如果您正在使用config.ru文件,我不太确定它是如何工作的。如果您没有创建config.ru文件,而只是.rb文件,则thin会接受-p参数。 - djd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接