我如何允许通过HTTP / PHP远程MySQL连接?

我在下面提到的所有服务器上运行CentOS 7。

我正在testing一个本地开发环境来设置单独的数据库和Web服务器。

这些服务器是通过局域网中的桥接模式连接的两个VirtualBox实例,以便可以看到彼此没有问题。

我只希望WEB服务器能够使用来自WEB服务器的IP限制连接到DB服务器上的MySQL。

我已经阅读了一些讨论主题,但没有一个能够帮助解决我的问题,因为其中许多是firewallselinux相关的。

我已经禁用了firewalldselinux所以这些都不是目前的因素。

DB服务器IP:192.168.1.167 WEB服务器IP:192.168.1.168

我正在使用以下脚本进行testing, http://192.168.1.168/connect.php

 <?php $servername = "192.168.1.167"; $username = "demouser"; $password = "password"; // Create connection $conn = mysqli_connect($servername, $username, $password); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } echo "Connected successfully"; ?> 

我得到Connection failed: Permission denied执行时, Connection failed: Permission denied错误:

  • wget http://192.168.1.168/connect.php在192.168.1.168terminal控制台上

  • 在我的浏览器窗口http://192.168.1.168/connect.php也给了我相同的错误。

(1)但是,我能够通过命令行使用从192.168.1.168(WEB服务器)的mysql -u demouser -p -h 192.168.1.167成功连接,

(2)在192.168.1.168(WEB服务器)的terminal控制台直接执行php connect.php

我只能确认通过SSH远程MySQL连接正在工作,并通过PHP MySQL模块正在工作。

这是192.168.1.167(DB服务器)上的访问权限

 +---------------------------------------------------------------------------------------------------------------+ | Grants for demouser@localhost | +---------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'demouser'@'localhost' IDENTIFIED BY PASSWORD '*DB17DD535D122AED147A61C30CD5D01FB3BC5433' | | GRANT ALL PRIVILEGES ON `demodb`.* TO 'demouser'@'localhost' | +---------------------------------------------------------------------------------------------------------------+ +-------------------------------------------------------------------------------------------------------------------+ | Grants for [email protected] | +-------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'demouser'@'192.168.1.168' IDENTIFIED BY PASSWORD '*DB17DD535D122AED147A61C30CD5D01FB3BC5433' | | GRANT ALL PRIVILEGES ON `demodb`.* TO 'demouser'@'192.168.1.168' | +-------------------------------------------------------------------------------------------------------------------+ 

netstat在192.168.1.167上显示:

 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2892/mysqld tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1704/master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1053/sshd 

我怎样才能允许通过HTTP / PHP远程MySQL连接,但只有从上述WEB服务器发起的请求?

我能够确定SELinux是连接失败的原因。

正如在原始线程中提到的,我禁用了DB服务器上的SELinux和防火墙,我相信这是阻止从WEB服务器的远程连接。

导致连接问题的原因是WEB服务器上的SELinux

我暂时禁用它使用setenforce 0将其设置为permissive模式。

一切正常。

我重新启用了数据库服务器上的SELinux和防火墙。 我仍然可以通过WEB服务器上的PHP脚本进行远程数据库连接。

我现在可以确认问题是在启动连接的WEB服务器上。

我在WEB服务器上重新启用了SELinux ,并使用以下命令在WEB服务器上设置SELinux的布尔值。

setsebool -P httpd_can_network_connect_db 1

目前,我已经在enforcing模式下在WEBDB服务器上激活了SELinux ,远程MySQL连接仍然可以成功执行。

我在其他讨论主题上看到的没有遵循的是:哪个服务器来configurationSELinux布尔值。

希望这个线程可以帮助那些遇到同样问题的人来节省一些时间。