Ruby 当通过vagrant部署到VM并由varnish提供并作为deamon运行时,sinatra应用程序在生产模式下暂停

Ruby 当通过vagrant部署到VM并由varnish提供并作为deamon运行时,sinatra应用程序在生产模式下暂停,ruby,sinatra,vagrant,chef-infra,sinatra-assetpack,Ruby,Sinatra,Vagrant,Chef Infra,Sinatra Assetpack,我有一个sinatra应用程序,当我在生产中运行它时,它的表现很糟糕 第一个请求工作,下载资产并加载页面。 但是,如果刷新页面,请求就会暂停,并且没有任何内容被注销到日志文件中 我正在使用sinatra asset pack运行,在启动之前,我已经预编译了这些资产 我会发布代码,但我不确定解决这个问题需要什么 编辑:它在我自己的机器上运行良好,但当我使用vagrant将其部署到VM时,它只是在生产模式下停止,但在开发模式下也可以 编辑:我能让它吐出这个错误: 埃皮普 io_写入时管道破裂- 并将

我有一个sinatra应用程序,当我在生产中运行它时,它的表现很糟糕

第一个请求工作,下载资产并加载页面。 但是,如果刷新页面,请求就会暂停,并且没有任何内容被注销到日志文件中

我正在使用sinatra asset pack运行,在启动之前,我已经预编译了这些资产

我会发布代码,但我不确定解决这个问题需要什么

编辑:它在我自己的机器上运行良好,但当我使用vagrant将其部署到VM时,它只是在生产模式下停止,但在开发模式下也可以

编辑:我能让它吐出这个错误:

埃皮普 io_写入时管道破裂-

并将其缩小为一个操作,但是在操作中发布代码是毫无意义的,因为它不会注销任何内容,并且操作的第一行是一个日志操作,因此我不确定操作是否运行;日志记录是在问题发生后添加的,所以不管是什么,我不认为是这样

编辑:错误实际上发生在这里(sinatra的base.rb(1144):

1142 def dump_errors!(boom)
1143  msg = ["#{Time.now.strftime("%Y-%m-%d %H:%M:%S")} - #{boom.class} - #{boom.message}:", *boom.backtrace].join("\n\t")
1144  @env['rack.errors'].puts(msg)
1145 end

编辑:好的,所以当我手动运行部署命令时,它工作正常;奇怪的是,服务器的输出仍然被输出到终端,尽管它被分叉了,我想知道这是否是问题所在。断开的管道是不再存在的终端(当通过chef部署时)因此,它正在破裂……也许?

好吧,原来是管道破裂的原因,出于某种原因,即使在分叉之后,它仍试图将stdout和stderr写入终端。 但是,由于终端不再存在(由chef启动),它无法再写入输出,因此被锁定,因此在VM上手动启动应用程序可以使其工作,进一步证明这一结论的是,在start命令末尾添加重定向(
>app.log 2>&1
)可以使应用程序工作

为什么sinatra仍然在向终端写入日志,而不是我不知道的文件,我需要解决这个问题,但主要的问题是为什么解决了

编辑:

最后,我只是这样做:

$stderr = @log.file
$stdout = @log.file
将它重定向到我的日志所在的位置,这样现在就可以了…我想