【问题标题】:Rails 4 ActiveRecord throws PG::UnableToSend on Ubuntu 13.04Rails 4 ActiveRecord 在 Ubuntu 13.04 上抛出 PG::UnableToSend
【发布时间】:2013-12-19 09:50:28
【问题描述】:

我们在Rails v4.0.1 应用程序上有一个Ruby v.2.0.0-p247,使用pg gem v0.17.0。

应用程序在使用HomeBrew 安装的PostgreSQL Server v9.2.4 下在Mac OS X Mavericks v10.9 下运行顺利,但在使用PostgreSQL Server 9.1 的Ubuntu v13.04 下抛出以下异常:

PG::UnableToSend: server closed the connection unexpectedly

This probably means the server terminated abnormally before or while processing the request.

事务查询(表单提交)之后发生异常。

我用database.yml 尝试了以下操作:

  1. 添加reconnect: true
  2. 添加port: 5432
  3. 添加socket: /var/run/postgresq/SOCKET_FILE

并在 Ubuntu 下使用 PostgreSQL 配置尝试了以下操作:

  1. 禁用 SSL。
  2. 将 TCP keepalives 参数更改为泵超时。
  3. 将日志级别更改为 DEBUG 并在 PostgreSQL 服务器上搜索可能的错误。

也试过了:

  1. 降级到 pg gem v0.16.0。
  2. 将所有 Ubuntu 13.04 软件包更新到最新版本。

可能出了什么问题?

更新:

12/03/2013:有人建议检查防火墙设置。 ufw status 表示 ufw 已禁用。 2013 年 12 月 8 日:在尝试了一个普通的 Rails 应用程序并对当前应用程序进行了大量修改后,问题来自 rails4/activerecord-session_store gem。 lib/active_record/session_store/session.rb 中的第 47 行是罪魁祸首。

【问题讨论】:

  • 您可以通过控制台登录吗?可能的原因之一是您的 PG 安装不干净。可能存在版本冲突。
  • @ArihantGodha 不确定通过控制台登录是什么意思,但 Rails 控制台启动正常。
  • @owahab 你在database.yml中指定你的PG数据库的端口了吗?
  • 我不太确定 activerecord-session_store 真的是罪魁祸首;可能只是保存会话是发生的第一个查询,所以这就是问题出现的地方。你能清理 Postgres 的日志,启用 DEBUG 级别,重新启动服务器,通过 Rails 产生错误并向我们显示服务器启动和错误之间的完整日志输出吗?
  • 您能否使用psql 连接到 Postgres 并以这种方式执行查询?

标签: ruby-on-rails ruby postgresql ubuntu activerecord


【解决方案1】:

这基本上发生在您使用旧版本的 launchy 时,并且按照这个 issue 在 launchy 的 git repo 上引用 @infertux

在exec 无法运行命令的极少数情况下——通常是当文件无法打开时引发Errno::ENOENT——Launchy 会引发异常但不显示任何输出

您可以检查您的 Gemfile.lock 以查看您是否使用低于 2.4.1 的 launchy 版本,我怀疑您在依赖于 launchy 的开发环境中使用 letter_opener Gem因此,将letter_opener 更新为 1.2.0 会将launchy 更新为高于 2.4.0 的版本,主要是 2.4.2,此问题已修复

所有功劳归@infertux

【讨论】:

【解决方案2】:

如果你提供你的 database.yml 文件会很有帮助

默认连接方法是 unix 域套接字,不要与 TCP/IP 套接字混淆。默认使用unix域socket连接方式。

您应该检查您尝试运行 rails 的 unix 用户是否有足够的权限来访问域套接字(通常在 /var/run/postgresql/.s.PGSQL.5432)

尝试以您的 rails 用户身份输入以下内容:

psql

如果您收到数据库连接错误,那么如果 postgres 实际运行,则可能是权限问题。

您可以检查您的/etc/postgresql.conf 文件并让 postgres 在套接字启动时配置组和权限:

unix_socket_directory = '/var/run/postgresql'       # dont worry if yours is different
#unix_socket_group = ''                             # default is usually ok
#unix_socket_permissions = 0777                     # uncomment this if needed

另一个选项是将用户添加到对套接字具有写访问权限的组中,而不是允许机器上的所有用户使用上面的 0777 权限设置进行访问。如果默认 Ubuntu 组的粒度不足以满足您的需求,您可能需要为此创建一个 postres_users 组。

【讨论】:

    【解决方案3】:

    在我看来,连接方法有些混乱。 PostgreSQL 支持两种方法:

    1. 套接字
    2. TCP/IP

    这些是完全不同的。 :-)

    在您的问题中,您显示了socket 设置,但提到了 TCP。我建议专注于这两种单独连接的方式中的每一种,看看哪种方式会产生结果。即,创建两个版本分支 pg-socket 和 pg-tcpip 只是为了让事情清楚。然后,清理您的配置文件并尝试通过这两种方法进行连接。

    通常,套接字连接更容易,因为您只需要知道套接字“文件”的路径名。不需要任何防火墙设置(因为不涉及 TCP/IP 网络。)

    完成此操作后更新您的问题,并告诉我们这两种方法对您的效果。

    【讨论】:

    • 请粘贴development 的数据库配置条目。另外,请尝试从头开始创建一个 Rails 应用程序,看看它是否连接:rails new testapp --database=postgresql
    【解决方案4】:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2013-05-13
    相关资源
    最近更新 更多