我有一个非常基本的测试应用程序。当我执行此命令时,服务器忽略我指定的端口并在端口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!
答案 0 :(得分:16)
#\ -p 8000
把它放在config.ru的顶部
答案 1 :(得分:14)
你的问题在于:
SingingRain.run!
这是Sinatra的run
method,它告诉Sinatra默认启动自己的网络服务器,该服务器在端口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没有运行其内置服务器,只是您配置它时的瘦服务器。
答案 2 :(得分:-3)
在你的config.ru中添加
set:port =&gt; 8000
此外,我强烈建议将Sinatra与乘客+ nginx一起使用,这使得部署到生产变得轻而易举。但是如果你要部署到heroku,你不必担心这个。