최초 작성일 : 2021-09-25 | 수정일 : 2021-09-25 | 조회수 : 1306 |
웹서버와 DB서버의 분리를 해야하는 상황은 여러가지 이유로 발생할수가 있는데, 벤처기업같은경우 처음에 경제적인 면등을 이유로 웹과 DB를 한대의 서버에서 같이 돌리다가, 추후 사용자의 증가에 따른 트래픽 문제로 이를 분리하거나, 일반기업이라도 한서버에서 돌리던 것을 트래픽증가등의 이유로 이러한 상황에 부닥치는 경우가 비일비재한다.
일반적으로 기업에서는 MSSQL, MYSQL, ORACLE 이 세가지의 DB서버프로그램을 주로 사용하는데, 오늘은 MYSQL을 사용할 경우 한대에 있는 웹과 DB를 두대로 분리 하는 경우를 알아보자.
우선 환경은 아래와 같다.
OS : Linux 7.1kr ( kernel 2.4.3-12)
DB : Mysql-3.23.41
Apache 1.3.20
Php 4.0.6
현재 한대의 서버에서 웹과 DB가 같이 돌고 있는 상태이며, 이를 분리 하려 한다.
그럼 우선적으로 백업을 받아야겠죠?
Web문서파일들은 쉽게 압축해서서 받아놓으면 되시고, 실제로 중요한건 DB백업이다.
Mysql같은 경우 백업은 간단히 두가지로 할수있다.
데이타베이스가 위치한 디렉토리 통째로 압축하는 방법과 덤프를 하는 방법이죠.
첫번째는 압축한 데이타베이스 디렉토리를 새로 옮길 DB서버에서 풀어주기만 하면 되죠.
Shell> tar cvfz database.tgz ./database (backup command)
Shell> tar xvfz database.tgz (restore command)
두번째 덤프하는법은 아래와 같다.
Shell> mysqldump -u root -p -A > allbackup.sql (backup command)
Shell> mysqldump -u root -p -A < allbackup.sql (restore command)
덤프받는 파일 이름은 아무렇게나 정해주셔도 되지만 확장자는 sql로 해주세요. 그리고 보다 자세한 MySQL 백업방법은 PHPleader의 강좌를 참고하시기 바란다.
자 . 백업을 다 받으셨다면 이제 다음으로 새로운 서버에 Mysql을 설치해보자.
자, 이제 새로운 서버에 Mysql을 설치해 보겠습니다.
Mysql-3.23.41.tgz 파일을 받으셔서 압축을 푸신후 컴파일 한다.
(최신버젼은 Mysql-3.23.46이라더군요. ftp://ftp.linux.co.kr/mirror/www.mysql.com/Downloads/MySQL-3.23/에서 다운로드 받으실 수 있습니다)
Shell> ./configure --with-charset=euc_kr --prefix=/usr/local/mysql
--localstatedir=/database
--with-charset=euc_kr (한국어를 쓰겠다는 옵션이다.
)
--localstatedir=/database(실제로 데이타베이스파일이 위치할 디렉토리를 정해주는 옵션이다.
)
configure한 후에는 make, make install
컴파일을 하셨으면 기동 시켜야겠죠.
Shell> /usr/local/mysql/bin/mysql_install_db
Shell> /usr/local/mysql/bin/safe_mysqld &
웹서버는 이미 DB를 분리했으므로, 기존있는 Mysql과 데이타를 지워주세요.
그리고 아파치와 PHP를 다시 컴파일 한다.
Shell> ./configure --prefix=/usr/local/apache --enable-shared=max
--enable-shared=max (DSO방식으로 컴파일 하겠다는 뜻이다.
)
Shell> ./configure --prefix=/usr/local/php --with-apxs=/usr/local/apache/bin/apxs
--with-config-file-path=/usr/local/apache/conf --enable-track-vars
--with-apxs=/usr/local/apache/bin/apxs (apxs를 사용하는 옵션이다.
)
--with-config-file-path=/usr/local/apache/conf (php.ini의 경로를 정해주는 옵션이다.
)
그러고 나서 역시 make, make install 해주시면 된다.
DB서버의 세팅을 대강 마쳤으니 이제 부터 웹서버와 DB서버의 연동을 해야한다.
Mysql은 기본적으로 local에서 돌도록 되어 있으므로, DB서버의 mysql DB를 수정해주어야 원격지의 웹서버와 연동을 할수있다.
그럼 DB서버를 보죠.
데몬이 올라가있으므로, 접속을 해보자.
Shell> mysql -u root -p mysql
mysql> show tables;
+-------------------+
| Tables_in_mysql|
+-------------------+
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
+-------------------+
6 rows in set (0.00 sec)
위에서 보시는 mysql DB의 테이블중 db테이블과 user테이블이 수정해야할 부분이다.
우선 DB테이블을 보시면 아래와같다.
mysql> desc db;
+--------------------+-------------------+--------+-----+----------+---------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+-------------------+--------+-----+----------+---------+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Select_priv | enum('N','Y') | | | N | |
| Insert_priv | enum('N','Y') | | | N | |
| Update_priv | enum('N','Y') | | | N | |
| Delete_priv | enum('N','Y') | | | N | |
| Create_priv | enum('N','Y') | | | N | |
| Drop_priv | enum('N','Y') | | | N | |
| Grant_priv | enum('N','Y') | | | N | |
| References_priv | enum('N','Y') | | | N | |
| Index_priv | enum('N','Y') | | | N | |
| Alter_priv | enum('N','Y') | | | N | |
+--------------------+-------------------+--------+-----+----------+---------+
13 rows in set (0.00 sec)
mysql> select Host,Db,User from db;
+-----------------+---------------+-----------+
| Host | Db | User |
+-----------------+---------------+-----------+
| 211.233.15.1 | BOARD | user |
| 211.233.15.1 | BOARD1 | user |
| 211.233.15.1 | test | |
| 211.233.15.1 | test_% | |
+-----------------+---------------+-----------+
7 rows in set (0.00 sec)
여기서 Host부분에 IP가 써있지요?
보통 디폴트는 localhost로 되어있다.
위에서도 언급했듯이 mysql은 디폴트로 로컬에서 돌도록 되어있기때문에 DB의 위치를 나타내는 Host 부분이 localhost로 되어있는 것이다.
여기에서는 웹과 DB가 분리되어있으므로, 각각 원격지가 된다.
따라서, DB의 위치를 나타내는 db테이블의 Host부분에는 해당 DB서버의 IP를 적어주셔야 한다.
Update문을 쓰셔서 간단히 기존의 localhost로 되어있는 것을 바꾸어 줄수있다.
Update db set Host=REPLACE(Host,'localhost','211.233.15.1');
그럼 다음 user테이블을 볼까요?
mysql> desc user;
+--------------------+--------------------+-------+-----+-----------+--------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------------+-------+-----+-----------+--------+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Select_priv | enum('N','Y') | | | N | |
| Insert_priv | enum('N','Y') | | | N | |
| Update_priv | enum('N','Y') | | | N | |
| Delete_priv | enum('N','Y') | | | N | |
| Create_priv | enum('N','Y') | | | N | |
| Drop_priv | enum('N','Y') | | | N | |
| Grant_priv | enum('N','Y') | | | N | |
| References_priv | enum('N','Y') | | | N | |
| Index_priv | enum('N','Y') | | | N | |
| Alter_priv | enum('N','Y') | | | N | |
+--------------------+--------------------+-------+-----+-----------+--------+
17 rows in set (0.00 sec)
mysql> select Host,User from user;
+-------+----------+
| Host | User |
+-------+----------+
| % | |
| % | user |
| % | root |
| db | |
| db | root |
+-------+----------+
8 rows in set (0.00 sec)
위에서 보시다시피 Host부분이 %로 되어있다.
여기도 기본값은 localhost죠.
user 테이블의 Host부분은 db테이블의 Host부분처럼 DB서버의 위치를 나타낸는것이 아니라 DB에 접속할 사용자의 위치를 나타내는것이다.
여기서는 모든 호스트에서 DB로 접속을 하겠다는 뜻인 %를 사용하였다.
여기서도 위에서 처럼 localhost로 되어있는 부분을 Update 문을 이용해서 아래와 같이 바꾸어 주면 된다.
UPdate user set Host=REPLACE(Host,'localhost','%');
해당DB의 내용을 쓸수 있게 수정mysql>GRANT ALL ON DB명.* to 유저명;
모든 수정이 끝났으면, 이제 DB내용을 갱신해주어야 겠죠?
mysql> flush privileges;
로 간단하게 DB를 갱신해 줍니다.
휴~ 이제 연동이 다 끝났군요.
php소스는 DB컨넥팅하는 부분에 기존의 부분을 IP로 바꾸어 주시면 되겠죠?
그럼 무사하게 웹서버와 DB서버의 분리가 끝나고 연동도 마치게 되었다 .[출처] 웹서버와 DB서버 분리|작성자 제로