本地服务器无法使用 PHP 连接到远程 postgresql 数据库,但本地终端可以连接
local server can't connect to remote postgresql database using PHP, but local terminal can connect
标题可能使它看起来像是 SO 上一些现有问题的重复,但在我看来,它在某种程度上并非如此。
8140863, ,
但我这辈子都无法让这些线程的答案有效,我不想在这些线程上提问,我想创建自己的问题,我想讨论我的设置,然后我的问题,然后是我尝试过的方法
我的服务器设置是这样的,我有一个本地(一个实际的物理机器)和一个 VPS 我正在租用,两者都是 运行 在 Centos7.x,PostgreSQL10,Php 7.x, Python-2.x, BOTH可以互相ping通和ssh通过 VPN 就好了。
两者都可以通过 PHP、Python、PSQL 终端
连接到各自的数据库
在我的 VPS 服务器上,我可以使用 Python(psycopg2)、PHP(php-pgsql) 和终端 (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?
这是我所做的。
- 在 postgresql.conf 上设置 listen_address = "*" -- 可以
- 为两者添加了 pg_hba 条目 -- 这没问题(python 并且终端可以在两者上连接)
- 端口 5432/tcp 已启用并允许——这没问题
- Selinux 已禁用 -- 这是上面引用的线程的答案,但即使在重新启动后它对我也不起作用。
这些是我的 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
#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(我只是在这里更改了 posting 的 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
edit start: 我的PHP pg_connect代码(我只是为了这个post改了IP,但它指向VPS IP)
$pgcon = pg_connect("dbname=database1 user=some_user password=some_password host=123.456.0.789");
编辑结束:==
我想强调的是,两台服务器都可以通过其他方式相互连接以及它们自己的 PostgreSQL 数据库,但我的本地服务器除外,它无法使用 [= 连接到 VPS PostgreSQL 99=].
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(通过 VPN 使用 VPS 的 IP 和 Public 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 地址),我们会收到错误 "could not connect to server: Connection refused" 或“操作超时
主机“128.0.0.1”上的服务器 运行 是否接受)
如果我们弄乱了凭据,我们会得到错误 "FATAL: password authentication failed for user ..."
仅当您无权从 PHP 库打开 TCP 连接时,才会抛出权限被拒绝。
请仔细检查您是否像我一样在本地服务器上禁用了 SElinux,这仍然是最接近您问题的解决方法。
标题可能使它看起来像是 SO 上一些现有问题的重复,但在我看来,它在某种程度上并非如此。
8140863,
但我这辈子都无法让这些线程的答案有效,我不想在这些线程上提问,我想创建自己的问题,我想讨论我的设置,然后我的问题,然后是我尝试过的方法
我的服务器设置是这样的,我有一个本地(一个实际的物理机器)和一个 VPS 我正在租用,两者都是 运行 在 Centos7.x,PostgreSQL10,Php 7.x, Python-2.x, BOTH可以互相ping通和ssh通过 VPN 就好了。
两者都可以通过 PHP、Python、PSQL 终端
连接到各自的数据库在我的 VPS 服务器上,我可以使用 Python(psycopg2)、PHP(php-pgsql) 和终端 (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?
这是我所做的。
- 在 postgresql.conf 上设置 listen_address = "*" -- 可以
- 为两者添加了 pg_hba 条目 -- 这没问题(python 并且终端可以在两者上连接)
- 端口 5432/tcp 已启用并允许——这没问题
- Selinux 已禁用 -- 这是上面引用的线程的答案,但即使在重新启动后它对我也不起作用。
这些是我的 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
#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(我只是在这里更改了 posting 的 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
edit start: 我的PHP pg_connect代码(我只是为了这个post改了IP,但它指向VPS IP)
$pgcon = pg_connect("dbname=database1 user=some_user password=some_password host=123.456.0.789");
编辑结束:==
我想强调的是,两台服务器都可以通过其他方式相互连接以及它们自己的 PostgreSQL 数据库,但我的本地服务器除外,它无法使用 [= 连接到 VPS PostgreSQL 99=].
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(通过 VPN 使用 VPS 的 IP 和 Public 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 地址),我们会收到错误 "could not connect to server: Connection refused" 或“操作超时 主机“128.0.0.1”上的服务器 运行 是否接受)
如果我们弄乱了凭据,我们会得到错误 "FATAL: password authentication failed for user ..."
仅当您无权从 PHP 库打开 TCP 连接时,才会抛出权限被拒绝。
请仔细检查您是否像我一样在本地服务器上禁用了 SElinux,这仍然是最接近您问题的解决方法。