Wordpress 원격 DB 사용 시 "Error establishing a database connection" 해결
나의 반나절을 잡아먹은 "Error establishing a database connection" 에러 ...ㅠ
혹시나 같은 오류로 머리를 뜯고 있을 사람들에게 도움이 되고자 글을 작성한다.
"Error establishing a database connection" 오류가 발생시 해결 방법에 대한 공식 문서는 다음과 같다.
공식 문서 내용을 기반으로 해결하기 위해 시도해 본 방법은 다음과 같다.
1. 정확하지 않거나 변경된 DB 정보로 인해 데이터베이스 연결 오류가 발생한 경우 -> DB 정보를 체크
먼저 DB 정보가 정확한지 체크해준다. wp-config.php 파일을 열어 다음 정보를 확인한다.
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );
/** MySQL database username */
define( 'DB_USER', 'username_here' );
/** MySQL database password */
define( 'DB_PASSWORD', 'password_here' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
원격 DB 서버에서 Create한 Database name과 User name 그리고 Password를 확인한다.
만약 DB 서버에서 DB 생성시 위와 같이 유저를 생성하고 권한을 부여했다면
database_name_here 는 wordpress로
username_here 는 adminuser로
password_here 는 노란색 박스 친 비밀번호로 (만약 IDENTIFIED 옵션을 주지 않았다면 원격 DB 서버의 비밀번호와 동일한 것을 사용한다는 의미이므로 원격 DB 서버의 비밀번호를 입력해주면 된다.)
⭐️ 가장 중요한 부분이 DB_HOST 정의 부분인데 기존의 'localhost'를 원격 DB 서버의 ip 주소로 변경해주어야 한다.
원격 DB 서버의 ip 확인은 "ip addr"로 할 수 있다.
2. 손상된 DB 복구
사실 이 방법은 원격 DB를 사용할 때 해결 방법이 될 수 있을지 의문이지만 구글링을 하면서 가장 많이 발견한 해결 방법이다.
우선 wp-config.php 파일을 다시 열어 하단의 코드를 입력해준다.
define('WP_ALLOW_REPAIR', true);
그 후 http://웹 서버의 ip 주소 또는 도메인/wp-admin/maint/repair.php 에 접근해 데이터베이스 복구 버튼을 클릭한다.
3. 원격 DB에 Web Server의 접근이 허용되어 있는지 확인
원격 DB 서버의 mysql에 접속해 다음을 입력한다.
use mysql;
select host, user from user;
위와 같이 결과가 출력되면 Web server의 IP 주소가 접속 허용되어 있는지 확인한다.
Web Server에서 사용할 user의 host 정보에 % 또는 Web Server IP 주소가 없다면 접근 자체가 막혀있는 것이다.
따라서 원하는 권한을 부여하기 위해 하단의 명령을 입력한다.
# 원격 DB 서버의 모든 DB table을 사용할 수 있으며 어떤 IP로도 접속이 가능하다.
MariaDB [(none)]> grant all privileges on *.* to '사용할 user_name'@'%' identified by '사용할 암호';
# 원격 DB 서버의 모든 DB table을 사용할 수 있으며 웹 서버의 IP 주소를 특정한다.
MariaDB [(none)]> grant all privileges on *.* to '사용할 user_name'@'웹 서버의 IP 주소' identified by '사용할 암호';
# 원격 DB 서버의 특정 DB table을 사용할 수 있으며 어떤 IP로도 접속이 가능하다.
MariaDB [(none)]> grant all privileges on '사용할 DB명'.* to '사용할 user_name'@'%' identified by '사용할 암호';
# 원격 DB 서버의 특정 DB table을 사용할 수 있으며 웹 서버의 IP 주소를 특정한다.
MariaDB [(none)]> grant all privileges on '사용할 DB명'.* to '사용할 user_name'@'웹 서버의 IP 주소' identified by '사용할 암호';
모든 명령에 있는 IDENTIFIED BY '사용할 암호' 는 옵션이다. 만약 이 옵션을 주지 않는다면 원격 DB 서버의 Database 암호를 그대로 사용한다는 뜻이다.
4. SELinux의 연결 차단 해제
DB가 원격에 존재할 경우, 방화벽 셋팅이 정확해도 SELinux가 연결을 차단해서 에러를 발생시킬 수 있다.
이 경우 아래의 명령으로 SELinux 권한을 부여해야 한다.
[root@localhost ~]# setsebool httpd_can_network_connect_db=1
나는 이 방식으로 해결되었다..!
같은 방식으로 Web Server와 DB 서버에 각각 "setenforce 0" 을 입력해준다.
/etc/setlinux/config 파일 내에는 3가지 옵션이 있다.
- enforcing
- premissive
- disabled
Linux를 처음 설치하게 되면 기본 모드는 Enforcing이며 보안이 강화되어있지만 테스트 등을 진행 시 제약 사항이 많아 보통 테스트 시에는 disable을 해서 사용한다. getenforce 명령을 입력했을 때 Permissive가 나오면 된다.
5. 원격 DB 서버에서 mysql_secure_installation 초기 설정 변경
원격 DB 서버에 mysql을 처음 설치하면 my_secure_installation 설정을 해줘야 한다.
Disallow root login remotely? 에서 N을 입력해준다.