当通过 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
将其重定向到与我的日志相同的位置,这样现在应该没问题了……我想?
我有一个 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
将其重定向到与我的日志相同的位置,这样现在应该没问题了……我想?