这个标题可能会让这个问题看起来像一个重复的一些现有的问题在SO上,但它的一种不是在某种程度上,在我看来。
但我无法让这些帖子的答案正常工作,与其在这些帖子上提问,不如创建我自己的问题,我想讨论我的设置,然后是我的问题,然后是我的尝试。
我的服务器设置是这样的,我有一台本地的(实际的物理机器)和一台租用的VPS,两者都运行在Centos7.x,PostgreSQL10,Php7.x和Python-2.x。两者 可以通过VPN互相ping和ssh就可以了。
都可以通过PHP、Python、PSQL终端连接到各自的数据库就好了。
在我的VPS服务器上,我可以使用Python(psycopg2)、PHP(php-pgsql)和Terminal(psql)完全正常地连接到我的本地服务器的PostgreSQL数据库。
在我的本地服务器上,我可以使用Python(psycopg2)和Terminal(psql)连接到我的VPS PostgreSQL,除了通过PHP(php-pgsql)
每当我通过PHP连接到VPS的PostgreSQL时,我就会像其他人一样得到这个错误信息。
pg_connect(): Unable to connect to PostgreSQL server:
could not connect to server: Permission denied
Is the server running on host "123.456.0.789" and accepting TCP/IP connections on port 5432?
下面是我所做的。
这些是我的netstat的结果
#netstat -na | grep 5432
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN
tcp6 0 0 :::5432 :::* LISTEN
tcp6 0 94 ::1:55110 ::1:5432 ESTABLISHED
tcp6 0 0 ::1:5432 ::1:55060 ESTABLISHED
tcp6 0 0 ::1:5432 ::1:55110 ESTABLISHED
tcp6 12 0 ::1:5432 ::1:55108 ESTABLISHED
tcp6 0 12 ::1:55108 ::1:5432 ESTABLISHED
tcp6 0 0 ::1:55060 ::1:5432 ESTABLISHED
unix 2 [ ACC ] STREAM LISTENING 31102 /var/run/postgresql/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 31104 /tmp/.s.PGSQL.5432
iptables
#iptables-save | grep 5432
-A IN_public_allow -p tcp -m tcp --dport 5432 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
发力
#getenforce
Disabled
Selinux
#/usr/sbin/sestatus | grep SELinux
SELinux status: disabled
#sudo setsebool -P httpd_can_network_connect_db 1
setsebool: SELinux is disabled.
postgresql.conf
listen_addresses = '*'
port = 5432
pg_hba.conf (我只是换了个ip在这里发帖)我试着用了 trust
但它仍然是相同的
# "local" is for Unix domain socket connections only
local all all password
# IPv4 local connections:
host all all 127.0.0.1/32 password
host all all 123.456.0.1/32 password
host all all 123.456.0.11/32 password
host all all 123.456.0.20/32 password
# IPv6 local connections:
host all all ::1/128 password
编辑开始。我的PHP pg_connect代码(我只是为了这个帖子改了IP,但它指向的是VPS的IP)
$pgcon = pg_connect("dbname=database1 user=some_user password=some_password host=123.456.0.789");
编辑结束:==
我想强调的是,两台服务器都可以通过其他方式连接到对方和自己的PostgreSQL数据库上,只有我的本地服务器例外,它无法使用PHP连接到VPS PostgreSQL。
VPS到自己(本地主机连接)
VPS to Self via PHP is OK
VPS to Self via Python is OK
VPS to Self via PSQL(Terminal) is OK
VPS到本地服务器(使用本地服务器的VPN IP连接)
VPS to Local Server via PHP is OK
VPS to Local Server via Python is OK
VPS to Local Server via PSQL(Terminal) is OK
本地服务器到自己(本地主机连接)
Local Server to Self via PHP is OK
Local Server to Self via Python is OK
Local Server to Self via PSQL(Terminal) is OK
本地服务器到VPS(使用VPS的IP通过VPN和公网IP连接)
Local Server to VPS via Python is OK
Local Server to VPS via PSQL(Terminal) is OK
Local Server to VPS via PHP Is NOT OK
我真的很抱歉这个长长的帖子,我想尽可能多地提供信息。
让我们按类型来分错误。我用你的情况做了几次测试,我发现。
如果我们搞乱了连接参数(比如错误的端口或IP地址),我们就会得到 "无法连接到服务器。Connection refused "或 "Operation timed outIs the server running on host "128.0.0.1" and accepting")
如果我们乱用凭证,就会得到错误 "FATAL: password authentication failed for user ..."。
只有当你没有权限从你的PHP库中打开一个TCP连接时,才会抛出Permission denied。
请仔细检查你是否在本地服务器上禁用了SElinux,因为对我来说,这仍然是最接近你的问题的解决办法。