当我试图用Rails 3.2项目连接到远程PostgreSQL数据库时,我遇到了以下错误:

FATAL:  no pg_hba.conf entry for host "10.0.0.3", user "projectx", database "projectx", SSL off

我在Rails上的配置如下所示:

staging:
  adapter: postgresql
  database: projectx
  username: projectx
  password: 123456
  host: 10.0.0.3
  encoding: utf8
  template: template0
  min_messages: warning

在PostgreSQL上,如下所示:

hostssl    all             all             0.0.0.0/0            md5
hostssl    all             all             ::/0                 md5

这两台机器都在Ubuntu 12.04上运行.

我发现有帖子说它应该自动工作,但这显然没有发生.我发现有人说libpq没有启用SSL,启用它解决了问题,但没有解释如何启用它.当我查看libpq的依赖关系时,我可以看到它依赖于一些SSL包,因此我假设SSL支持已编译.

一些帖子建议添加以下内容:

sslmode: require

或者这个:

sslmode: enabled

启用ssl模式,但对我没有效果.我读到它被默默地忽略了.

我还try 了数据库字符串方法,结果是:

staging:
  adapter: postgresql
  database: "host=10.0.0.3 dbname=projectx user=projectx password=123456 sslmode=require"

然后我发现了一个错误:

could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

这似乎表明Rails试图连接到localhost,或者更确切地说,是本地PostgreSQL(没有),而不是10.0.0.3.

有什么 idea 吗?

推荐答案

正如你所写的,通常是Ubuntu 12.x软件包的设置是为了激活SSL,开箱即用,此外还有railstry 的first method,或者任何让libpq处理这些东西的客户端,这意味着几乎所有客户端.

这种自动启用不一定适用于其他PostgreSQL包或自编译服务器,因此适用于这些其他上下文的答案或建议对您的帮助不大.

由于你的设置应该直接起作用,这个答案是一个 list ,列出要判断的事情,以找出哪里出了问题.最好先用psql而不是rails来测试连接设置,这样就可以先排除一般的postgresql问题.

客户端

客户端sslmode参数控制连接try 的顺序.

为了自愿避免SSL,客户机需要在连接字符串中的某个位置放置sslmode=disable,或在环境中的某个位置放置PGSSLMODE=disable,或将其他PGSSL*个变量中的一个弄乱.如果rails进程的环境中不太可能存在这种情况,那么这就可以解释出现的错误,因为pg_hba.conf不允许非SSL连接.

不try SSL的另一个原因显然是当libpq未使用SSL支持编译时,但Ubuntu软件包并非如此.

sslmode的默认值为prefer,描述如下:

首选(默认)

first try an SSL connection; if that fails, try a non-SSL connection

错误消息末尾的SSL=off与上次失败的连接try 有关.可能是SSL被try 并失败了,或者根本没有try ,我们无法仅从这条消息中得知.根据pg_hba.conf中设置的策略(第一列中的hostssl),服务器通常会拒绝与SSL=off的连接try .

更合理的说法是,问题出在服务器端,因为有更多的事情可能会出错.

服务器端

以下是要判断服务器端的各种情况:

  • postgresql.conf中应该有ssl=on(默认位置:/etc/postgresql/9.1/main/)

  • 当使用psql连接到localhost时,您会收到如下消息:

psql(9.1.13)

  • ca-certificates软件包应安装并更新.

  • ssl-cert软件包应安装并更新.

  • Inside the postgres data directory (/var/lib/postgresql/9.1/main by default), there should be soft links:
    server.crt -> /etc/ssl/certs/ssl-cert-snakeoil.pem or another valid certificate, and
    server.key -> /etc/ssl/private/ssl-cert-snakeoil.key or another valid key.

  • /etc/ssl/certs和父目录应该是可读的和cd的postgres.

  • postgres unix用户应该在ssl-cert unix组中(用id -a postgres判断),否则它无法读取私钥.

  • 如果更改为postgresql.conf,请确保在执行任何其他测试之前重新启动postgresql.

  • 在启动时或连接try 失败时,/var/log/postgresql/postgresql-9.1-main.log中不应该有任何关于SSL的可疑消息.

Postgresql相关问答推荐

Postgr不列出运算符和函数

如何高效地将行聚合到数组中,同时保留`NULL`来指示丢失的数据?

使用PGx在围棋中执行多条SQL语句

为什么在使用PostGIS时,英国郡的几何图形会出现在几内亚湾?

为什么Postgres在打印时能完全缩短时间跨度?

列不明确

在特定值的组聚合中添加标签列作为结果

如何返回old_ids和重复行的映射';来自PostgreSQL函数的s new_id

JPA将没有时区的Postgres时间戳调整为服务器时区

Upper() 不会大写重音字符

PostgreSql maintenance_work_mem 在索引创建期间增加

如何将 JSONB 对象数组合并为 PostgreSQL 中的单个对象

PostgreSQL 中的 DATEADD 等效项

如何从 postgresql Select 查询中的 age() 函数中仅获取年份

在执行 postgresql 函数时提交事务

保存 geodjango PointField 时出错

如何确定 NULL 是否包含在 Postgres 的数组中?

Postgres 默认按 id 排序 - worldship

在 postgres 中插入语句用于没有时区 NOT NULL 的数据类型时间戳,

python postgres 我可以 fetchall() 100 万行吗?