我有一个使用Thin运行的模块化Sinatra Web应用程序,EventMachine运行其他任务。
它有效,但网络服务器有点奇怪:任何请求,无论是成功还是404,都不会出现在Thin / Sinatra的日志输出中。当我取消该过程时,服务器结束两次。
以下是该应用程序的粗略基本结构:
Procfile:
web: ruby app.rb
app.rb:
require 'thin'
require 'eventmachine'
require 'app/frontend'
EM.run do
# Start some background tasks here...
EM.add_periodic_timer(1200) do
# Do a repeating task here...
end
App::Frontend.run!
end
应用程序/ frontend.rb:
require 'sinatra/base'
module App
class Frontend < Sinatra::Base
get '/' do
# Display page
end
# etc
end
end
当我foreman start
时,我得到:
16:50:00 web.1 | started with pid 76423
16:50:01 web.1 | [messages about EventMachine background tasks starting]
16:50:01 web.1 | == Sinatra/1.4.3 has taken the stage on 5000 for development with backup from Thin
16:50:01 web.1 | >> Thin web server (v1.5.1 codename Straight Razor)
16:50:01 web.1 | >> Maximum connections set to 1024
16:50:01 web.1 | >> Listening on 0.0.0.0:5000, CTRL+C to stop
当我请求现有网页(加载正常)或不存在的网页时,不会输出任何内容。当我取消这个过程时,我得到了:
^CSIGINT received
16:50:08 system | sending SIGTERM to all processes
SIGTERM received
16:50:08 web.1 | >> Stopping ...
16:50:08 web.1 | == Sinatra has ended his set (crowd applauds)
16:50:08 web.1 | >> Stopping ...
16:50:08 web.1 | == Sinatra has ended his set (crowd applauds)
16:50:08 web.1 | exited with code 0
Sinatra两次结束让我觉得我在某种程度上运行了两次,并且正在为网页服务的那个没有被记录......但我不知道我是如何管理这个的!
答案 0 :(得分:3)
docs on Modular vs. Classic style提到默认设置有一些更改,其中一个是日志记录,默认情况下已关闭。
将settings.logging = true
添加到class Frontend < Sinatra::Base
的顶部,可以在我的终端窗口中记录localhost:5000个请求。
我不认为第二个问题是它创建了两个进程,而是它在关闭服务器之前就杀死并重新启动进程。这可以通过遵循Sinatra配方使用EventMachine和Sinatra来解决,这比你做的要复杂一点。这是他们的代码,经过修改以适合您的应用:
新的app.rb
:
EM.run do
server = 'thin'
host = '0.0.0.0'
port = ENV['PORT'] || '8181'
web_app = App::Frontend.new
# Start some background tasks here...
EM.add_periodic_timer(1200) do
# Do a repeating task here...
end
dispatch = Rack::Builder.app do
map '/' do
run web_app
end
end
Rack::Server.start({
app: dispatch,
server: server,
Host: host,
Port: port
})
end
(original source, from Sinatra Recipes)
在app.rb中使用ENV['PORT']
可让您在领班中使用多个实例(例如,foreman start -p 4000 -c web=2
,它将在端口4000和4001上运行服务)。它们都出现在日志中!
希望有所帮助。