Windows 2012 서버 -> Cent OS 7 로 서버이관 : 익숙함을 버리다.

 GRE가 끝나고 가장 하고싶었던 일이 바로 개인 서버를 Cent OS 로 바꾸는 것이었다. 머릿속에도 수없이 많이 서버들에 뭔가 웜이나 바이러스가 침투했을 것이란 불안한 생각 때문에 몇번이고 RDP로 접속해 보곤 했다. 다행히 그런 일은 없었지만 말이다.

 무엇보다 구글 Page Speed 로 내가 가지고 있는 사이트들을 측정해 보니 서버응답시간이 무려 5초 이상 걸리는 경우가 허다했다. 이정도면 참, 페이지 이탈률도 그야말로 어마어마 했을텐데, (HTML5 Korea 기준 50% 이상..) 참으로 이 답답한 사이트들을 방문해줬던 분들께 감사드려야지.

 잠시 나의 서버 경험을 둘러본다. 어쩌다 서버에 관심을 가지게 된 것인지는 모르겠지만, 사실 O/S에 대한 흥미가 가장 컸다고나 할까.. 나의 경우는 98년 FrontPage 98 정품을 구매하면서 윈도우 NT 4.0 을 통해 IIS를 알게 되었다. (정말 당시에는 신세계였는데..) 2000년도 AMP기반이 유행하게 되자, 나역시도 PHP를 공부하면서 윈도우 2000 서버, 2003 서버, 2008 서버, 2012 서버까지 거의 윈도우와 한축을 같이했다.

 웃긴건 이후 실무에서 내가 작업했던 사이트들이 대부분 ASP 혹은 ASP.NET을 사용한 것이 아니라 윈도우 서버에 아파치 HTTP를 물려서 PHP니 뭐 톰켓이랑 물리는 식이었다. 실무 자체는 2006년부터 시작하게 되었는데 당시 내 첫 프로젝트 또한 Apache HTTP + Tomcat이었으며, 이후 옮긴 회사에서 나름대로 대기업과 공기업의 프로젝트를 한답시고 돌린 서버 역시 윈 2003, 2008 서버에 Servlet Container만 뭐 Websphere나 Resin등으로 다를 뿐이지 결국 IIS를 사용하지는 않았다. 아마 Linux 서버가 돈이 안되니깐 윈도우 서버로 마진 퉁탕치기.. 뭐 이런식의 우리나라의 전형적 갑-을 계약에서 온 기형적 발전이 아닐까 싶다. 

 결국 나도 익숙함을 버리지 못해 생긴 결과이다. 거의 8년간 윈도우 서버에 익숙하다 보니 매번 윈도우 서버만을 사용하였지만, 이번에는 왜인지 윈도우 2012 엔터프라이즈 서버 R2를 사용함에도 퍼포먼스가 나날히 떨어지는 것이 느껴지더라. 왜일까 했는데 실서버의 사설 IP대역에 물려둔 Test Server에 Backdoor가 설치되어 있더라.. 때문에 나도 모르는 사이에 대역폭을 그렇게나 많이 잡아먹고 있었던 것이다. 그런데 테스트 서버가 윈도 2008 서버이다 보니 더욱이나 신뢰가 안가는 것이 매한가지.. 

 그래서 이번에 큰맘먹고 다시금 Cent OS로 바꾸기로 했다. 지난번에 한번 바꾼 적이 있긴한데, “왜 내가 익숙함을 버려야지?” 라는 생각과 동시에 다시 윈도 2012 서버로 돌아왔었다. 역시나, 익숙함의 함정 속에 놀아난 것이다. 일전에 프로젝트를 진행하며 SSL 설치나 NginX로 갈아타는 등의 작업은 결국 리눅스 기반 쉘을 다시금 윈도우로 역포팅하는 등의 작업을 진행한 것인데, 이런 작업을이 일종의 “뻘짓(?)” 이란 생각은 져버린 채 말이다.

이왕 서버이관을 하는김에 기존에 깔았던 Cent OS 6.5 에서 7.0으로 올리고, 톰켓, NginX, NodeJS등도 최신으로 깔기로 하였다. 참고로 메튜랩의 서버 환경은 사실 좀 고사양의 워크스테이션 2대를 전용선으로 사무실 내 서버실에 묶어놓은 형태이므로 참고를.. (잘 안보이지만 구성은 아래와 같다.)

327024_522384724442505_1846665788_o

서버이관 과정은 이러했다.

  1. Cent OS 7.0 다운로드 : http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7.0-1406-x86_64-DVD.iso
  2. DVD-ISO 굽기 (DVD 한장이면 됨)
  3. 설치
    • 설치는 크게 어렵지 않다. 서비님의 블로그(http://mslee89.tistory.com/92) 를 참조해도 되고.. 나름 자료는 많이 있다.
    • 이 과정에서 파티션을 나누는 부분이 좀 골때렸다. 일전에는 WAS서버에 128SSD + 1TB SATA 3 를 사용해서 SSD는 O/S용, SATA는 웹 데이터용으로 사용했는데 생각보다 웹에서 사용하는 데이터의 용량이 많이 없고(8GB정도?) 앞으로 아무리 많아도 50GB는 안넘겠다는 생각에 그냥 SATA는 백업용으로만, SSD를 주 HDD로 사용하기로 하였다.
    • 나의 경우는 WAS와 DB서버 이렇게 두 대를 사용하는데, 두대 다 웹 어플리케이션 서버 용도로 설치하였다. (설치시에 옵션이 나옴)
    • 서버용도라서 Gnome은 설치하지 않았다.
    • 이과정에서 NETWORK & HOSTNAME을 한번 눌러주지 않으면 나중에 랜카드가 On되어있지 않아서 수동으로 켜줘야 하니 꼭 클릭을..
  4. SSH 설치
    • 기본적으로 깔려있기는 하나, 보안상의 위험이 있다. (나의 경우는 서버가 켜진 하루만에 약 300건의 로그인 실패 기록이 발견되었다. 22번 포트를 어찌 믿고 사용하리.. ) 
    • sudo vi /etc/ssh/sshd_config 에서 Port 22 를 원하는 포트로 설정. 
    • sudi vi /etc/sysconfig/iptables 에서 -A INPUT -p tcp -m state –state NEW -m tcp –dport 포트번호 -j ACCEPT 추가
    • sudo systemctl reload sshd.service : SSH 재시작
    • sudo service iptables restart : 방화벽 재시작
    • 방화벽 장비 등을 통해 해당 포트를 확실히 열어주고, 외부에서 SSH로 접속이 되는지 확인(Putty 등에서 ssh root@서버IP -p포트번호 로 확인 가능)
  5. 데이터 이관
    • 당연하지만 기존에 있던 데이터를 이관. 나의 경우는 루트에 /data 라는 곳을 하나 둬서 그곳에 두는 편이다.
  6. NginX 설치 + FastCGI + MariaDB 설치
    • 설치
    • 세팅 – PHP연동
      • PHP연동을 위해 좀 삽질했는데, https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-centos-7 이 튜토리얼 따라하는 것이 가장 좋다. (여기서 MariaDB까지 설치까지 참조해서 DB서버에 설치한다.)
      • 이후, /etc/nginx/conf.d/ 안에 각 사이트 세팅별로 .conf파일 생성(아래는 예시)
      • server {
        listen 80;
        server_name localhost;#charset koi8-r;
        #access_log /var/log/nginx/log/host.access.log main;

        location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        }

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        root /usr/share/nginx/html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        # proxy_pass http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
        root /usr/share/nginx/html;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        }

        # deny access to .htaccess files, if Apache’s document root
        # concurs with nginx’s one
        #
        #location ~ /\.ht {
        # deny all;
        #}
        }

      • 서버네임과 Root경로만 바꿔서 사용하면 된다.
      • 중요한 부분은 볼드체 되어있는 부분으로, PHP세팅시 FastCGI를 물리는 부분이다. 
  7. Apache Tomcat 8 설치
  8. Tomcat – NginX 연동
    • 어렵지 않다. http://blog.beany.co.kr/archives/2684 이상훈 님의 글을 확인하고, upstream tomcat 생성 후 각 사이트별 .conf 파일에서 해당하는 사이트를 redirect 한다.
    • 참고로 redirect시 톰켓의 server.xml 에 설정된 <host> 의 name록성과 사이트 명이 일치해야 인식한다.
    • War를 통한 AutoDeploy를 해야하는데 아직 성공하지 못했다.. 안되는 것 같기도 하고.. (흑)
  9. WordPress 이관
    • 아까 파일은 이관해 왔으니 NginX설정 후 접속해 본다. 
    • 여기서 아무페이지도 안뜬다면 WAS서버에 sudo yum install mariadb-server mariadb 했는지 확인한다. (클라이언트가 설치안되서 그런것일지도) 혹은, sudo yum install php-mysql 도 확인한다.
    • “데이터베이스 오류” 가 발생시에는 DB 의 IP가 잘못된것이니 wp-config.php 의 define(‘DB_HOST’, ‘ip주소’); 를 변경. (혹은 계정이라던가..) 정 안되면 DB서버에서 root계정의 외부 원격접속 정책(http://jmnote.com/wiki/MySQL에_원격_접속_허용 참조) 및 방화벽에서 3306 열렸는지 확인한다.
    • 자동업데이트시 SSH 사용 가능하게 : http://lesstif.com/pages/viewpage.action?pageId=21430675 정광섭 님의 글을 확인한다. FTP나 SFTP는 동작 안함. 아니 비추애기도 하다.(보안문제 때문에) 정광섭님 글 중 나의 경우는 SeLinux정책까지는 건들 필요는 없었다. 다만, php-ssh2 설치가 필요했음. http://programster.blogspot.kr/2013/06/centos-64-install-ssh2-extension-for-php.html 이 글을 참조한다.
    • 혹 Themify 테마를 사용한다면, img.php가 동작 안하므로 세팅에서 꺼주는게 좋다.

 일단 여기까지가 내가 세팅해왔던 부분이다. 솔직히 삽질로 따지면 더 많긴 하지만, 일단은 풀타임으로 하루만에 세팅을 끝냈고, 속도 또한 기존에 Page Speed로 측정했을 때 서버응답 시간이 5초이상 나오던 것이 0.4초 정도로 확 줄었다. 물론 아직 운영 초반이라 그런지는 몰라도.. 일단 두고는 봐야겠지만, 마음은 정말 편하다  🙂  뭔가 해킹에서 자유로워진 느낌이랄까..

 다음번에는 요즘 주로 사용하고자 하는 Play Framework 와 socket.io + nodejs를 설치해 보도록 하겠다.