![HTTP/PHP를 통한 원격 MySQL 연결을 어떻게 허용합니까?](https://rvso.com/image/697399/HTTP%2FPHP%EB%A5%BC%20%ED%86%B5%ED%95%9C%20%EC%9B%90%EA%B2%A9%20MySQL%20%EC%97%B0%EA%B2%B0%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%97%88%EC%9A%A9%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
아래 언급된 모든 서버에서 CentOS 7을 실행하고 있습니다.
별도의 데이터베이스와 웹 서버를 설정하기 위해 로컬 개발 환경에서 테스트하고 있습니다.
이 서버는 LAN에서 브리지 모드를 통해 연결된 두 개의 VirtualBox 인스턴스이므로 문제없이 서로를 볼 수 있습니다.
웹 서버에서만 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
내 브라우저 창에서도 같은 오류가 발생합니다.
mysql -u demouser -p -h 192.168.1.167
(1) 그러나 192.168.1.168(웹 서버)을 사용하여 명령줄을 통해 성공적으로 연결할 수 있습니다.
(2) 192.168.1.168(WEB 서버)의 터미널 콘솔에서 Connected successfully
직접 실행해도 나옵니다.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 연결을 허용하려면 어떻게 해야 합니까?
답변1
SELinux
그것이 연결 실패의 원인임을 확인할 수 있었습니다 .
원래 스레드에서 언급한 대로, 저는 SELinux
방화벽과 방화벽을 비활성화했습니다.DB서버가 원격 연결을 차단하고 있다고 생각했습니다.편물섬기는 사람.
연결 문제를 일으키는 원인 SELinux
은편물섬기는 사람.
모드 setenforce 0
로 설정하기 위해 일시적으로 비활성화했습니다 .permissive
모든 것이 작동합니다.
다시 활성화 SELinux
하고 방화벽을DB섬기는 사람. 여전히 PHP 스크립트를 통해 원격 데이터베이스 연결을 만들 수 있습니다.편물섬기는 사람.
이제 문제가 다음에 있었음을 확인할 수 있습니다.편물연결을 시작하는 서버.
SELinux
에서 다시 활성화했습니다.편물SELinux
서버 에서 다음 명령을 사용하여 부울을 설정합니다.편물섬기는 사람.
setsebool -P httpd_can_network_connect_db 1
현재 저는 SELinux
두 가지 모두에서 활동 하고 있습니다.편물&DB서버가 enforcing
모드에 있고 원격 MySQL 연결은 여전히 성공적으로 진행될 수 있습니다.
내가 따르지 않은 다른 토론 스레드에서 읽은 내용은 SELinux
부울을 구성할 서버가 무엇인지였습니다.
이 스레드가 나와 같은 문제를 겪고 있는 사람에게 시간을 절약하는 데 도움이 되기를 바랍니다.