【问题标题】:Errno::ECONNRESET: Connection reset by peer in Rails using rest-clientErrno::ECONNRESET:Rails 中的 peer 使用 rest-client 重置连接
【发布时间】:2018-09-09 02:03:06
【问题描述】:

我们有一个 Ruby on Rails 应用程序,它具有“搜索”功能(搜索某些公司)。从浏览器用户键入一些名称并点击搜索,然后此搜索对外部系统进行 rest api 调用并为我们提供一些搜索结果。

我们正在使用“rest-client”(用于 Ruby on Rails)。

我注意到这似乎工作了几个小时,突然我的搜索似乎突然中断了,我可以在我的日志中看到:

Errno::ECONNRESET:对等方重置连接

我们试图通过查看日志来调查此问题,但没有看到任何日志。

如果我们需要让这个搜索再次工作,我们需要重新启动乘客,然后它会立即工作。这仅在生产环境中发生。我在 staging 中进行了测试,它似乎运行良好。

问题:

  1. 是什么导致了这个“重置问题”
  2. 为什么在我的 prod 乘客重置时它又开始工作了。
  3. 我们使用reset-client应该写一个代码,当这个异常发生时手动关闭连接。
  4. 防火墙中的任何问题都可能导致此问题?
  5. 我可以在异常中放置任何代码来重新启动此连接,以便下一次调用成功。

代码:

def call
   resp_data = RestClient.get(@request_url, @header)
   rescue => error
     puts 'Exception: ' error.message
end

【问题讨论】:

  • 当我们从 rails 控制台 curl 或调用 APi 时,它可以正常工作而无需重新启动乘客。仅在发出浏览器请求时才会失败
  • 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
  • 注意:在 Stack Overflow 上,对要求优先处理的问题在 7 小时内 +4 点赞是相当罕见的。因此,如果您的同事或您认识的其他人对此进行了有益的投票,请让他们停止 - 在这里相互投票被视为非常糟糕。
  • 我也是。这个错误很奇怪。

标签: ruby-on-rails ruby passenger rest-client phusion


【解决方案1】:

这是非常有线的。我遇到了同样的问题。

我的脚本如下所示:(在我的本地机器上运行良好,在远程服务器上运行良好,直到有一天磁盘已满,这个脚本死了,说:Errno::ECONNRESET: Connection reset by peer

ENV['RAILS_ENV'] = ARGV.first || ENV['RAILS_ENV'] || 'production'
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'rails'
require 'rubygems'

require 'rest-client'

url = 'https://api-cn.faceplusplus.com/cardpp/v1/ocridcard'
id_card = File.expand_path(File.dirname(__FILE__) + "/id_card.jpg")

puts "== id_card: #{id_card}"
response = RestClient.post url,
  {
    api_key: 'Td_XijYBZUMp',
    api_secret: 'ihehEuWYwOWM',
    image_file: File.open(id_card, 'rb')
  }

puts "==response: "
puts response.inspect

我的环境:ruby 2.5.0,ubuntu server 16,8核CPU,50G ram

当我发现我的硬盘被 100% 使用时,就会出现这个问题。没有空间了。

但是,一旦我释放了足够的磁盘空间,这个问题就存在了。

重新启动服务器后,此问题存在。

当我在rails 下运行这个脚本时,这个问题就存在了。

但是,当我单独运行此脚本时,它运行良好。

所以,最后,我转向“curl”命令。效果很好!

工作的 CURL 脚本如下所示:

$ curl -X POST "https://api-cn.faceplusplus.com/cardpp/v1/ocridcard" \ 
-F "api_key=Td_XijYBCOYh-Rf_kCMj" \
-F "api_secret=iheWYoQcbCPM9n2VS" \
-F "image_file=@scripts/id_card.jpg

【讨论】:

  • 希望这不是你真正的 api 密钥/秘密 :(
  • @ChrisKimpton 谢谢,它是其中的一部分。我删除了一些。
【解决方案2】:

尝试以下方法

resp_data = RestClient::Request.new(
    method: :get,
    url: @request_url, #=> https://api.example.com/auth2/endpoint
    :headers => {
        :Authorization => @header, #=> "Bearer access_token",
    }
)

rescue => error
    puts 'Exception: ' error.message

【讨论】:

    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2012-06-16
    • 2015-05-07
    • 1970-01-01
    • 2014-08-25
    • 2019-11-04
    相关资源
    最近更新 更多