我正在远程站点(我将调用SiteB)的Web服务器上运行一个PHP脚本,该脚本连接到远程位置的MySql服务器(我将称为站点A)。 现在,站点A的SQL服务器有两个用户,一个名为“usr'@192.168.1.%”,用于从站点A的内部networking访问,另一个名为“usr'@client.siteB.com” 。
站点A的服务器位于路由器的后面,并将端口3306上的所有TCP和UDPstream量转发到192.168.1.12(位于站点A的MySQL服务器的本地IP)。 站点A具有dynamicIP,所有对SQL服务器的引用都是通过主机名启动的(我们将调用server.siteA.com)。 站点B确实有一个静态的外部IP,但是所有进入的SQL连接只能通过主机名来引用,为什么SQL用户是'usr'@client.siteB.com'。
我遇到的问题是,每当我从网站B上的Web服务器运行PHP脚本,我得到以下错误:
Access denied for user 'usr'@'client.siteB.com' (using password: NO)
它也引用了一条线,它是:
$this->MCdbConnection = mysql_connect($this->MySQLhost, $this->MySQLuser, $this->MySQLpassword);
所以,正如你所看到的,我传递了一个密码。 最奇怪的部分是,通过在Site A的本地networking上运行相同的脚本,并且只将variables$ MySQLhost从server.siteA.com更改为192.168.1.7,脚本正常工作,并且连接并select并插入数据。
像这样的错误通常会让我觉得这是一个用户名问题,但是两个MySQL用户('usr'@192.168.1.%'和'usr'@client.siteB.com')是完全相同的,相同的密码和特权(仅限SELECT,INSERT和UPDATE)。
当我放弃用户'usr'@192.168.1.%'时,在尝试通过MySQL Workbench和站点A的本地networking上另一台机器的命令行客户端进行连接时,也出现同样的错误。 所有的迹象都指向缺less,不好或authentication不足的用户,但是我知道用户在那里,并且它具有适当的权限,唯一让我怀疑的是它使用主机名而不是IP地址。
我也已经validation,我在SiteA上的MySQL服务器上设置了以下IPTables规则:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
我也可以通过PHP在Site B的同一台服务器上运行类似的mysql连接,但都连接到localhost。
另外,为了好的措施,SiteA的my.cnf中的SQL服务器:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 general-log expire_logs_days = 60 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
我也尝试将“usr'@client.siteB.com”的主机改为“%”,但是我仍然得到相同的错误。 另外,我正在Fedora上运行MySQL服务器,并且我已经将selinux设置为宽容。
另外,我试图在MySQL用户的主机上将主机名更改为Site B的IP,但是我仍然得到相同的错误。 然而,我所见过的所有错误都被称为“client.siteB.com”,即使我在SiteA上执行tcpdump,也会看到来自“client.siteB.com”源的stream量,
我知道,SQL访问被拒绝的错误是非常普遍的,并且有许多根本问题,但是我迄今在SF上看到的主题似乎没有解决这个问题,我完全被难住了。 另外,这次google-fu让我失望了。 🙁
根据我的经验,这个错误不是mysql_connect错误。 它是来自mysql命令行客户端的。 您的PHP脚本在某些时候是否会转到命令行?
所以,我已经知道了这个问题,结果发现这是我的PHP脚本中一个非常遗忘的错误。 因此,在SiteB的networking服务器上,脚本使用variables来存储来自单独文件的连接信息,并且在我执行include之后,该文件最初与我的脚本中的variables名称发生冲突。 这个文件不存在于我在SiteA上的testing环境中,所以用户,模式,主机和密码的所有variables都被其他连接信息所覆盖,这些连接信息被存储在与本地主机的SQL连接相同的文件中,不同的密码。 所以,我不得不改变脚本中的variables名,而且我错过了一个variables(密码之一),所以基本上它在SiteB时使用了另一个密码,而在siteA时使用了正确的密码。
所以,是的,修正了这个variables名之后,连接现在已经build立起来了,现在它已经被正确的authentication了,由于某种原因,我select默认模式的时候只是出现了错误,但是这似乎是一个不相关的问题。 感谢那些给予input的帮助。