Rails 4 - Ruby 2.2.2 - 亚马逊AWS S3 - 蜻蜓1.0.12 - dragonfly-s3_data_store 1.2 - fog-aws 0.10.0
大约99%的时间我们都没有问题.这个问题通常只发生在使用率很高的时候,但我发现只有几乎没有用户才会发生.抛出错误的行:
# excon/lib/excon/socket.rb
# line 100 inside the connection method.
addrinfo = ::Socket.getaddrinfo(*args)
Run Code Online (Sandbox Code Playgroud)
错误发生在应用程序的任何地方.有时在没有远程连接时会看到错误. - 我无法再验证这一点.
我使用Rails记录器来捕获传入的参数,并且传递和失败之间似乎没有区别.这里有些例子:
# PASS
["s3.amazonaws.com", 443, 0, 1, nil, nil, false]
["mybucket.s3.amazonaws.com", 443, 0, 1, nil, nil, false]
# FAIL
["mybucket.s3-us-west-1.amazonaws.com", 443, 0, 1, nil, nil, false]
Run Code Online (Sandbox Code Playgroud)
我遇到了几个让我相信excon gem需要更新的论坛.我将Excon gem从0.45.4升级到0.51.0.除此之外,我还将Fog gem从1.36.0更新为1.38.0.
升级后,错误从"getaddrinfo:名称或服务未知(SocketError)"变为"Excon :: Error :: Socket:getaddrinfo:没有与主机名关联的地址(SocketError)"
为失败的响应捕获的URL与通过的其中一个URL不同.我会进一步研究这个问题.
更新:
dragonfly初始化程序指定与失败的路径相同的路径,因为url_host会覆盖我决定删除它的默认功能.
# myapp/config/initializers/dragonfly.rb
...
url_host: 'mybucket.s3-us-west-1.amazonaws.com'
Run Code Online (Sandbox Code Playgroud)
这导致没有变化.仍然使用相同的URL,并且是唯一失败的URL.
备份是250MB.我认为这不是很大,但看起来问题是随着尺寸的增加而增加.
从下面的备份gem中记录.
注意时间跨度; 上传大约37分钟后我重置连接.
[2015/10/30 09:20:40][message] Storage::S3 started transferring '2015.10.30.09.20.01.myapp_postgres.tar' to bucket 'myapp-backups'.
[2015/10/30 09:57:06][error] ModelError: Backup for Back up PostgreSQL (myapp_postgres) Failed!
[2015/10/30 09:57:06][error] An Error occured which has caused this Backup to abort before completion.
[2015/10/30 09:57:06][error] Reason: Excon::Errors::SocketError
[2015/10/30 09:57:06][error] Connection reset by peer
Run Code Online (Sandbox Code Playgroud) 我有一个简单的应用程序,通过API接收POSTed图像,并通过Carrierwave发送到S3.我的照片表也有一个counter_cache.
80%的时间我的交易时间是巨大的,比如60秒或更长时间,超过90%的时间用于将图像上传到S3并更新counter_cache.
有没有人知道为什么上传时间如此之大以及为什么反缓存查询需要这么长时间?
刚刚在http://carrierwave-s3-upload-test.herokuapp.com上添加了一些照片
行为类似:
刚从counter_cache
我的代码中删除并进行了更多上传....奇怪的行为再次.
编辑1
上次批量上传的日志.EXCON_DEBUG设置为True:https://gist.github.com/rafaelcgo/561f516a85823e30fbad
编辑2
我的日志没有显示任何EXCON输出信息.所以我意识到我正在使用雾1.3.1.更新为Fog 1.19.0(使用较新版本的excon gem),现在一切正常.
提示..如果您需要调试外部连接,请使用较新版本的excon并设置env EXCON_DEBUG = true以查看一些详细信息,如下所示:https://gist.github.com/geemus/8097874
编辑3
伙计们,更新了gem fog
,现在它很甜蜜.不知道为什么旧版本的雾和excon有这种奇怪的表现.
Using carrierwave for our uploaders, we get a couple of Excon errors each week from our production app. For example:
Excon::Errors::BadRequest: Expected(200) <=> Actual(400 Bad Request) excon.error.response :body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>IncompleteBody</Code><Message>The request body terminated unexpectedly</Message>
Run Code Online (Sandbox Code Playgroud)
我们已经开始在重试块中包装上传过程,并且在经过另一次尝试之后似乎总能正常工作,但我想知道是否有更好的解决方案,因为这会在一段时间后变得难以处理.在我看来,这些错误应该在较低的水平上处理.有没有更好的方法来处理这些问题?
这是我们的生产配置:
config.storage = :fog
config.root = Dir.tmpdir
config.cache_dir = 'carrierwave'
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
aws_secret_access_key: ENV['AWS_ACCESS_KEY'],
}
config.fog_directory = ENV['AWS_S3_BUCKET']
config.fog_public = false
config.fog_authenticated_url_expiration = 7.days.to_i
config.enable_processing = true
Run Code Online (Sandbox Code Playgroud)
我们正在使用gem版本:
fog (1.27.0)
carrierwave (0.10.0)
excon (0.43.0)
Run Code Online (Sandbox Code Playgroud) 我在Ruby中使用Mandrill-api以编程方式发送交易电子邮件.
我在rails应用程序中有(或多或少)以下行,
mandrill ||= Mandrill::API.new const(:API)[:MANDRILL_APIKEY]
... (constructing the message, content, etc)
mandrill.messages.send_template templ, template_content, message, true
Run Code Online (Sandbox Code Playgroud)
问题是在生产中运行时,偶尔会返回以下错误.
Excon::Errors::SocketError (EOFError (EOFError)):
app/mailers/mailer.rb:24:in `send'
....
Run Code Online (Sandbox Code Playgroud)
我不知道如何调试此问题.如果有人能让我了解调试方法,我非常感谢.
宝石信息:
生产环境:
sudo bundle exec rake RAILS_ENV=production about
About your application's environment
Ruby version 1.9.3 (x86_64-linux)
RubyGems version 1.8.11
Rack version 1.4
Rails version 3.2.13
Active Record version 3.2.13
Action Pack version 3.2.13
Active Resource version 3.2.13
Action Mailer version 3.2.13
Active Support version 3.2.13
Middleware Rack::Cache, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000001e72330>, Rack::Runtime, Rack::MethodOverride, …
Run Code Online (Sandbox Code Playgroud) 我在尝试安装捆绑包时收到此错误。我的宝石集中有 gem excon 的两个版本“0.15.4”和“0.25.1”。我怎样才能解决这个问题?
Bundler could not find compatible versions for gem "excon":
Run Code Online (Sandbox Code Playgroud)
在 Gemfile 中:mandrill-api (>= 0) ruby 依赖于 excon (~> 0.15.4) ruby
fog (~> 1.10.1) ruby depends on
excon (0.25.1)
Run Code Online (Sandbox Code Playgroud) 我们有一个运行很长一段时间的进程(Rake 任务),使用 Faraday 和 net_http_persistent 适配器向远程主机发出 HTTPS 请求。运行几个小时到几天后,它会停止发出请求。
该进程还使用 Excon 发出一些请求(向我们的异常报告服务报告异常),并且两个 HTTP 客户端都记录相同的错误,但措辞略有不同。这两个错误是:
Faraday::SSLError: SSL_connect SYSCALL 返回=5 errno=0 状态=错误:证书验证失败
Excon::Error::Certificate: SSL_connect SYSCALL returned=5 errno=0 state=error: 证书验证失败 (OpenSSL::SSL::SSLError) 无法验证证书。这可能是远程主机或 Excon 的问题。Excon 捆绑了证书,但可以自定义这些证书:
我们的异常报告服务未能收到任何这些异常。所以我们只能在日志中发现这些错误。