从登台服务器连接到 GitoLite 时出错 - ECONNREFUSED 部署错误

Posted

技术标签:

【中文标题】从登台服务器连接到 GitoLite 时出错 - ECONNREFUSED 部署错误【英文标题】:Error Connecting to GitoLite from Staging Server - ECONNREFUSED Deploy Error 【发布时间】:2012-11-08 16:32:14 【问题描述】:

我在尝试将以前工作的项目部署到开发服务器时遇到了一点麻烦。我没有设置系统,但我确实拥有我需要的所有凭据(我认为)。

在尝试 cap staging deploy 之后,我得到了这么多,然后它产生了一个错误。请看下面:

triggering load callbacks
  * 2012-11-20 14:52:20 executing `staging'
    triggering start callbacks for `deploy'
  * 2012-11-20 14:52:20 executing `multistage:ensure'
Identity added: /Users/XXX/.ssh/id_rsa (/Users/XXX/.ssh/id_rsa)
  * 2012-11-20 14:52:20 executing `deploy'
  * 2012-11-20 14:52:20 executing `deploy:update'
 ** transaction: start
  * 2012-11-20 14:52:20 executing `deploy:update_code'
    executing locally: "git ls-remote ssh://gitolite@repo1:2011/proto_projectname_rails HEAD"
    command finished in 2864ms
  * executing "git clone -q ssh://gitolite@repo1:2011/proto_projectname_rails /var/www/projectname/releases/20121120145223 && cd /var/www/projectname/releases/20121120145223 && git checkout -q -b deploy 0598169ed07015279bd78efa91f25ed3e5edcad8 && (echo 0598169ed07015279bd78efa91f25ed3e5edcad8 > /var/www/projectname/releases/20121120145223/REVISION)"
    servers: ["repo2"]
*** [deploy:update_code] rolling back
  * executing "rm -rf /var/www/projectname/releases/20121120145223; true"
    servers: ["repo2"]
 ** [deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: repo2 (Errno::ECONNREFUSED: Connection refused - connect(2))
connection failed for: repo2 (Errno::ECONNREFUSED: Connection refused - connect(2))

部署.rb

set :stages, %w(staging production)
set :default_stage, "production"
require 'capistrano/ext/multistage'

set :application, "projectname"

set :scm, :git
set :repository,  "ssh://gitolite@repo1:2011/proto_projectname_rails"

我真的很困惑为什么以前的工作版本不再起作用。

非常欢迎任何帮助、建议或指导或此事。

谢谢

顺便说一句,是的,它一直是 2011 年的非标准端口,并且在我的 .ssh/config 中

编辑:

此过程涉及 2 台服务器。

在本地和第二台服务器上运行以下命令后,我确实得到了响应。

git ls-remote ssh://gitolite@repo1:2011/proto_projectname_rails

返回;

0598169ed07015279bd78efa91f25ed3e5edcad8    HEAD
0598169ed07015279bd78efa91f25ed3e5edcad8    refs/heads/master

编辑:在 2 个服务器上运行。 Repo1 和 Repo2

cap deploy:check

返回

   triggering load callbacks
 * 2012-11-27 21:02:36 executing `production'
 triggering start callbacks for `deploy:check'
 * 2012-11-27 21:02:36 executing `multistage:ensure'
  Identity added: /Users/x/.ssh/id_rsa (/Users/x/.ssh/id_rsa)
 * 2012-11-27 21:02:36 executing `deploy:check'
 * executing "test -d /var/www/projectname/releases"
   servers: ["repo2"]
   connection failed for: repo2 (Errno::ECONNREFUSED: Connection refused - connect(2))

已解决

事实证明,由于第二个服务器端口号,它被拒绝了。添加

set :port, 1893

赏金仍然对任何能够解释这一点的人开放。

为什么总是可以通过 SSH 连接到服务器,而无需随时编辑我的 ssh/config,并且其他机器能够使用完全相同的部署和暂存文件进行部署,但在我明确添加端口号之前我不能?

【问题讨论】:

当您从登台服务器 (git ls-remote ssh://gitolite@XXX:2011) 连接到 gitolite 时出现错误。请编辑您的问题并发布您的deploy.rb 的顶部 嗨。感谢您的指导。相应地编辑了帖子 【参考方案1】:

有关此问题的最终答案,请参阅下面的更新 2

好的,所以首先要测试的是,您是否可以在本地计算机上运行git ls-remote ssh://gitolite@XXX:2011——它应该返回来自 repo 的引用列表。如果这不起作用,它可能会给您一个类似的错误(连接被拒绝或类似),然后您可能需要从托管 git 存储库的人那里找出原因。

如果它在本地工作,那么您可能需要设置部分或全部这些选项,具体取决于您在部署时希望如何访问 git。我认为需要 forward_agent 选项,除非您的部署服务器/用户可以直接登录到存储库。

set :deploy_via, :remote_cache
default_run_options[:pty] = true
ssh_options[:forward_agent] = true

我在this other stack overflow answer 中描述了如何设置它。

关于 capistrano 要记住的关键是大多数命令实际上只是标准的 shell 命令,但是使用 ssh 传递到远程服务器,就像在ssh user@server.example.com <command> 中一样,所以如果你不能,那将是另一件事来测试让这个工作。

根据添加到原始问题的信息进行更新:

当您使用 URL 与服务器建立 TCP 连接时,您需要指定协议、主机地址和端口号。许多协议都隐含了端口号。例如。 ssh://1.2.3.4 指定标准端口为 22 的 SSH 协议,因此与 ssh://1.2.3.4:22 相同。我猜您的 git 提供程序将不同的端口分配给不同的存储库(可能在相同的 IP 地址上)以路由请求,因此对于您的每个存储库,您可能有不同的端口号。因为它不是正在使用的 ssh 协议的默认端口,所以必须将其指定为 URL 的一部分(而且您似乎可以在 capistrano 中使用 set :port 覆盖它)。

对我来说,同一个项目有多个 git 存储库(repo1repo2)是没有意义的,所以也许我需要了解在什么情况下会发生这种情况,但无论如何,原因错误是您的服务器无法根据提供的 URL 与 git 主机建立 TCP 连接。

更新 2 好的,所以事实证明repo1 是一个 git 存储库。它托管在非标准 SSH 端口 (2011) 上,因此每当引用 git 服务器的 ssh URL 时,都需要将其嵌入到 URL 中。

然而,repo2 实际上只是运行 Rails 应用程序的应用程序服务器(与 git 存储库由相同的源托管),它在非标准 ssh 端口上可用(1893)。为了通过 ssh 连接到该服务器,您需要使用 ssh -p 1893 ... 指定端口——因为这是 capistrano 连接的方式,所以它也是如此。这就是为什么需要添加set :port, 1893

【讨论】:

运行 git ls-remote ssh://gitolite@x.x.x.x:2011/proto_projectname_rails 后返回 0598169ed07015279bd78efa91f25ed3e5edcad8 HEAD 0598169ed07015279bd78efa91f25ed/master./headscad8这是一件积极的事情吧?有什么方法可以让我轻松知道我应该将哪些选项设置为默认值? (系统管理员在没有支持的情况下跳船) 您是否查看了我发布的链接(就在您需要设置的变量部分的下方)? 啊,我错过了。在上面。为你的帮助干杯直到现在 该项目不是托管在 GitHub 上,而是托管在私有服务器上。这会改变需要设置的选项吗?我尝试将这 3 个添加到我的部署文件中,但仍然失败 不,你的 git repo 无关紧要(大多数情况下)。当我说问题出在 capistrano 运行 git ls-remote 命令时,我可能弄错了,我没有注意到下一个命令以 git clone... 开头,而且很明显,第一个命令由 capistrano 在本地运行,第二个命令在远程服务器。使用ssh-agent 设置,然后在本地使用ssh-add,应该允许ssh 传递您的凭据(我们知道在您的git repo 上工作),以便服务器可以使用它们。我认为 ssh_options[:forward_agent] = true 是 cap 中需要的设置。

以上是关于从登台服务器连接到 GitoLite 时出错 - ECONNREFUSED 部署错误的主要内容,如果未能解决你的问题,请参考以下文章

从 VBScript 连接到 Sybase 时出错 - 内部客户端库错误

从 Amazon AWS EC2 服务器上的 Node.js 连接到 Redis 服务器时出错

Rails 4部署后无法连接到mysql

将 pyspark 连接到 SQL Server 时出错

使用 Java 连接到 Azure Blob 存储服务时出错(状态代码 405,UnsupportedHttpVerb)

iOS - 连接到真实设备上的数据库时出错