Heroku 数据库连接属性

Posted

技术标签:

【中文标题】Heroku 数据库连接属性【英文标题】:Heroku Database Connection Properties 【发布时间】:2013-06-26 23:01:50 【问题描述】:

我正在尝试执行一项相对简单的任务:我想连接到 Heroku 数据库。我已经创建了数据库并从 Heroku 站点获得了凭据。但是,当我尝试使用除了终端 'heroku' 命令行客户端之外的 anything 连接到该数据库时,出现致命错误或无法连接错误。

我尝试在 Heroku 终端应用程序之外连接的两个工具是:Navicat 和 IntelliJ。

我在尝试连接数据库时在 Navicat 中收到的错误是:

could not connect to server: Host is down
    Is the server running on host "ec2-107-21-112-215.compute-1.amazonaws.com" and accepting
    TCP/IP connections on port 5432?

我的连接设置如下:

连接名称 Heroku 开发测试

主机名/IP 地址 ec2-107-21-112-215.compute-1.amazonaws.com

端口 5432

Navicat 甚至似乎都没有尝试连接到该主机名。

当我尝试使用完整凭据连接 IntelliJ 时,我收到以下错误:

java.sql.SQLException: FATAL: no pg_hba.conf entry for host "75.168.4.146", user "rphbqggxeokuxl", database "dc008iqk0rq4j5", SSL off

再次,我使用 Heroku 应用程序在访问我在其网站上的数据库时提供的凭据。

以前有没有人遇到过这个 Heroku 连接问题?

【问题讨论】:

【参考方案1】:

我也遇到了FATAL: no pg_hba.conf entry for host 错误消息的问题。

我通过将以下内容添加到我的 JDBC 字符串中解决了与 Heroku Postgres 数据库的连接问题:&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

示例

jdbc:postgresql://host:port/database?user=username&password=secret&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

只有在您的 Postgres 数据库启用 SSL(这是默认设置)时,您才需要 SSL 选项。

提示

如果您想检查您的数据库连接属性,只需使用Heroku Toolbelt 运行以下命令:heroku pg:info --app your-heroko-appname(确保您已安装 Postgres 以在终端中运行此命令)

pg:info 命令还会告诉您sslmode 设置为require

为了测试数据库连接,我推荐SQL Power Architect,因为它是我用来检查我的解决方案的工具。

【讨论】:

&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory 添加这个解决了我的问题。谢谢。 非常感谢#Benny。我从前两天被卡住了,终于得到了解决,我还在 *** 上问了一个与此相关的问题。 (***.com/q/50772559/7560986)。也欢迎你。 这对我帮助很大。谢谢你:) 由于不支持手动编辑DATABASE_URL,最快的方法是在环境变量中设置PGSSLMODE=require。 ***.com/a/47536752/152711 为什么是NonValidatingFactory?不验证有什么安全隐患?【参考方案2】:

Heroku 为从外部来源连接提供此信息:

https://devcenter.heroku.com/articles/heroku-postgresql#external-connections-ingress

第二条错误消息表明 PostgreSQL 未配置为接受您尝试建立的连接。鉴于 Heroku 提供的信息,一个很好的猜测是您没有使用 SSL 连接。尝试在您的连接上启用它。

以下是在 Navicat 中使用 SSL 的说明:http://mirror.navicat.com/manual/online_manual/en/navicat/rv_manual/ClientCert.html

这可能有助于将 Intellij 配置为使用 SSL:https://devcenter.heroku.com/articles/connecting-to-relational-databases-on-heroku-with-java#connecting-to-a-database-remotely。

【讨论】:

如果您从 RubyMine 配置访问,这里有更多详细信息:***.com/questions/20807272/… 以下是为 DbVisualizer 配置它的方法:bartling.blogspot.com/2013/06/… 编辑您的连接 URL 并添加:sslmode=require 启用 ssl 为我修复了它。谢谢!【参考方案3】:

IntelliJ -> 数据源和驱动程序

General 选项卡下配置主机、数据库和用户详细信息后,切换到Advanced 选项卡并确保您已添加以下内容:

ssl = 真 sslfactory = org.postgresql.ssl.NonValidatingFactory sslmode = 需要

【讨论】:

这行得通。相同的属性适用于我正在使用的 jetbrains DataGrip。【参考方案4】:

您可以考虑通过 Heroku 的 Web 界面或 CLI 将 ENVIRONMENT CONFIG VARIABLE 'PGSSLMODE' 设置为 'require'。

案例:Postgres dB 设置为 Heroku 插件并附加到 Heroku Dyno 上的应用程序。

Heroku 的instructions 遗憾地没有提及如何激活 SSL,即使默认情况下从 Standard-0 开始的任何 dB 层都需要它。

按照 Heroku 说明中的所有 pg-copy 或 pg-upgrade 步骤(首选方法取决于您的 Postgres 版本);但是,在停用旧数据库(如果相关)之前 - 添加 PGSSLMODE 环境变量。

这些说明充分涵盖了如何推广新数据库(并因此设置 DATABASE_URL),因此不需要对它们进行任何更改/修改

【讨论】:

谢谢,这很有帮助!【参考方案5】:

想帮助可能遇到此问题的其他人。 如果您在单独的字段中而不是在命令行中提供用户名和密码,则需要使用 ?在数据库名称和 ssl=true 之间并丢弃第一个 &

jdbc:postgresql://host:port/database?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

这是最终允许我使用 SQL Power Architect 连接到 PostgreSQL 数据库的命令行

【讨论】:

【参考方案6】:

对于那些可能正在使用 Spring Boot 并通过DATABASE_URL 环境属性(不是系统属性)提供配置的人,可以在属性中添加后缀:

?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

并通过对配置 bean 稍作修改:

@Bean
public BasicDataSource dataSource() throws URISyntaxException 

    URI dbUri = new URI(System.getenv("DATABASE_URL"));
    String username = dbUri.getUserInfo().split(":")[0];
    String password = dbUri.getUserInfo().split(":")[1];

    StringBuilder dbUrl = new StringBuilder(128);
    dbUrl.append("jdbc:postgresql://")
            .append(dbUri.getHost()).append(":")
            .append(dbUri.getPort())
            .append(dbUri.getPath());

    String query = dbUri.getQuery();
    if (null != query && !query.isEmpty()) 
        dbUrl.append("?").append(query);
    

    BasicDataSource basicDataSource = new BasicDataSource();
    basicDataSource.setUrl(dbUrl.toString());
    basicDataSource.setUsername(username);
    basicDataSource.setPassword(password);

    return basicDataSource;

【讨论】:

【参考方案7】:

我正在使用 node.js 并试图为我的 Heroku 应用程序运行我的 knex 迁移。我尝试将?sslmode=require 附加到连接URL,但它不起作用。我添加了?ssl=true,现在它可以完美运行了。

这是一个有效的 Heroku PostgreSQL 连接 URL 示例:

postgres://user:password@ec2-12-34-56-78.compute-99.amazonaws.com:port/databasename?ssl=true

【讨论】:

【参考方案8】:

在您的 postgresql.conf 文件中添加或编辑以下行:

listen_addresses = '*'

将以下行添加为 pg_hba.conf 的第一行。它允许使用加密密码的所有用户访问所有数据库:

TYPE DATABASE USER CIDR-ADDRESS  METHOD

host  all  all 0.0.0.0/0 md5

重启postgresql服务:

net stop postgresql-9.0 & net start postgresql-9.0 

(版本应基于您的安装) -- 在 windows 上(以管理员身份运行 cmd)。

sudo service start postgresql -- On linux (or according to your linux distribution.) 

【讨论】:

如何在heroku中访问postgresql.conf? 我实际上不记得了,因为我已经很久没有使用heroku了。如果有帮助,请参阅this。【参考方案9】:
const pool = new Pool(
  connectionString: process.env.DATABASE_URL,
  ssl: 
    rejectUnauthorized: false
  
);

【讨论】:

请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。

以上是关于Heroku 数据库连接属性的主要内容,如果未能解决你的问题,请参考以下文章

Heroku - ClearDB:连接中止 - 对等方重置连接

Heroku/Postgres:引起:java.net.ConnectException:连接被拒绝(连接被拒绝)

Heroku:如何通过navicat连接数据库

Heroku Postgres 连接限制?

从托管在 Heroku 的在线 PHP 站点连接数据库

Heroku 连接 MONGODB 图集