You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生产环境Ruby 2.7.2连接PostgreSQL 14出现Segmentation fault求助

针对pg gem连接导致Segmentation Fault的解决方案

以下是针对生产环境下Rails控制台启动触发pg gem段错误的排查和修复步骤:

1. 强制匹配pg gem与PostgreSQL 14的编译环境

生产环境的pg gem可能基于系统旧版PostgreSQL库编译,导致与当前运行的PostgreSQL 14不兼容:

  • 执行指定pg_config路径的gem安装命令,确保用PostgreSQL 14的配置编译:
    gem install pg -- --with-pg-config=/usr/lib/postgresql/14/bin/pg_config
    
    (注意:根据PostgreSQL实际安装路径调整pg_config的位置)
  • 检查pg_ext.so的依赖库版本,确认关联的是PostgreSQL 14的libpq:
    ldd $(bundle show pg)/lib/pg_ext.so
    
    输出中需确保libpq.so.14存在,而非旧版本(如libpq.so.12)。

2. 校验database.yml生产环境配置

错误的数据库连接参数可能触发底层段错误:

  • 检查sslmode配置是否与PostgreSQL集群的SSL设置匹配,比如集群未开启SSL时设置sslmode: disable,避免SSL握手异常:
    production:
      adapter: postgresql
      database: your_prod_db
      username: prod_user
      password: <%= ENV['PROD_DB_PASSWORD'] %>
      host: localhost
      port: 5432
      pool: 5
      sslmode: disable # 根据集群实际配置调整为prefer/require
    
  • 确认host、port指向正确的PostgreSQL 14实例,避免误连其他版本的数据库。

3. 调整pg gem版本

Ruby 2.7.2与pg 1.5.4的组合可能存在兼容性问题,尝试调整版本:

  • 在Gemfile中修改pg版本为1.4.6(稳定旧版)或1.6.2(最新稳定版):
    gem 'pg', '~> 1.4.6'
    
  • 生产环境执行部署模式安装:
    bundle install --deployment
    

4. 排查系统层面依赖问题

  • 若生产环境Ruby是源码编译的,确认编译时依赖的libpq、libssl等库与当前系统一致,必要时重新编译Ruby 2.7.2,编译时指定依赖路径:
    ./configure --with-openssl-dir=/usr/lib/ssl --with-pg-config=/usr/lib/postgresql/14/bin/pg_config
    make && make install
    
  • 查看PostgreSQL日志(如/var/log/postgresql/postgresql-14-main.log),检查是否有连接时的认证错误、协议不匹配等异常信息。

5. 深度调试段错误

  • 启用Ruby调试模式启动控制台,获取更详细的错误栈:
    ruby -d -r rails/console production
    
  • 使用gdb定位具体出错点:
    gdb --args bundle exec rails c production
    
    进入gdb后输入run触发错误,再输入bt查看完整调用栈,确定pg gem内部的具体问题代码。

内容的提问来源于stack exchange,提问作者Sahil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:32:34