1

私はルビーが初めてで、現在カピストラーノでの展開に問題があります。私が得ているエラーの下。

cap aborted!
Operation timed out - connect(2)
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/net-ssh-2.7.0/lib/net/ssh/transport/session.rb:67:in `initialize'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/net-ssh-2.7.0/lib/net/ssh/transport/session.rb:67:in `open'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/net-ssh-2.7.0/lib/net/ssh/transport/session.rb:67:in `block in initialize'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/net-ssh-2.7.0/lib/net/ssh/transport/session.rb:67:in `initialize'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/net-ssh-2.7.0/lib/net/ssh.rb:200:in `new'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/net-ssh-2.7.0/lib/net/ssh.rb:200:in `start'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/backends/netssh.rb:156:in `ssh'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/backends/netssh.rb:109:in `block in _execute'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/backends/netssh.rb:106:in `tap'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/backends/netssh.rb:106:in `_execute'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/backends/netssh.rb:54:in `execute'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/backends/abstract.rb:75:in `within'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/capistrano-3.0.0/lib/capistrano/tasks/git.rake:44:in `block (3 levels) in <top (required)>'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/backends/netssh.rb:42:in `instance_exec'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/backends/netssh.rb:42:in `run'
/Users/stefydu/.rvm/gems/ruby-2.0.0-p247/gems/sshkit-1.0.0/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute'
Tasks: TOP => git:create_release => git:update
(See full trace by running task with --trace)
4

2 に答える 2

0

Capistrano は現在、SSH に接続プールを使用しています: https://github.com/capistrano/sshkit/pull/70

于 2013-12-30T14:33:01.603 に答える
0

解決策ではありませんが、回避策の説明:

Capistrano 3 と sshkit は、既存の SSH 接続を再利用しませんが、タスクごとに新しい接続を開始します ( https://github.com/capistrano/sshkit/issues/34を参照)。

一部のサーバー、それぞれのファイアウォールは、新しい接続要求が高速になった場合、または開いている接続が多すぎる場合にブロックするようです。

ソリューション:

  • 接続を再利用するように SSHKit/Capistrano を修正
  • 大量の並列 ssh セッションを許可するようにサーバー/ファイアウォールを構成します (単純な Rails アプリの場合、約 15)。
  • 以下の私のハックを使用してください(免責事項:いいえ、使用しないでください):

gems/sshkit-1.1.0/lib/sshkit/backends/netssh.rb の execute メソッドを拡張 (monkeypatch) します。これは、Capfile を介して実行できます。

# Overwrite execute method to avoid timeouts
class SSHKit::Backend::Netssh
  def execute(*args)
    _execute(*args).success?
  rescue Errno::ETIMEDOUT
    @tries ||= 0
    raise "Nope, no way" if @tries > 5
    puts "Timeout. yeah. Try it again (#{@tries})" 
    sleep 5
    @tries += 1
    execute(*args)
    end
end

これにより、サーバーに呼吸の機会が与えられます...

于 2013-11-14T12:57:26.937 に答える