如何允許通過 HTTP/PHP 進行遠端 MySQL 連接?
我在下面提到的所有伺服器上執行 CentOS 7。
我正在測試本地開發環境以設置單獨的數據庫和 Web 伺服器。
這些伺服器是在區域網路中通過橋接模式連接的兩個 VirtualBox 實例,因此可以毫無問題地看到對方。
我希望 WEB 伺服器僅使用來自 WEB 伺服器的 IP 限制連接到 DB 伺服器上的 MySQL。
我已經閱讀了一些討論主題,但它們都沒有幫助解決我的問題,因為它們中的許多都是
firewall
或selinux
相關的。我已經禁用了兩者
firewalld
,selinux
因此目前這些都不是因素。DB伺服器IP:192.168.1.167 WEB伺服器IP:192.168.1.168
我正在使用以下腳本進行測試,
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
錯誤:
wget http://192.168.1.168/connect.php
在 192.168.1.168 終端控制台上http://192.168.1.168/connect.php
在我的瀏覽器視窗中也給了我同樣的錯誤。(1) 但是,我可以使用
mysql -u demouser -p -h 192.168.1.167
192.168.1.168 (WEB 伺服器)通過命令行成功連接(2)我在192.168.1.168(WEB伺服器)的終端控制台
Connected successfully
直接執行時也得到php connect.php
我只能確認通過 SSH 的遠端 MySQL 連接正在工作,並且通過 PHP MySQL 模組正在工作。
這是 192.168.1.167(數據庫伺服器)上的訪問權限
+---------------------------------------------------------------------------------------------------------------+ | Grants for demouser@localhost | +---------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'demouser'@'localhost' IDENTIFIED BY PASSWORD '*DB17DD535D122AED147A61C30CD5D01FB3BC5433' | | GRANT ALL PRIVILEGES ON `demodb`.* TO 'demouser'@'localhost' | +---------------------------------------------------------------------------------------------------------------+ +-------------------------------------------------------------------------------------------------------------------+ | Grants for demouser@192.168.1.168 | +-------------------------------------------------------------------------------------------------------------------+ | 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
是連接失敗的原因。如原始執行緒中所述,我禁用了數據庫
SELinux
伺服器上的和防火牆,我認為這會阻止來自WEB伺服器的遠端連接。導致連接問題的原因是
SELinux
在WEB伺服器上。我暫時禁用它
setenforce 0
以將其設置為permissive
模式。一切正常。
我在數據庫伺服器上重新啟用
SELinux
了防火牆。我仍然可以通過WEB伺服器上的 PHP 腳本進行遠端數據庫連接。我現在可以確認問題出在啟動連接的WEB伺服器上。
SELinux
我在WEB伺服器上重新啟用並使用以下命令SELinux
在WEB伺服器上設置布爾值。
setsebool -P httpd_can_network_connect_db 1
目前,我在WEB和DB伺服器
SELinux
上都處於活動狀態,遠端 MySQL 連接仍然可以成功通過。enforcing
我在其他未關注的討論執行緒上讀到的是:配置
SELinux
布爾值的伺服器。希望這個文章可以幫助和我遇到同樣問題的人節省一些時間。