You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Rails中连接远程服务器上的PostgreSQL数据库

从本地连接AWS CentOS 6上的PostgreSQL服务器问题排查

看起来你正在尝试从本地连接部署在AWS CentOS 6 AMI上的PostgreSQL远程服务器,我帮你梳理几个关键排查点,按顺序操作应该能解决问题:

先把你的配置信息整理出来方便参考:

本地database.yml配置

development:
  adapter: postgresql
  encoding: unicode
  database: db_name
  username: mac
  password: mac
  host: 178.XXX.XXX.XXX
  port: 5432
  pool: 10
  timeout: 5000

远程服务器pg_hba.conf配置

local   all             all                                     trust
# IPv4 local connections:
host    all             all             35.XXX.XX.XX/32         trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

具体排查步骤

  • 确认PostgreSQL是否监听外部地址
    默认PostgreSQL只监听本地回环地址127.0.0.1,无法接受外部请求。你需要修改postgresql.conf(通常位于/var/lib/pgsql/9.x/data/目录,x为你的PostgreSQL版本)中的listen_addresses参数,改为*(允许所有地址访问)或者指定服务器公网IP。修改后务必重启PostgreSQL服务:

    sudo service postgresql restart
    
  • 检查AWS安全组入站规则
    这是AWS环境下最容易忽略的点!你必须确保EC2实例的安全组允许你的本地公网IP访问5432端口。进入AWS控制台的EC2安全组设置,添加入站规则:

    • 规则类型选择「PostgreSQL」(或自定义TCP)
    • 端口范围填写5432
    • 源地址设置为你的本地IP(即pg_hba.conf中配置的35.XXX.XX.XX/32
  • 验证CentOS的iptables防火墙
    CentOS 6默认启用iptables,即便安全组规则开放,iptables拦截也会导致连接失败。可以先临时关闭iptables测试连接:

    sudo service iptables stop
    

    如果能成功连接,就将规则永久保存:

    sudo iptables -A INPUT -p tcp --dport 5432 -s 35.XXX.XX.XX/32 -j ACCEPT
    sudo service iptables save
    sudo service iptables restart
    
  • 测试基础网络连通性
    先排除网络层面的问题:

    1. 本地执行ping 178.XXX.XXX.XXX,如果ping不通,优先排查AWS网络ACL或本地网络设置
    2. 用telnet测试端口连通性:telnet 178.XXX.XXX.XXX 5432,如果连接失败,大概率是安全组或防火墙的问题
  • 确认PostgreSQL用户的连接权限
    确保你使用的mac用户被允许从本地IP连接数据库。登录远程服务器的PostgreSQL,执行以下SQL:

    -- 确保用户具备登录权限
    ALTER USER mac WITH LOGIN PASSWORD 'mac';
    -- 授予用户目标数据库的操作权限
    GRANT ALL PRIVILEGES ON DATABASE db_name TO mac;
    

按这个顺序排查,应该能快速定位并解决问题。

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

火山引擎 最新活动