[英]local server can't connect to remote postgresql database using PHP, but local terminal can connect
标题可能会使这看起来像是 SO 上一些现有问题的重复,但在我看来,这在某种程度上不是。
但是我一生都无法使这些线程的答案起作用,而不是在这些线程上提问,我想创建自己的问题,我想讨论我的设置,然后讨论我的问题,然后我试过的
我的服务器设置是这样的,我有一个本地(一台实际的物理机器)和一个我租用的 VPS,两者都在 Centos7.x、PostgreSQL10、 Php 7.x 和 Python-2.x 上运行,两者都可以 ping 和ssh 对方通过VPN就好了。
两者都可以通过 PHP、Python、PSQL 终端很好地连接到各自的数据库
在我的 VPS 服务器上,我可以完全使用 Python(psycopg2)、PHP(php-pgsql) 和 Terminal(psql) 连接到本地服务器的 PostgreSQL 数据库。
在我的本地服务器上,我可以使用 Python(psycopg2)和终端(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 To Self(本地主机连接)
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 地址),我们会收到错误“无法连接到服务器:连接被拒绝”或“操作超时服务器在主机“128.0.0.1”上运行并接受“)
如果我们弄乱凭据,我们会收到错误“致命:用户密码验证失败...”
仅当您无权从 PHP 库中打开 TCP 连接时,才能抛出 Permission denied。
请仔细检查您是否像我一样在本地服务器上禁用 SElinux,这仍然是您的问题最接近的解决方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.