我正在尝试通过本地 IP 连接到我的 Postgres 实例,使用命令可以毫无问题地连接到该实例psql -h localhost
。但是,尝试通过 rails 运行时,我得到了以下信息:
$ rails c production
/home/avishai/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.9/lib/active_record/connection_adapters/postgresql_adapter.rb:1208:in `initialize': could not connect to server: Connection refused (PG::Error)
Is the server running on host "10.61.99.194" and accepting
TCP/IP connections on port 5432?
这是我的/etc/postgresql/9.1/main/pg_hba.conf
:
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 10.80.85.130/32 trust
host all all 10.80.85.130/32 md5
# IPv6 local connections:
host all all ::1/128 md5
如何确保 Postgres 能够接受来自本地主机以及选定的内部 IP 的传入连接?
答案1
请尝试检查以下两点:
1)文件中/etc/postgresql/9.1/main/postgresql.conf
必须有此行:
listen_addresses = '*'
代替
listen_addresses = '127.0.0.1'
你可以通过命令来检查netstat -tpln | grep 5432
。你将在输出中看到类似以下内容的内容:
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1150/postgres
如果第一个 IP 地址是0.0.0.0
,则 postgres 正在监听所有接口,这正是您想要的。如果您在第一个 IP 地址字段中只看到127.0.0.1
,则 postgresql 只监听localhost
接口。
2) 尝试通过 检查防火墙规则iptables -L -n
。在 INPUT 链中,必须有规则接受从运行 rails 的服务器的 IP 地址到端口 5432 的连接。您可以通过命令添加此规则:iptables -I INPUT -p tcp -s 10.80.85.130 --dport 5432 -j ACCEPT
但我认为,问题出在第1)点。
答案2
我也遇到过同样的困扰。
就我而言,由于某种原因,它使用了 IPV6 Localhost。
在你的 pg_hba.conf 中尝试这个:
host all all ::1/128 md5