【问题标题】:How to connect postgres databases using ssh tunnel in ruby如何在 ruby​​ 中使用 ssh 隧道连接 postgres 数据库
【发布时间】:2016-10-23 08:20:46
【问题描述】:

这是我的问题,我想通过 ruby​​ 脚本访问我们的数据库,我可以使用 ssh 隧道通过 PSequal 连接到数据库。当我尝试从 ruby​​ 连接到数据库时,它总是返回我超时错误。

错误消息是这样的:“无法连接到服务器:操作超时 服务器是否在主机“HOSTNAME”(IP 地址)上运行并接受 端口 5432 上的 TCP/IP 连接"

我尝试在终端中使用“psql -h -d -U”登录,但得到了相同的答案。谢谢

def connectDb
  begin
    file = File.open("pem file")
    gateway = Net::SSH::Gateway.new('hostname', 'username', keys_only: true, port: 22, key_data: file)
    port_pg = gateway.open('hostname', 5432)
    puts port_pg
    con = PG::Connection.open('hostname', portpg, "", "", 'dbname', 'username', 'password')
  rescue PG::Error => e
    puts e.message
  end
end

【问题讨论】:

  • 请不要在图片中添加代码。这使回答您的问题变得更加困难。相反,请将代码以文本形式放入您的帖子中,以便回答者可以轻松看到。
  • 您是否有理由希望通过 SSH 连接而不是仅使用数据库驱动程序直接连接到数据库?
  • 为什么不直接创建一个适当的 database.yml 条目并在您的模型中使用该连接?
  • @CacheStaheli 感谢您的提醒。我会在以后的帖子中这样做。
  • @JustinWood 我正在使用 pg 驱动程序连接到数据库,但它总是返回我超时错误。我尝试了像 Postico 这样的 pg 客户端版本,它在连接之前需要 ssh 信息,这让我觉得我可能需要 ssh 才能连接到数据库

标签: ruby database


【解决方案1】:

确保您的 Postgres 服务器正在侦听正确的端口 在 postgresql.conf 中(可能位于 /etc/postgresql/9.3/main/postgresql.conf 之类的地方注释掉

#listen_addresses = 'localhost'

并在所有端口上添加监听

listen_addresses = '*'

Postgres 配置文件可能归 Postgres 所有,这会使它们更难找到。

登录您的 postgres 数据库并运行

SHOW config_file;

这应该为您提供位置,然后您就可以编辑文件

查看this StackOverflow 线程以获取更多信息 编辑文件后(您可能需要 sudo 权限才能执行此操作,即sudo vim path_to/config_file),您需要重新启动 postgres 才能使更改生效。如何重新启动将取决于 pg 的设置方式,但很可能它作为服务运行,所以跟随者应该可以解决问题。

sudo service postgres restart

如果没有,请询​​问您的主机如何重新启动

在您的 database.yml 文件中为远程服务器创建一个条目 例如

remote:
  adapter: postgresql
  database: remote_db_name
  username: xxx
  password: xxx
  pool: 5
  timeout: 5000
  host: ip_address_for_remote_server
  port: prob_3306_but_whatever_port_you_have_configured_on_remote_server
  strict: false

然后创建一组特定的模型来处理远程数据库并与database.yml条目建立连接

例如

class SomeTableNameOnRemoteServer < ActiveRecord::Base
    establish_connection :remote
    #etc...

不要试图使用已经连接到本地数据库的模型。如果您想共享逻辑,请创建一个模块并将该模块包含在两个模型类中

进一步阅读可能会有所帮助。这是有关如何在 DigitalOcean 液滴上设置和配置 pg 的指南

https://www.digitalocean.com/community/tutorials/scaling-ruby-on-rails-setting-up-a-dedicated-postgresql-server-part-3

页面下方有一个关于远程访问的部分,但您可能会发现整个文档很有用,因此不要在此处粘贴内容。

【讨论】:

  • 感谢您的回答和耐心。我修改了我的问题。我只在 /usr/local/bin/ 路径下找到 psql,在 /etc 路径下没有找到任何与 psql 相关的东西。谢谢!
  • @Shark 也一定要检查你的防火墙的端口访问
  • @jamesw感谢您的更新和时间。我真的很感谢你的帮助。当我尝试从终端登录到数据库服务器时,我收到相同的错误消息:“无法连接到服务器:操作超时服务器是否在主机上运行“...”(IP 地址)并接受 TCP/IP端口 5432 上的连接”。我已经更新了我的问题。
  • @Shark,这很可能是因为您的 pg 服务器没有运行。启动它并检查输出,它是否失败?它开始了吗?如果正在运行,请检查它正在运行的端口
  • 我尝试连接的 pg 服务器正在运行,因为我可以使用相同的主机名和用户名和密码通过 Postico 或 PSequal 客户端版本连接到它。但是在客户端版本中,我需要填写一个额外的区域是SSH隧道,我将跳转框填充为ssh主机,并将pem文件上传到身份文件中,这样我就可以通过客户端版本成功连接到pg服务器。但是,当我尝试通过终端连接到 pg 服务器时,我得到了这个错误。再次感谢您的耐心和时间。 @jamesw
猜你喜欢
  • 2020-02-01
  • 1970-01-01
  • 2018-04-24
  • 2018-04-05
  • 1970-01-01
  • 2014-07-20
  • 2014-09-17
  • 2021-04-05
  • 2013-04-05
相关资源
最近更新 更多