“PHP警告:pg_connect():无法连接到PostgreSQL服务器:致命:密码认证失败的用户...”在Raspberry Pi(Stretch)

问题描述:

所以很抱歉打扰大家,我是的新手PostgreSQL,但我的项目需要我建立一个自动化系统,连接到运行PostgreSQL服务器的服务器。长话短说,让我们说我需要执行数据插入/操纵网络表格到服务器通过PHPpg_connect()。 Web窗体在/var/www/html/web_form.html位于本地,并调用执行数据插入一个PHP脚本,“PHP警告:pg_connect():无法连接到PostgreSQL服务器:致命:密码认证失败的用户...”在Raspberry Pi(Stretch)

<form name="some_name" action="script.php" method="POST"> 

因此数据插入完成到本地服务器。

我使用的是树莓派3模拟“服务器”(为不使这样的早期发展过程中,以“扰乱”的真正运行的服务器)。树莓丕正在运行Raspbian拉伸发行。嗯,这本来是杰西,但后来我决定从

deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi 

100优先涉及拉伸回购。它也有postgresql-9.6.3(从拉伸),php7.0.19-1(也来自拉伸),并apache2.4.25(官方Raspbian)。请你注意,拉伸回购做替换很多杰西的官方稳定的软件包的,并且也被称为是“不太稳定”本身,因此它也可能是问题的根源。

我可以在服务器从远程计算机访问数据库,无论是使用直接psql,巨蟒(psycopg2),或者甚至通过PHP完全相同的Web窗体(从远程计算机试过),所以将主要赢” t因为PDO问题(我查过phpinfo(),但感觉免费给这个建议,因为我不真正理解PDO我自己)。在本地,我可以通过psql访问数据库,但不能通过PHP进行本地访问(pg_connect)。

我这个问题插手了几个小时,现在是徒劳的。请帮帮我。

这里是我的树莓派的配置:

1. 的PHP代码片段:

$conn_str="host=localhost port=5432 dbname=my_db_name user=my_user_name password=my_password"; 
    $db = pg_connect($conn_str); 
    if(!$db){ 
     $errormessage=pg_last_error(); 
     echo "Error 0: " . $errormessage; 
     exit(); 
    } 

请记住这相同的代码已经完全另一台计算机上工作。我成功执行时,Web窗体位于远程计算机访问该服务器,或当Web形式访问远程计算机的自己的本地PostgreSQL服务器数据的插入,而不是在它在这个特别做问题服务器。当在浏览器中运行,那只能说明:

Error 0: 

结果在控制台上运行时:

PHP Warning: pg_connect(): Unable to connect to PostgreSQL server: FATAL: password authentication failed for user "raspiserver" 

FATAL: password authentication failed for user "raspiserver" in php shell code on line 1 

我也尝试过改变host=localhosthost=127.0.0.1host=0.0.0.0。我确信错误来自于该代码块,因为该代码块已经在我的PHP代码中的第一行,而我提供的其他错误报告代码每个都有不同的Error X:数字。

2. PostgreSQL的配置:

对于pg_hba.conf内容:

# 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 my_db_name  my_user_name  127.0.0.1/32   md5 
    local all  all            md5 
    # IPv4 local connections: 
    host all    all    127.0.0.1/32   md5 

    # IPv6 local connections: 
    host all    all    ::1/128     md5 
    # Allow replication connections from localhost, by a user with the 
    # replication privilege. 
    # local replication  postgres        peer 
    #host replication  postgres  127.0.0.1/32   md5 
    #host replication  postgres  ::1/128     md5 

    #host all    all    0.0.0.0/0    md5 
    host another_db_name  my_user_name    192.168.52.0/24   trust 
    host my_db_name  my_user_name    192.168.52.0/24   trust 

我已经尝试过评论/取消注释LINE 7,或两者LINE 7和8更改为md5trust,或password。我也尝试从LINE 7中删除127.0.0.1/32,或将其更改为127.0.0.0/240.0.0.0/0。而且,是的,我确实执行了

sudo /etc/init.d/postgresql reload 
    sudo /etc/init.d/postgresql restart 

(即使是sudo reboot)我所做的每一项更改。

对于postgresql.conf内容:

我已经设置listen_addresses = '*'password_encryption = on,其余保持不变。

3. 防火墙:

sudo iptables -L -n不显示任何条目:

Chain INPUT (policy ACCEPT) 
    target  prot opt source    destination   

    Chain FORWARD (policy ACCEPT) 
    target  prot opt source    destination   

    Chain OUTPUT (policy ACCEPT) 
    target  prot opt source    destination 

有什么不对我的配置? 拉伸原因? 还是因为PostgreSQL-9.6的实现?

我已经在这里和那里搜索,但大多数解决方案只是建议将pg_hba.conf更改为trust,或者假定user名称不存在。

我很绝望,请帮忙。

(请你记住,我不知道什么关于PHP和PostgreSQL,Apache的,或服务器,所以请不要指望我真的知道我到目前为止已经完成。请你分析的一切 ....另外,英语不是我的本地人,所以我可能会在这里和那里(如果有的话)围绕一些“行话”混合......对不起......)

pg_hba.conf这种特殊的声明是不正确:

# TYPE DATABASE  USER   ADDRESS     METHOD 
local my_db_name  my_user_name  127.0.0.1/32   md5 

因为当TYPElocal,该行必须有4场,而不是5:没有ADDRESS领域,因为它并不适用于Unix域套接字(这是什么local的真正含义),只有TCP连接

当您与pg_hba.con重装PostgreSQL的(这与TYPEhosthostssl声明) f与这条线,它将失败

LOG: invalid authentication method "127.0.0.1/32" 

但你会看到,只有在服务器日志中看。由于失败,它将忽略您的新版本pg_hba.conf

反正这在其他文件

host all    all    127.0.0.1/32   md5 

已经行可能你想要做什么。在这种情况下,只需删除违规行,重新加载,然后检查服务器日志中是否有指示重新加载成功的消息。

+0

好的,我会尝试从下周一的LINE 7中删除ADDRESS字段。出于好奇,不是host意味着启用远程访问?因为我的意图是启用本地访问。如果我错了,请纠正我。 –

+0

'主机'本身并没有启用它,因为它与“ADDRESS”掩码结合在一起(AND)。当ADRESS是127.0.0.1/32时,它表示这条线上的规则仅适用于来自该地址的连接。但请记住,这是一整套规则说明所发生的事情和被拒绝的事情,不仅仅是一条线,甚至更少的一条线。 'pg_hba.conf'在整体上被解释为一个大的IF ... ELSIF ... ELSIF ... ENDIF –

+0

我试图从LINE 7中删除'ADDRESS',脚本仍然无法工作。我也试图将整个LINE 7评论为无效。 –