【问题标题】:mysterious rails error with almost no trace几乎没有痕迹的神秘 Rails 错误
【发布时间】:2014-08-28 00:13:17
【问题描述】:

我们的一个爬虫遇到了一个奇怪的问题。有时它会在某些请求上抛出Rails FATAL 错误,但跟踪非常有限,看起来像这样

[2014-07-01 18:16:37] FATAL Rails :
ArgumentError (invalid %-encoding (c ^   FK+ 9u$_    t  Kl
ΥE!   =k \  ̕* ߚ>c+<O   یo ʘ> C     R! 2 D  (5      x q#!` 4 p      |8 I   E
:+   H^9`^ #    Vo{   >

  =[z     )):
  lib/locale_middleware.rb:14:in `call'

爬虫用户代理是

Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)

我们可以通过robots.txt 要求它停止抓取我们,但最好处理根本原因,如果可能的话,不要在这些请求上失败并返回 500。

我们也无法真正重现此类请求,因此任何有关如何生成类似请求的建议都会有很大帮助。

我们在 Ubuntu 12.04 上使用 Rails 3.2.19,Unicorn。这是我们的locale_middleware.rb

【问题讨论】:

  • 您可以通过在您的请求网址中添加?%9g 来复制吗?例如:your.site/path/to/a/get?%9g
  • 我猜异常发生在下一个中间件层。 LocaleMiddleware 之后发生了什么?你可以运行rake middleware
  • @BenjaminSinclaire - 添加?%9g 似乎会从我们的nginx 产生400 响应,它甚至没有命中轨道。但是,您是从哪里拿到这个%9g 的? (我越来越好奇)
  • @PavelEvstigneev - 在 LocaleMiddleware 之后我们有 Omniauth::Builder ,之后是我们的应用程序路由。

标签: ruby-on-rails encoding web-crawler fatal-error


【解决方案1】:

特别感谢 Benjamin Sinclare 指向right issue on github

解决方案被描述为on this comment

config.middleware.use ::Rack::Robustness do |g|
  g.no_catch_all
  g.on(ArgumentError) { |ex| 400 }
  g.content_type 'text/plain'
  g.body{ |ex| ex.message }
  g.ensure(true) { |ex| env['rack.errors'].write(ex.message) }
end

【讨论】:

  • 这会捕获每个ArgumentError,包括那些与编码错误无关的吗?我认为确实如此,这可能是有问题的。如果你不想这样,see this solution.
  • 据我了解,这将捕获从我们的应用程序外部抛出的ArgumentError。无论如何,我们在应用程序控制器的代码库中捕获ArgumentErrors。所以暴露只在代码库之外,例如中间件/Rails 本身。另外,我在上面的 sn-p 中添加了一个记录器方法,到目前为止,除了那些编码问题之外,还没有发现任何其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2017-04-20
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多