树莓派(拉伸)中的" PHP Warning: pg_connect(): Unable to connect to PostgreSQL server: FATAL: password authe



很抱歉打扰大家,我是PostgreSQL的新手,但我的项目需要我构建一个连接到运行PostgreSQL服务器的服务器的自动化系统。长话短说,假设我需要通过PHPpg_connect()Web 窗体将数据插入/操作到服务器中。Web 窗体位于本地/var/www/html/web_form.html,并调用执行数据插入的 PHP 脚本,

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

因此,数据插入是在本地服务器完成的。

我正在使用Raspberry Pi 3来模拟"服务器"(因此在如此早期的开发过程中不会"干扰"真正正在运行的服务器(。Raspberry Pi正在运行Raspbian Stretch发行版。好吧,它最初是杰西,但后来我决定让 Stretch 存储库参与进来

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

优先级为100.它还有postgresql-9.6.3(来自Stretch(,php7.0.19-1(也来自Stretch(和apache2.4.25(来自官方Raspbian(。请注意,Stretch 存储库确实替换了很多 Jessie 的官方稳定包,并且众所周知,它本身"不太稳定">,所以它也可能是问题的根源。

我可以从远程计算机访问服务器中的数据库,无论是使用直接psql,Python(psycopg2(,甚至是通过PHP完全相同的Web表单(从远程计算机尝试(,所以这通常不会是因为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=localhost更改为host=127.0.0.1host=0.0.0.0。我确定错误来自该代码块,因为该块已经位于我的 PHP 代码的第一行,而我输入的其他错误报告代码,每个代码都有不同的Error X:编号。

阿拉伯数字。 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

我已经尝试评论/取消注释第 7 行,或将第 7 行和第 8 行更改为md5trustpassword。我还尝试从第 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

因为当TYPE字段local时,该行必须有 4 个字段,而不是 5 个字段:没有ADDRESS字段,因为它不适用于 Unix 域套接字(这是local的真正含义(,仅适用于 TCP 连接(声明TYPEhosthostssl(

当您使用此行的 pg_hba.conf 重新加载 PostgreSQL 时,它将失败

LOG:  invalid authentication method "127.0.0.1/32"

但只有在查看服务器日志时,您才会看到这一点。由于失败,它将忽略您的新版本pg_hba.conf

无论如何,您的文件中已经有另一行

host    all             all             127.0.0.1/32            md5

可能做你想做的事。在这种情况下,只需删除有问题的行,再次重新加载,然后检查服务器日志中是否有指示重新加载成功的消息。

相关内容

最新更新