我有一个 Ruby on Rails 网站,它可以对外部 Web 服务进行 HTTP 调用。

大约每天一次,我会收到一封 SystemExit(下面的堆栈跟踪)错误电子邮件,其中对服务的调用失败。如果稍后我在我的网站上尝试完全相同的查询,它就可以正常工作。自从网站上线以来,这种情况就一直在发生,但我没能找到导致这种情况的原因。

Ruby 的版本是 1.8.6,rails 的版本是 1.2.6。

还有其他人有这个问题吗?

这是错误和堆栈跟踪。

发生了一个系统exit,/usr/local/lib/ruby/gems/1.8/gems/rails/rails-1.2.6/lib/fcgi_handler.rb:116:iin rails-1.2.6/lib/fcgi_handler.rb:116:在exit_now_handler中'/usr/local/lib/ruby/1.8/net/protococol.rb:133:1 in呼叫'/usr/local/lib/lib/ruby/1.8/net/protocol.rb:133:133:in sysread lib/ruby/1.8/net/stoloption.rb:133:在rbuf_fill'/usr/local/lib/lib/ruby/1.8/timeout.rb:56:iin timeout'/usr/local/lib/lib/lib/ruby/1.8/timeout。 RB:76:在超时'/usr/local/lib/ruby/1.8/net/protocol.rb:132:iin rbuf_fill'/usr/local/local/lib/lib/ruby/1.8/net/net/net/protcol.rb:116:In readuntiltiltilti '/usr/local/lib/ruby/1.8/net/protocol.rb:126:in Readline'/usr/local/lib/lib/ruby/1.8/net/http.rb:rb:2017: in Read_status_line'read_status_line'/usr/local/local/local/local/local/local/local/local/local/ lib/ruby/1.8/net/http.rb:2006:在read_new'/usr/local/lib/lib/ruby/1.8/net/http.rb:1047:in请求'/usr/local/lib/lib/lib/ruby/1.8//1.8/ net/http.rb:945:in request_get'/usr/local/lib/lib/ruby/1.8/net/http.rb:380:iin 543:in Start'/usr/local/lib/ruby/1.8/net/http.rb:379:in get_response'

有帮助吗?

解决方案

众所周知,将 fcgi 与 Ruby 一起使用会出现很多错误。

几乎每个人都搬到了 杂种 因此,我建议您也这样做。

其他提示

自从我使用 FCGI 以来已经有一段时间了,但我认为如果线程花费太长时间,FCGI 进程可能会抛出 SystemExit。这可能是 Web 服务没有响应,甚至是 DNS 查询速度缓慢。一些谷歌结果显示 Python 和 FCGI 存在类似的错误,因此转向 mongrel 将是一个好主意。 这个帖子 是我用来设置 mongrel 的参考,我仍然参考它。

我以前一直在 Apache1/fastcgi 上获取这些。我认为这是由于 fastcgi 在 Ruby 完成之前挂起造成的。

转向混合型是很好的第一步,但还有更多工作要做。从实时页面上的 Web 服务(尤其是 Rails)中剔除是一个坏主意。Rails 不是线程安全的。您可以支持的并发连接数等于集群中的混合进程(或乘客进程)的数量。

如果您有一个杂种,并且有人访问一个调用 Web 服务的页面,该服务需要 10 秒才能超时,那么在此期间对您网站的每个请求都会超时。大多数负载均衡器只是盲目地循环您的杂种,因此如果您有两个杂种,则所有其他请求都会超时。

任何可能异常缓慢的事情都需要在作业队列中发生。第一次点击 /slow/action 会将作业添加到队列中,并且 /slow/action 通过页面刷新或通过 ajax 查询不断刷新,直到作业完成,然后您从作业队列中获取结果。如今,Rails 有一些作业队列,但最古老且可能使用最广泛的一个是 背景RB.

另一种选择是,根据应用程序的性质,通过 cron 每 N 分钟剔除一次服务,在本地缓存数据,并从缓存中读取实时页面。

我也想看看 乘客. 。比 Apache/nginx + Mongrel 的传统解决方案更容易上手。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top