“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=localhost
到host=127.0.0.1
或host=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更改为md5
,trust
,或password
。我也尝试从LINE 7中删除127.0.0.1/32
,或将其更改为127.0.0.0/24
或0.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连接
当您与pg_hba.con重装PostgreSQL的(这与TYPE
是host
或hostssl
声明) f与这条线,它将失败
LOG: invalid authentication method "127.0.0.1/32"
但你会看到,只有在服务器日志中看。由于失败,它将忽略您的新版本pg_hba.conf
。
反正这在其他文件
host all all 127.0.0.1/32 md5
已经行可能你想要做什么。在这种情况下,只需删除违规行,重新加载,然后检查服务器日志中是否有指示重新加载成功的消息。
好的,我会尝试从下周一的LINE 7中删除
ADDRESS
字段。出于好奇,不是host
意味着启用远程访问?因为我的意图是启用本地访问。如果我错了,请纠正我。 –'主机'本身并没有启用它,因为它与“ADDRESS”掩码结合在一起(AND)。当ADRESS是127.0.0.1/32时,它表示这条线上的规则仅适用于来自该地址的连接。但请记住,这是一整套规则说明所发生的事情和被拒绝的事情,不仅仅是一条线,甚至更少的一条线。 'pg_hba.conf'在整体上被解释为一个大的IF ... ELSIF ... ELSIF ... ENDIF –
我试图从LINE 7中删除'ADDRESS',脚本仍然无法工作。我也试图将整个LINE 7评论为无效。 –