用户'www-data'@'localhost'被拒绝访问 - 如何处理?

12
我昨天遇到了一个奇怪的问题。我运行着一个安装有PHP 4.4.4-8和mysql 5.5.9的Debian服务器,该服务器提供多个网站服务。但是我不知道为何,有时在加载网页时会出现“Access denied for user 'www-data'@'localhost' (using password: NO)”错误。 如果我刷新页面,页面就会正常加载,但是在点击几次后,那个错误信息又会出现。该页面用于连接mysql服务器的用户名不是 www-data。 有人遇到过类似的问题吗?

不想危言耸听,但我建议你备份数据库..包括架构。它可能很快就会出问题。其他可能的原因可能与网络故障或用户配置错误有关。 - tereško
使用密码:否 -- 我想知道这是什么意思。 - Salman A
转念一想,你的脚本有没有尝试在没有用户名和密码的情况下连接到数据库?例如,通过执行mysql_query()而不执行mysql_connect($hostname, $username, $password) - Salman A
用户名和密码已正确设置。 - jingo
你应该检查密码。 - Devart
7个回答

17

www-data 是运行 Apache 和 PHP 的 Debian 用户。如果在没有有效连接的情况下尝试查询,php/mysql 将尝试使用 <unix-user>@localhost 建立连接,且不需要密码。这就是 www-data@localhost (using password:NO) 的来源。

现在出现这个问题最有可能的原因(虽然之前已经运行了两年良好)是您的数据库负载已经增加到某些连接无法成功的程度(可能是由于 max_connections 或 max_user_connections,但也可能是由于其他限制,如内存、线程等)。当发生这种情况时,对 mysql_connect 的调用将会发出错误消息,并返回 FALSE。如果未能检测到此故障,则您下一个 mysql 调用(可能是 mysql_query 或 mysql_select_db)将尝试连接到 www-data@localhost,从而导致您看到的问题。

我建议启用错误报告和错误显示(如 @DarkMantis 建议的):

ini_set('error_reporting', E_ALL|E_STRICT);
ini_set('display_errors', 1);

此外,请确保您对mysql_connect的调用没有使用@符号,并确保检查返回值。它应该类似于这样:

$cxn = mysql_connect('localhost','yourusername','yourpassword');
if( $cxn === FALSE ) {  die('mysql connection error: '.mysql_error()); }

我认为我找到了问题的根源。连接太多了。该怎么办?增加连接数吗? - jingo
好答案。比我的好多了 xD - DarkMantis
@jingo,你不应该假设问题来自于连接过多。你应该确保你的mysql_connect()捕获错误,打印mysql_error()消息,并终止脚本(如上所述)。在mysql_connect()失败后立即获取mysql_error()消息,这个消息很可能会告诉你问题的具体原因。如果那个消息说类似“mysql:max_connections exceeded”,那么我们就知道出了什么问题。 - Lee
这个答案帮了我很多。我错打了用户变量,所以它被视为空字符串。启用错误报告揭示了这一点。 - Mark

2

看起来引起错误的查询是在调用特定内容时发生的。这可能意味着当调用查询时,您没有使用正确的用户名/密码连接到数据库。

请确保您已经成功连接,使用or die(mysql_error());在所有查询变量的末尾进行调试。

另外,在php文件的顶部使用以下两行:

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);

这将显示您的类/文件中可能出现的任何小的php错误,这些错误可能在之前未被发现。

如果您在此之后仍然遇到问题,请发布您的PHP代码,我将直接查看它。

谢谢!


实际上应该是 ini_set('error_reporting', E_ALL | E_STRICT); 或者只是 ini_set('error_reporting', -1); - tereško
网页的代码已经两年没有改变了。到目前为止,我还没有看到过这样的错误。谢谢你帮助我。 - jingo
实际上,两种方式都可以工作。E_ALL 仍然会显示错误。但已经注意到了。谢谢。 - DarkMantis
在这种情况下,您或其他人是否更改了任何数据库设置,可能更改了用户或可能(不确定)有人更改了Debian系统中的用户? - DarkMantis
那个帖子有一个类似的问题,也许可以帮到你。这个网站也可能会有所帮助:http://www.linuxquestions.org/questions/linux-software-2/folder-permissions-access-denied-for-user-www-data@localhost-745972/ 顺便问一下,你有服务器的shell访问权限吗? - DarkMantis
我已经谷歌过了。是的,我有shell访问权限,现在正在调查日志记录。 - jingo

1
对于心不在焉的人来说,当应该调用mysqli_query()时,调用mysqli_connect()后再调用mysql_query()可能会发生此错误。请注意,应该使用mysqli_query()

1
我遇到了同样的问题。 问题出在我的config.php文件中! 我只是将$dbserver"127.0.0.1" -> "localhost".进行了简单的更改。 现在连接又可以正常工作了!

0

对我来说,关闭安全模式解决了这个问题:

Notice: mysql_connect(): SQL safe mode in effect - ignoring host/user/password information in /var/www/html/test.php on line 4

0

使用密码“NO”

(MySQLi Object-Oriented)
<?php
$servername = "localhost";
$username = "username";
$password = "password";

// Create connection
$conn = new mysqli($servername, $username, $password);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?> 


-1
为了解决这个问题,我不得不更改连接脚本。

(MySQLi Object-Oriented)
<?php
$servername = "localhost";
$username = "username";
$password = "password";

// Create connection
$conn = new mysqli($servername, $username, $password);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?> 


也许这不是最终解决方案,但对我来说有效。 - jj_dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接