![HTTP/PHP 経由でリモート MySQL 接続を許可するにはどうすればよいですか?](https://rvso.com/image/697399/HTTP%2FPHP%20%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%20MySQL%20%E6%8E%A5%E7%B6%9A%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
下記のすべてのサーバーで CentOS 7 を実行しています。
個別のデータベースと Web サーバーをセットアップするために、ローカル開発環境でテストしています。
これらのサーバーは、ローカル エリア ネットワークでブリッジ モードを介して接続された 2 つの VirtualBox インスタンスであり、問題なく相互に認識できます。
WEBサーバーからのIP制限のみを使用して、WEBサーバーが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
私のブラウザウィンドウでも同じエラーが表示されます。
mysql -u demouser -p -h 192.168.1.167
(1)しかし、 192.168.1.168(WEBサーバー)からコマンドライン経由で正常に接続できます。
(2) 192.168.1.168(WEBサーバ)の端末コンソールでConnected successfully
直接実行した場合も同様php connect.php
SSH 経由のリモート MySQL 接続が機能していること、および PHP MySQL モジュール経由のリモート 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
前述の WEB サーバーから開始されるリクエストに対してのみ、HTTP/PHP 経由のリモート MySQL 接続を許可するにはどうすればよいでしょうか?
答え1
SELinux
それが接続失敗の原因であると特定できました。
元のスレッドで述べたように、私SELinux
はデービッドサーバーからのリモート接続をブロックしていると私は考えていましたウェブサーバ。
接続の問題の原因SELinux
はウェブサーバ。
setenforce 0
モードに設定するために、一時的に無効にしましたpermissive
。
すべて正常に動作します。
SELinux
ファイアウォールを再度有効にしましたデービッドサーバー。PHPスクリプトを介してリモートデータベース接続を確立することはできます。ウェブサーバ。
問題はウェブ接続を開始するサーバー。
再度有効SELinux
にしましたウェブサーバーで次のコマンドを使用してブール値を設定しSELinux
ますウェブサーバ。
setsebool -P httpd_can_network_connect_db 1
現在、私はSELinux
両方で活動していますウェブ&デービッドサーバーはenforcing
モードになっており、リモート MySQL 接続は正常に実行されます。
私がフォローしていない他のディスカッション スレッドで読んだ内容は、SELinux
ブール値を構成するサーバーについてでした。
このスレッドが、私と同じ問題を抱えている人たちの時間を節約するのに役立てば幸いです。