当通过 vagrant 部署到 VM 并由 varnish 和 运行 作为守护程序配置时,sinatra 应用程序在生产模式下停滞

sinatra app stalls in production mode when deployed via vagrant to a VM and provisioned by varnish and run as a deamon

我有一个 sinatra 应用程序,当我 运行 它在生产中时它表现得很奇怪。

第一个请求有效,资产下载和页面加载。 但是,如果您刷新页面,请求就会停止,并且不会将任何内容记录到日志文件中。

我是 运行 sinatra-asset-pack 并且我在启动之前预编译了资产。

我会 post 代码,但我不确定解决问题需要什么

编辑:它在我自己的盒子上运行良好,但是当我使用 vagrant 将它部署到 VM 时,它只是在生产模式下停止,但在开发模式下很好。

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

错误号::EPIPE 破管 @ io_write -

并将其缩小为一个动作,但是 post 在动作中输入代码是没有意义的,因为它不会记录任何内容并且动作的第一行 一个记录动作,所以我不确定这个动作是否得到 运行;日志记录是在问题出现后添加的,所以不管它是什么,我不认为是这样。

编辑:错误实际上发生在这里(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

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

好吧,事实证明管道破裂是原因,出于某种原因,即使在分叉后它仍在尝试将 stdout 和 stderr 写入终端。 然而,由于终端不再存在(它由厨师启动),它无法再写入输出并因此被锁定,在 VM 上手动启动应用程序允许它工作,并且进一步证明这个结论的证据是添加重定向(>> app.log 2>&1) 到启动命令的末尾允许应用程序运行。

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

编辑:

最后我只是这样做:

$stderr = @log.file
$stdout = @log.file

将其重定向到与我的日志相同的位置,这样现在应该没问题了……我想?