Issue

Wordpress 원격 DB 사용 시 "Error establishing a database connection" 해결

TTOII 2022. 3. 17. 01:02
728x90

나의 반나절을 잡아먹은 "Error establishing a database connection" 에러 ...ㅠ 

혹시나 같은 오류로 머리를 뜯고 있을 사람들에게 도움이 되고자 글을 작성한다.

 

"Error establishing a database connection" 오류가 발생시 해결 방법에 대한 공식 문서는 다음과 같다.

 

Common WordPress Errors

If you are encountering a WordPress error message or white screen, don’t panic. Someone has likely encountered the same message before and it can easily be solved. This page lists the most co…

wordpress.org

 

공식 문서 내용을 기반으로 해결하기 위해 시도해 본 방법은 다음과 같다. 

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을 입력해준다. 

728x90