Rails 4 ActiveRecord在Ubuntu 13.04上抛出PG :: UnableToSend

时间:2013-12-03 11:07:50

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

我们在使用Ruby v.2.0.0-p247的{​​{1}}申请中Rails v4.0.1

使用pg gem v0.17.0安装了Mac OS X Mavericks v10.9PostgreSQL Server v9.2.4下的应用程序可以顺利运行,但是使用HomeBrewUbuntu v13.04下会抛出以下异常:

PostgreSQL Server 9.1

PG::UnableToSend: server closed the connection unexpectedly

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

我使用This probably means the server terminated abnormally before or while processing the request.尝试了以下内容:

  1. 添加database.yml
  2. 添加reconnect: true
  3. 添加port: 5432
  4. 在Ubuntu下使用PostgreSQL配置尝试了以下内容:

    1. 禁用SSL。
    2. 将TCP keepalives参数更改为泵超时。
    3. 将日志级别更改为socket: /var/run/postgresq/SOCKET_FILE并在PostgreSQL服务器上搜索可能的错误。
    4. 也尝试过:

      1. 降级为pg gem v0.16.0。
      2. 将所有Ubuntu 13.04软件包更新到最新版本。
      3. 可能出现什么问题?

        更新

        12/03/2013:有人建议检查防火墙设置。 DEBUG表示ufw status已被停用。 12/08/2013:在尝试使用香草Rails应用程序并使用当前应用程序进行大量修改后,问题来自于ufw gem。 rails4/activerecord-session_store中的第47行是罪魁祸首。

4 个答案:

答案 0 :(得分:4)

当你使用launchy的旧版本时,基本上会发生这种情况,并且在发布的git repo引用@infertux

上按照此issue
  

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

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

所有功劳都归功于@infertux

答案 1 :(得分:1)

如果您提供了database.yml文件,那将非常有用。

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

您应检查您尝试运行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组。

答案 2 :(得分:0)

在我看来,对连接方法存在困惑。 PostgreSQL支持这两种方法:

  1. 插槽
  2. TCP / IP
  3. 这些完全不同。 : - )

    在您的问题中,您显示socket设置,但提及TCP。我建议把重点放在这两种独立连接方式中的每一种上,看看哪种方式产生结果。即,创建两个版本分支pg-socketpg-tcpip只是为了使事情清楚。然后,清理配置文件并尝试通过这两种方法进行连接。

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

    执行此操作后更新您的问题,并告诉我们这两种方法中的每种方法是如何为您做的。

答案 3 :(得分:0)