如何在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测试基础网络连通性
先排除网络层面的问题:- 本地执行
ping 178.XXX.XXX.XXX,如果ping不通,优先排查AWS网络ACL或本地网络设置 - 用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




