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
选项卡并确保您已添加以下内容:
【讨论】:
这行得通。相同的属性适用于我正在使用的 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:连接中止 - 对等方重置连接