rails db:migrate导致Errno :: ECONNRESET,在capistrano部署期间通过对等方重置连接

问题描述:

我们遇到了ssh级别连接错误的问题,似乎是超时,在运行我们的capistrano部署的长时间部署中使用大型导轨db迁移任务。我们唯一的帮助就是将它们转移到我们在部署后手动运行的rake任务上,这并不理想。 ruby/rails堆栈或外部的任何想法,以确保ssh连接保持活着?rails db:migrate导致Errno :: ECONNRESET,在capistrano部署期间通过对等方重置连接

Errno::ECONNRESET, Connection reset by peer 

完全跟踪:

** [deploy:update_code] exception while rolling back: Errno::ECONNRESET, Connection reset by peer - recvfrom(2) 
/Users/Ben/.rvm/gems/[email protected]/gems/net-ssh-2.9.2/lib/net/ssh/buffered_io.rb:65:in `recv': Connection reset by peer - recvfrom(2) (Errno::ECONNRESET) 
    from /Users/Ben/.rvm/gems/[email protected]/gems/net-ssh-2.9.2/lib/net/ssh/buffered_io.rb:65:in `fill' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/net-ssh-2.9.2/lib/net/ssh/connection/session.rb:237:in `block in postprocess' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/net-ssh-2.9.2/lib/net/ssh/connection/session.rb:233:in `each' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/net-ssh-2.9.2/lib/net/ssh/connection/session.rb:233:in `postprocess' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/processable.rb:33:in `block in process_iteration' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/processable.rb:45:in `block in ensure_each_session' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/processable.rb:43:in `each' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/processable.rb:43:in `ensure_each_session' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/processable.rb:31:in `process_iteration' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/command.rb:171:in `block (2 levels) in process!' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/command.rb:170:in `loop' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/command.rb:170:in `block in process!' 
    from /Users/Ben/.rvm/rubies/ruby-1.9.3-p550/lib/ruby/1.9.1/benchmark.rb:295:in `realtime' 
    from /Users/Ben/.rvm/gems/[email protected]/gems/capistrano-2.15.5/lib/capistrano/command.rb:169:in `process!' 
+0

注意两件事情,我试图作为我的Mac OSX用户把一个.ssh/config文件与: 主机* ServerAliveInterval 120我也使用net-ssh(> = 2.9.2)ruby gem其中认为是在部署期间使用 – bjm88 2015-02-10 17:47:34

“连接被对方​​复位”通常意味着无论是在连接的远程端软件崩溃,或者在客户端和服务器之间的一些状态防火墙正在干扰TCP连接。

在这种情况下,远程软件应该是SSH服务器。而你说这发生在长时间的部署上。考虑到这些事情,我怀疑你在客户端和服务器之间有一个NAT设备或其他有状态的防火墙,并且在一段时间后它会丢弃TCP连接。

您可以尝试设置您的客户端发送Keepalive数据包。我不是Ruby开发人员,但this page描述了一个Keepalive选项。除此之外,您应该与网络工程师通话,看看是否可以对干扰连接的设备进行任何操作。

所以希望这可以帮助别人,我想我找到了自己的问题的答案。

在我们的情况下,我们的网站和工作人员都通过capistrano进行了新的部署。网络工具箱正在执行更昂贵的长时间运行任务,如资产编译和发布到AWS S3存储桶。当发生这种情况时,我们的工作人员箱变得闲置,并从没有任何活动中超时。卡皮斯特拉诺发现这是一次全面失败并回滚发布。

这里有几个选项,比如提前编译导轨资产管道资源,甚至先发布到aws,然后开始其他部署步骤。

我们opt'd只是有我们的服务器的客户端做平保持活动的SSH水平

须藤的vim的/ etc/SSH/sshd_config中 添加以下两行到文件: ClientAliveInterval 60 ClientAliveCountMax 200

注意一些网站只提到第一个,我发现它不工作得很好,除非把第二个网站也放在第一个网站上,因为我怀疑默认最大计数是低的。

确保在每个部署目标机器发生更改后重新启动ssh服务。

只需运行rake db:在您的项目上进行迁移,然后将其部署到服务器上,然后运行rake production deploy。