Stigmatized./Essay

웹서버와 디비서버 통합하기

sosal 2014. 12. 5. 15:49
반응형


/*

 http://sosal.kr/
 * made by so_Sal
 */


웹서버와 DB서버가 나뉘어진 웹사이트에서, DB서버에 있는 디비를 모두 웹서버로 옮겨 통합하는 일을 맡게되었다.


작업의 시작은 90번 디비서버의 mysql 백업본이 있느냐 확인하는 것 부터 시작하였다.


if(백업본.exist() == true)

 -> 바로 91번 서버로 옮김

else

 -> 백업하기


디비를 직접 백업해야하느냐, 백업본이 있느냐 확인하기 위해 cron 데몬이 돌아가고있는지 확인했다.


[root@db cron.daily]# ps -elf | grep cron

1 S root      2055     1  0  80   0    -   414 run_in Feb25 ?        00:00:00 crond

0 S root     11406 10780  0  80   0    -   938 run_in 14:48 pts/0    00:00:00 grep cron


cron 데몬이 돌아가고있으니 cron 파일을 검색해보기로 했다.



[root@db etc]# ls -al cron*

-rw-r--r--    1 root     root          305 Jul  7  2005 crontab


cron.d:

total 8

drwxr-xr-x    2 root     root         4096 Apr 14  2005 ./

drwxr-xr-x   56 root     root         4096 Dec  5 13:59 ../


cron.daily:

total 48

drwxr-xr-x    2 root     root         4096 Dec  4 23:40 ./

drwxr-xr-x   56 root     root         4096 Dec  5 13:59 ../

lrwxr-xr-x    1 root     root           28 Jul  7  2005 00-logwatch -> ../log.d/scripts/logwatch.pl*

-rwx------    1 root     root          308 Sep 17  2009 backup.sh*

-rwx------    1 root     root          725 Jul  8  2005 check_back.cgi*

-rwx------    1 root     root          565 Jul  8  2005 check_fw.cgi*

-rwxr-xr-x    1 root     root          180 Feb 28  2004 logrotate*

-rwxr-xr-x    1 root     root          418 Feb 28  2004 makewhatis.cron*

-rwxr-xr-x    1 root     root         1603 May  6  2004 prelink*

-rwxr-xr-x    1 root     root          104 Apr 13  2005 rpm*

-rwxr-xr-x    1 root     root          132 Mar 18  2004 slocate.cron*

-rwxr-xr-x    1 root     root          193 Feb 29  2004 tmpwatch*

-rwxr-xr-x    1 root     root          136 Dec  4 23:38 yum.cron*


cron.hourly:

total 12

drwxr-xr-x    2 root     root         4096 Dec  4 23:40 ./

drwxr-xr-x   56 root     root         4096 Dec  5 13:59 ../

-rwx------    1 root     root          103 Jul  7  2005 snmpd.sh*


cron.monthly:

total 8

drwxr-xr-x    2 root     root         4096 Feb 27  2004 ./

drwxr-xr-x   56 root     root         4096 Dec  5 13:59 ../


cron.weekly:

total 16

drwxr-xr-x    2 root     root         4096 Jul  8  2005 ./

drwxr-xr-x   56 root     root         4096 Dec  5 13:59 ../

-rwx------    1 root     root          648 Jul  8  2005 iptables.cron*

-rwxr-xr-x    1 root     root          414 Feb 28  2004 makewhatis.cron*

[root@db etc]#




/etc/cron,daily/backup.sh* 파일에 백업을 하는것이겠지.

라고 생각하고 봤더니만 실제로 mysql 파일 전체를 그대로 압축하여 저장하고 있었다.


경로는 homedir="/****/backup"


tar cvfpz mysql_$dat.tgz /usr/local/mysql/var/* 이런식으로 압축을 하고 있었는데,

mysqldump로 백업본을 떠서 올리려던 계획이 무산되었고 바이너리를 통째로 ftp로 옮기려고 계획을 수정하였다.


지금 생각해보니 아마 cron에다가 mysqldump로 백업하려면 디비 패스워드를 넣어야하니까..

그게 찜찜해서 통쨰로 압축했나 싶기도 하다.



- 해당 압축파일을 FTP로 전송하기로 했다.


yum install vsftpd

위 명령어로 vsftpd를 설치한 이후에,

/etc/vsftpd/vsftpd.conf 파일에서 


ftp_username=ftp_sosal

anonymous_enable=YES

chroot_local_user=YES


설정을 막 때려놓고 백업본을 ftp user 풀더에 갖다 박았다.

어차피 vsftpd 켜놓을것도 아니고 보안같은거 신경쓸 겨를이 없으니 말이다.

ftp_sosal이란 계정도 추가해주고..



아차, vsftpd.ftpusers, vsftpd.user_list 폴더 목록에 ftp 계정이름을 넣으면 안된다.

-rw-------    1 root     root          118 Dec  5 00:00 /etc/vsftpd.ftpusers

-rw-------    1 root     root          354 Dec  5 00:00 /etc/vsftpd.user_list



[root@db backup]# cat /etc/vsftpd.ftpusers

# Users that are not allowed to login via ftp


[root@db backup]# cat /etc/vsftpd.user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd.ftpusers
# for users that are denied.

만약 유저를 추가한다면 530 Permission denied. 가 발생하게된다 ㅋㅋ.



백업되는 위치에


[root@db backup]# ls -al mysql*

-rwx------    1 root     root     354376599 Nov 24 04:04 mysql_20141124.tgz*

-rwx------    1 root     root     354341942 Nov 25 04:04 mysql_20141125.tgz*

-rwx------    1 root     root     354373052 Nov 26 04:04 mysql_20141126.tgz*

-rwx------    1 root     root     354381727 Nov 27 04:04 mysql_20141127.tgz*

-rwx------    1 root     root     354374640 Nov 28 04:04 mysql_20141128.tgz*

-rwx------    1 root     root     354381714 Nov 29 04:04 mysql_20141129.tgz*

-rwx------    1 root     root     354427594 Nov 30 04:04 mysql_20141130.tgz*

-rwx------    1 root     root     354436122 Dec  1 04:04 mysql_20141201.tgz*

-rwx------    1 root     root     354462167 Dec  2 04:04 mysql_20141202.tgz*

-rwx------    1 root     root     354390642 Dec  3 04:04 mysql_20141203.tgz*

-rwx------    1 root     root     354420685 Dec  4 04:04 mysql_20141204.tgz*

-rwx------    1 root     root     354447343 Dec  5 04:04 mysql_20141205.tgz*


이렇게 고스란히 다 남아있었다.

가장 최근 압축파일인 mysql_20141205.tgz* 파일을 그대로 ftp_sosal 홈으로 이동시켰다.

mv mysql_20141205.tgz ~ftp_sosal


어차피 이 디비서버는 이제 날려버릴테니까, 굳이 백업본을 백업서버에 그대로 유지할필요가 없으니.


vsftpd (pid 21438) is running...

[root@localhost install]# ftp xxx.xxx.xxx.xxx

Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).

220 (vsFTPd 1.2.1)

Name (xxx.xxx.xxx.xxx:root): ftp_sosal

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> get mysql_20141205.tgz


이렇게 간단히 웹서버로 받아버리고..





이것은 mysqldump 같은것으로 구성된것이 아니니, 그냥 압축을 풀어서 mysql이 있는곳에 바로 넣어버리면 된다.

그럼 이 백업파일을 어디다 갖다 넣어버리면 될것이냐?

mysql의 기본 위치를 찾기위해 find 명령어를 사용했다.


[root@localhost install]# find / -name mysql

~~~~~~~

/var/lib/mysql

/var/lib/mysql/mysql

[root@localhost install]# ^C


뭐 간단하게 나온것 같아서 저 풀더를 확인해봤다.

[root@localhost mysql]# ls -al /var/lib/mysql

total 20836

drwxr-xr-x   5 mysql mysql     4096 Dec  5 14:33 .

drwxr-xr-x. 35 root  root      4096 Dec  3 18:55 ..

-rw-rw----   1 mysql mysql 10485760 Dec  5 14:32 ibdata1

-rw-rw----   1 mysql mysql  5242880 Dec  5 14:33 ib_logfile0

-rw-rw----   1 mysql mysql  5242880 Nov  5 23:32 ib_logfile1

drwx------   2 mysql mysql     4096 Nov  5 23:32 mysql

srwxrwxrwx   1 mysql mysql        0 Dec  5 14:33 mysql.sock

drwx------   2 mysql mysql     4096 Dec  5 02:36 sosal


내가 sosal이란 데이터베이스를 추가해놨는데 떡하니 보이길래 여기구나 확신을 가졌다.

[root@localhost mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
~~~~

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| sosal              |
+--------------------+

위처럼...


그래서 압축파일을 그대로 여기다 옮겼다.

tar -xvzf  mysql_20141205.tgz

압축을 풀고

mv mysql_20141205.tgz /var/lib/mysql/DB이름


그리고 다시 데이터베이스에서 확인해봤다.


[root@localhost mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
~~~~~

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| sosal              |
| DB이름              |
+--------------------+


떡하니 DB에 내가 추가한 데이터들이 보인다.

show tables와 select 구문으로 살펴보니 온전하게 옮겨진것 같다.


디비서버와 똑같은 계정과 패스워드, 그리고 데이터베이스에 대한 모든 권한을 주었다.

mysql 데이터베이스 계정 추가

CREATE USER 'sosal' IDENTIFIED BY 'password';

mysql 추가된 DB에 권한 설정

GRANT ALL PRIVILEGES ON DB이름.* TO 'newuser'@'localhost';


자 이쯤이면 이제 거의 완료 됐다.

데이터베이스도 다 옮겨졌으니, 웹페이지의 config.php, db.php 파일을 수정하여

실제로 웹서버 내부에 올라간 database에 쿼리를 날리도록 바꾸자.


이제 웹루트폴더에 이동하여 이전 디비서버로 쿼리를 날리는 config.php, db.php 같은 파일들을 검색해보자,

쿨하게 전부다 찾아내버리자.

[root@localhost public_html]#

[root@localhost public_html]# grep -rw "ip주소" ./

~

./public_html/main.html:$connect=mysql_connect("xxx.xxx.xxx.xxx","DB이름","Password");
./public_html/club/plugin/include/config/db.php:xxx.xxx.xxx.xxx
./public_html/club/include/config/db.php:xxx.xxx.xxx.xxx
./public_html/club/community/club/include/config/db.php:xxx.xxx.xxx.xxx
./public_html/club/community/include/config/db.php:xxx.xxx.xxx.xxx
./public_html/club/community/module/include/config/db.php:xxx.xxx.xxx.xxx
./public_html/club/community/club_module/include/config/db.php:xxx.xxx.xxx.xxx
~
./public_html/ckjoin.php:$connect = mysql_connect("xxx.xxx.xxx.xxx","DB이름","Password");
./public_html/main1.html:$connect=mysql_connect("xxx.xxx.xxx.xxx","DB이름","Password");
./public_html/SiteAddress/ckjoin.php:$connect = mysql_connect("xxx.xxx.xxx.xxx","DB이름","Password");
./public_html/SiteAddress/lib/config.php:   $DB_Host = "xxx.xxx.xxx.xxx";


많이도 뜬다 --;

귀찮지만 맡은일이니 전부 웹서버 ip로 바꿔버리고, 이제 httpd와 mysqld를 restart 해본다.


service mysqld restart;

service httpd restart;


사실 httpd는 restart할필요가 없어보이긴? 하다.



서버가 잘 돌아가길래 혹시나 mysqld를 꺼봤다.

service mysqld stop;


그래도 홈페이지가 잘 돌아가고 있다.

이건 딱봐도 데이터베이스 서버로 쿼리를 날리고 있는데, 2가지 경우의 수를 추측해보았다.

1. 데이터베이스의 대체도메인이 존재하는가?

2. php 파일로 된 바이너리 파일이 존재하는가?


1번은 일단 내가 서버를 완전히 밀고 새로하는것이었으니 그럴리가 없었다.

2번일 경우가 높아서 찾아보기를 강구하였다.


일단 디비서버를 닫아보았다. (사장님이 눈치채기 전에 빨리..)

그런데 이게 10년이 넘은 서버라 service 같은 명령어로 mysqld가 종료되지가 않는다.

이거 껏다간 다시 못키는 경우의수가 있어서 일단 그대로 두고, 데이터베이스 서버의 계정에

원격접속을 허용하지 않기로 했다.


[root@db backup]# mysql -u root -p

Enter password:

mysql> use mysql


mysql> select Host,User from user;
+--------------+-----------+
| Host         | User      |
+--------------+-----------+
| xxxxxxxxxxxx | root      |
| 웹페이지주소 | 디비서버 |
| 웹페이지주소 | root      |
| localhost    | 디비서버 |
| localhost    | root      |
+--------------+-----------+

역시, 웹페이지 서버에서 디비서버로 접속하는 Host가 존재하기에, 저걸 잠깐 디비서버 주소로 바꿔주기로 했다.


UPDATE mysql.user SET Host='디비서버주소' WHERE Host='웹페이지주소' AND User='디비서버';

그럼 사실상 localhost로 되는거니,

flush privileges; 해주는순간 바로 서버가 멈출것이다.


UPDATE mysql.user SET Host='웹페이지주소' WHERE Host='디비서버주소' AND User='디비서버';

flush privileges;

위처럼 바로 복구할 수 있는 쿼리를 만들어 놓고

잠깐 홈페이지 디비서버를 접근하지 못하게 만들어버렸다.




휴.. setup_mysql.php 이녀석을 한번 살펴보자 ㅡㅡ;


[root@localhost install]# cat setup_mysql.php

<? exit;

==QT8dXkJWYvJGNkAaMfJXwzVHf2E2Nw0iNxQDN8Rmch9mY1ADMxdHM54SM34yN24aMxxDfHdXA

?>


(물론 바이너리를 수정했으니, 이 바이너리로 뭘 알아볼 생각은 하지마시길)


휴.. 이녀석의 이름을 수정하고 바로 admin.php 페이지를 출력해보자.


<그리고 다시 빨리 위의 DB 원격접속 host의 UPDATE 구문을 이용하여 웹페이지를 복구했다.>

아마 누구도에게 홈페이지가 멈췄다는걸 들키지 않았겠지..


빨리빨리!! 사용자가 고장난 웹페이지를 봐선 안돼 ㅠㅠ


빨리 새로 생성한 DB ID와 Passwd를 정리하고 다시 홈페이지를 켰는데

뙇!! 잘뜬다.



service mysqld stop;

이런 미친 명령어로 디비서버가를 멈추고 홈페이지가 정상동작하지 않는것도 확인 한 후

service mysqld start; 로 디비서버를 실행하여 게시판이 잘 동작하는걸 확인하였다.



휴.. 오늘의 업무는 여기서 끝!