本地服务器无法使用PHP连接到远程postgresql数据库,但本地终端可以连接。

问题描述 投票:1回答:1

这个标题可能会让这个问题看起来像一个重复的一些现有的问题在SO上,但它的一种不是在某种程度上,在我看来。

8140863, 30617357, 27749691

但我无法让这些帖子的答案正常工作,与其在这些帖子上提问,不如创建我自己的问题,我想讨论我的设置,然后是我的问题,然后是我的尝试。

我的服务器设置是这样的,我有一台本地的(实际的物理机器)和一台租用的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?

下面是我所做的。

  1. 在postgresql.conf中设置listen_address = "*" -- 这是确定的。
  2. 为两者添加了pg_hba条目 -- 这是好的(python和终端可以同时连接)。
  3. 端口5432tcp既是启用的,也是允许的 -- 这是确定的。
  4. 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    
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

我真的很抱歉这个长长的帖子,我想尽可能多地提供信息。

php postgresql apache centos7 selinux
1个回答
0
投票

让我们按类型来分错误。我用你的情况做了几次测试,我发现。

  1. 如果我们搞乱了连接参数(比如错误的端口或IP地址),我们就会得到 "无法连接到服务器。Connection refused "或 "Operation timed outIs the server running on host "128.0.0.1" and accepting")

  2. 如果我们乱用凭证,就会得到错误 "FATAL: password authentication failed for user ..."。

  3. 只有当你没有权限从你的PHP库中打开一个TCP连接时,才会抛出Permission denied。

请仔细检查你是否在本地服务器上禁用了SElinux,因为对我来说,这仍然是最接近你的问题的解决办法。

© www.soinside.com 2019 - 2024. All rights reserved.