【问题标题】:Heroku Database Connection PropertiesHeroku 数据库连接属性
【发布时间】: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 连接问题?

【问题讨论】:

    标签: heroku heroku-postgres


    【解决方案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。我从前两天被卡住了,终于得到了解决,我还在 StackOverflow 上问了一个与此相关的问题。 (stackoverflow.com/q/50772559/7560986)。也欢迎你。
    • 这对我帮助很大。谢谢你:)
    • 由于不支持手动编辑DATABASE_URL,最快的方法是在环境变量中设置PGSSLMODE=require。 stackoverflow.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

    【讨论】:

    【解决方案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
            }
          });
          

          【讨论】:

          • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
          猜你喜欢
          • 1970-01-01
          • 2014-03-04
          • 2011-11-13
          • 1970-01-01
          • 1970-01-01
          • 2019-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多