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!
4

3 回答 3

16
#\ -p 8000

把它放在 config.ru 的顶部

于 2013-09-24T03:01:41.890 回答
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.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 没有运行其内置服务器,它只是您配置的瘦服务器。

于 2012-09-25T11:21:12.523 回答
-3

在你的 config.ru 添加

设置:端口=> 8000

另外我强烈建议将 Sinatra 与乘客 + nginx 之类的东西一起使用,这使得部署到生产环境变得轻而易举。但是,如果您要部署到 heroku,则不必担心这一点。

于 2012-09-24T06:14:10.310 回答