12

我有一个尝试使用 jRuby 运行的 Sinatra“hello world”应用程序。它在我运行应用程序时有效,但在我运行 rackup 时无效。谁能告诉我这里发生了什么?

这是应用程序,在文件“app.rb”中:

require 'rubygems'
require 'bundler/setup'
require 'sinatra'

configure do
  set :bind, '0.0.0.0'
end

get '/' do
  'Boo!'
end

我可以使用它运行bundle exec ruby app.rb它,它工作正常:

jonea@centos7andy[~/andy/sinatra_sand_jruby]%: bundle exec ruby app.rb
[2015-01-12 10:36:06] INFO  WEBrick 1.3.1
[2015-01-12 10:36:06] INFO  ruby 1.9.3 (2014-12-09) [java]
== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from WEBrick
[2015-01-12 10:36:06] INFO  WEBrick::HTTPServer#start: pid=31654 port=4567

这是我调用上述程序的 config.ru:

require 'rubygems'
require 'bundler/setup'
require 'sinatra'
require './app'

run Sinatra::Application

如果我运行它,它似乎可以工作,但我无法使用 Web 浏览器访问服务器:

jonea@centos7andy[~/andy/sinatra_sand_jruby]%: bundle exec rackup -p4567
[2015-01-12 10:29:06] INFO  WEBrick 1.3.1
[2015-01-12 10:29:06] INFO  ruby 1.9.3 (2014-12-09) [java]
[2015-01-12 10:29:06] INFO  WEBrick::HTTPServer#start: pid=31553 port=4567

我注意到“Sinatra 已经上台……”的可疑缺乏

4

4 回答 4

35

当您直接运行 Ruby 文件时(或者当您添加Sinatra.run!config.ru文件中时),Sinatra 运行它自己的服务器。在这种情况下,调用 set :bind, '0.0.0.0' 将生效。当您运行rackup此设置时将被忽略。

rackup 监听localhost的默认主机是,因此服务器只能通过同一台机器访问,您将无法从其他机器访问它。要通过其他机器访问它,请设置--host选项:

bundle exec rackup -p4567 --host 0.0.0.0

(注意rackup -h当前版本的输出显示默认主机是 0.0.0.0,但这已经过时并且已在 master 中修复。)

于 2015-01-12T14:16:47.467 回答
4

好吧,这不足以解释发生了什么,但如果我在 config.ru 中替换,我可以让它工作

run Sinatra::Application

Sinatra::Application.run!

事实上,知道这一点让我更加困惑。机架中的某种错误?

于 2015-01-12T11:14:30.237 回答
2
#config.ru
require "./app.rb"

set :bind, '0.0.0.0'
set :port, 9292 #set your port!
Sinatra::Application.run!

试试这个代码并输入rackup

然后你就可以得到你想要的结果。

于 2018-10-03T10:45:12.807 回答
1

我的情况略有相似。但不同的是,我的 Jruby + Sinatra rackup 应用程序终于开始响应了。

但这需要很多时间,有时它会在应用启动后 5 分钟开始响应。我发现,在应用程序启动端口后一段时间没有被监听。

如果我们让 netstat -an 它不会显示我们的应用程序端口。其实我不知道这种行为的原因,但我会挖掘它。

于 2015-02-26T11:14:16.457 回答