늘모자란, 개발

늘모자란, 개발


서버에서 도커를 사용해 DB 컨테이너를 운영하고 있는데, 업데이트를 진행 후 컨테이너에 들어가 mysql 을 작동하니 다음과 같은 에러를 내며 동작하지 않는다

mysqld: error while loading shared libraries: libaio.so.1: cannot stat shared object: Permission denied


읽기쓰기 권한을 확인해봐도 제대로 설정되있고 문제가 될 부분이 없어서 한참을 헤매는데 docker의 privileged 를 끄면 된다고 한다. 혹은 devicemapper 를 설정하거나..
그런데 이건 이미지에 커밋 후 컨테이너를 다시 만들고 인자를 줘서 다시 실행해야하는 매우 번거로운 작업을 해야해서 고민에 빠져있었다.

참고:
https://github.com/docker-library/mysql/issues/133
https://stackoverflow.com/questions/32353055/how-to-start-a-stopped-docker-container-with-a-different-command
http://ongamedev.tistory.com/entry/%EC%8B%A4%ED%96%89%EC%A4%91%EC%9D%B8-%EB%8F%84%EC%BB%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%97%90-%EC%B6%94%EA%B0%80-%ED%8F%AC%ED%8A%B8-%EC%98%A4%ED%94%88%ED%95%98%EA%B8%B0


그런데 여러 글들을 읽다보니 apparmor 라는게 자주 나온다. 이름만 봐도 뭔가 보호 하는 느낌이라 찾아보게 되었다.
결론부터 말하자면 도커 설정은 건드릴필요없다.

호스트에 apparmor 가 설정되어 있을건데 다음 링크를 참고해 disable 하면 설정변경없이 그냥 실행된다.........................
https://support.plesk.com/hc/en-us/articles/213909965-How-to-disable-AppArmor
2018/01/06 11:30 2018/01/06 11:30
카페24 가상 서버(VPS)를 쓰고 있는데, 아무래도 쉐어드(Shared) 서버이다보니 자원을 공유하고 있고 내가 자원을 자꾸 드레인하고 있다는 말을 전달 받았다.
사실 말이 전달이지 먼저 차단하고 알아볼 수가 없게 해놓은 구조이다. 불평해도 개선을 안하니 몇마디 했더니 자꾸 이런식으로 서비스 하면 나가야된대서 짐싸겠다고 했다.

사실 무조건 내가 손해다. 카페24정도 규모에 딱 맞춰 서비스 하고 있었는데 별수가 있나. 서비스를 아홉시간씩 못하고 그러는데 (물론 그 시간에 엄청난 수익이 창출되진 않는다. 보통 주말 12시쯤에 맥시멈을 찍는거 같다). 하지만 서비스를 유지 못시켜준다는 협박을 듣고 어떻게 서비스를 하고 있나 무서워서. 결국 서버를 옮기기로 작정한김에, 옛날에 알아본대로 그냥 일사천리로 진행하기로 했다.

명령어들같은건 문제가 있었던 부분만 기재하였다

서버

내가 타겟팅 한 서버는 두개였다
하나는 통큰아이, 하나는 AWS 한국 리전 이었다
통큰아이는 옛날부터 보고 있었던거고 (반 임대식으로 서버 소유권을 나중에 주는 상품을 눈여겨 보고 있었는데 사라졌다), AWS는 이번에 한국에 리전이 생겨서 관심있었다.

친구에게 물어보니 AWS의 단점은 그냥.. 비싼거라고 했고 나머진 다 괜찮다고 했으나, 이왕 사는김에 완전히 독립된 서버를 확보 해놓자는 생각을 하게 됐다. 결국 통큰아이의 i7 서버를 구매. (제온을 하진 않았는데 제온도 괜찮을것 같다)

홈페이지가 좀 구식이라 신청도 힘들었다.
견적서 내는건 쉽지만 자동이체 문서를 내라는데 그냥 기타 라고만 나와있어서 문의를 하는 우여곡절까지..
자기 정보 관리에서 자동이체를 누르면 문서가 있다. 링크는 여기니까 헤매지말고 바로 결제할 수 있도록 하자.
(사실 좀 생소했던게 자동이체 관련해서 문서를 써서 메일이나 팩스로 줘야한다. 이런건 또 처음이라..)

문서를 보내주고, 돈을 입금하면 세팅에 들어가게 된다.
파티션을 LVM으로 하나처럼 해달라고 했는데 그건 어렵단다. (처음엔 해준다고 했는데 ㅠ_ㅠ)
세팅되면 문자로 안내가 오고, 메일로 아이디 비밀번호가 발송된다.
콘솔뿐이지만 가상서버와는 다른 아주 쾌적한 속도.. (사실 아무것도 없어서..

루트 패스워드를 바꿔주고 루트로 로그인하려니 루트 로그인이 안된다고 한다.
세팅하는데 대부분 루트권한이 필요하기때문에 요렇게 바꿔주고, 나중에 돌리기로 한다.

웹서버

PHP 서버를 돌리고 있으니 Apache를 하기로 한다. nginx 도 좋다곤 하지만 htaccess 설정을 새로 배우기 귀찮아서 그냥 Apache로 하기로 한다. 2.4.18 버전이 현재 나왔으나 Ubuntu 14.04 의 Apache는 2.4.7이 기본이다. 내 상식선에서 2.4.10에서 꽤 많은게 바뀌는걸로 아는데 아직도 2.4.7인걸보고 PPA를 사용하기로 한다.

PPA를 이용해 아파치를 깔았는데 http2를 지원해보고 싶어졌다.
대세라고 했는데, 이때까지만 해도 http2 가 반드시 SSL을 요구하는줄 몰랐다 -_-;
크롬으로 플러그인까지 깔아가면서 되나 확인했지만... 다들 나같은 삽질은 하지말길 바란다....
아파치로 http2를 지원하기위해선 mod_http2를 사용하면 되고, 이렇게 세팅해주면 된다.
다만 새 서버에 인증서가 없기때문에 어떻게 테스트는 못해봤다. 삽질만 실컷하다가 나중에 인증서는 LetsEncrypt를 사용하기로 생각하고 다시 세팅에 신경을 쓰기로 했다.

일반적으로 apt-get 으로 apache를 설치하게 되면 prefork 로 설치되기때문에 /etc/apache2/apache.conf에 서버 리밋을 잔뜩 늘려줬다.
 <IfModule prefork.c>
      StartServers 20
      MinSpareServers 100
      MaxSpareServers 100
      MaxClients 500
      ServerLimit 500
      MaxRequestsPerChild 0
 </IfModule>

PHP

다음은 PHP를 깔아줘야했다. 아시다시피, PHP7이 release 되었다
새 서버에서는 좀 삽질을 해도 PHP7을 써보고 싶었다. 그렇게 빨라졌다는데..
역시 같은 아저씨가 만든 PPA를 사용해서 설치했다. (memcached까지 같이 설치해줬다.)
설치는 apt-get install php7.0 이런식으로 해야하고, 부가적으로 php7.0-mysql / php7.0-dev(안깔면 phpize가 안된다)를 깔아줬다.
phpinfo()를 돌려보니 잘되는거보고 github에서 소스를 내려받아 돌려봤다. 될리가 없다...

문제는 두개로 생각했다.
하나는 redis, 하나는 mysql 인데.
redis는 phpredis 라이브러리를 사용하고 있었는데 양덕들이 phpredis-php7 브랜치를 만들어놓고 있었다.
똑같이 설치하고, php.ini 에 extension=redis.so 적어주는걸로 해결. 문제는 mysql이었다.

php7.0에서 mysql_connect와 같은 일반 mysql 함수를 모두 삭제해버린것이다...
PDO를 사용해서 prestmt를 진작 사용했어야했는데 귀찮음이 낳을 결과였다... 일단 당장 사용할수가 없게 되버렸기때문에...
서버 세팅을 잠깐 접어두고 모두 pdo로 고쳐야했다 ㅠㅠ... 욕을 얼마나 했는지... 귀찮다고 막 코딩하지 말자.............ㅠㅠ
만들면서 느낀점은 sql 을 처리하는 부분을 통일해서 처리해야겠다는것이다. 그리고 왜 프로시저를 쓰는지도 이제 이해했다... 빠른게 문제가 아니고, (거의 이런 대규모 수정은 일어나지 않겠지만) 수정할때 너무나 불편하기 때문이다........................

eregi 같은 패턴 검사도 deprecated에서 완전히 removed되었다. 꼼꼼히 참고 안하면 에러를 마주할 수 있다.

MYSQL

mysql은 처음엔 옮길생각이 없었는데 웹서버가 너무 빠르다보니 잦은 질의로 인해 DB서버가 죽을려고 해서 결국 옮기려는 계획을 세웠다. 다만 기존엔 5.6을 썼는데 이번엔 5.7로 세팅해보기로 했다. download 에 들어가면 각 운영체제 버전별로 deb를 받을 수 있게 되어 있는데 나는 ubuntu 14.04 이기때문에 요녀석을 받아 설치했다. 공식 PPA라고 생각하면 되겠다.
dbkg -i *.deb(mysql 5.7을 선택하고 Apply)
apt-get update
apt-get install mysql-server
하면 아주 간단하게 설치가 완료된다.  자세한 세팅은 알아서 하자.

덤프하는게 문제였는데, 옛날엔 replication을 구성해서 썼었으나 이젠 이원화되있던 서버를 불러들이고 가상서버를 정리해야하는 과정이었기때문에 어떻게 해야 최대한 서비스에 지장이 없을까 고민을 좀 했었다.
리얼타임으로 한 로우씩 불러와서 인서트 해주는 방법을 생각해봤는데 그냥 mysqldump를 이용하고 wget으로 sql을 불러와 넣는 방법을 생각했다. 나같은경우는 바로 데이터베이스 서버를 옮긴게 아니라서 서비스를 유지하고 있었다.
mysqldump -A -u{ID} -p > data.sql
wget {server}/data.sql
mysql -u{ID} -p < data.sql
약 7기가정도의 sql파일이 만들어졌고 이를 당겨와서 인서트했다.
물론 데이터 유입은 차단했다. 약 30분정도의 갭이 발생했으나 작업시간이 새벽 다섯시~여섯시쯤이라 거의 유실은 없었다.
이후에 웹서버가 바라보는 mysql 서버를 localhost로 수정해주는것으로 아주 쉽게 작업이 끝이났다.

mysqltuner를 이용해서 권장해주는 설정대로 세팅했다. 24시간이 걸리지만 일단은 그냥 설정했다. 추후에 설정하고..
다만 쿼리가 5.6에서 돌아가는것과 5.7에서 돌아가는게 조금 달라서 (정렬쪽에서) 이는 나중에 수정해주기로 했다.

nodejs

노드를 쓰기때문에 노드를 깔아줘야했다. 노드는 5.4.1이 현재 stable이고 lts로 4버전대가 형성되어 있다.
이왕하는김에 최신버전으로 도배를 하기로 했고 다음명령어를 통해 최신버전으로 깔아주었다. (관리는 npm이 편하다)
sudo npm cache clean -f
sudo npm install -g n
sudo n stable
sudo npm install forever
forever까지 설치해줘서 준비 끝!
(그 외 필요한 모듈은 그냥 npm에서 설치해준다.)

mysql 데이터를 connection pool 해서 사용하는데 이후에 수정해주었다.

crontab

크론 서비스들도 옮겨줘야했다. 꽤 많이 등록되있기때문에 까먹으면 안됐다.
나의 경우 crontab은 대부분 wget으로 어떤 페이지를 호출하는 역할을 많이 담당하기때문에 우선은 옛날서버에서 데이터를 다 받아와야했다. 주 서비스들은 당연히 git으로 관리되고 있지만 그외엔 ftp로 일일히 다받아야했다. 지져스 (당연히 메인소스 외의 기능들은 막아놔야했고 소스코드도 PDO로 고쳐야했다. 정말 후회막심이다..)

또한 옛날엔 파이썬을 몰라서 php로 크론을 작성했었는데, 파이썬이 제대로 돌아가는지 확인해야했다.
대표적으로, 파이썬을 막 설치해서 python-mysqldb 를 설치해줘야했다. (pip인줄알았다. 설치한지 너무 오래되서..)

DNS

이제 본격적인 삽질에 돌입할 차례이다.
호스팅업체들은 대부분 네임서버를 따로 두어 아주 쉽게 할 수 있으나 나는 서버가 그냥 박혀 있는 상태이기때문에 DNS를 제공하는 네임 서버도 내가 만들어야했다. 도메인은 내가 관리하고 있는게 아니라, 대신 질러준 펭귄 이 관리하고 있어서 같이 합을 맞추며 작업했다.

bind9를 설치하고, zone을 만들어줘야하는데 이 설정이 보통 귀찮은게 아니다
여러군데 많이 참고 했으나 가장 많이 참고한 DigitalOcean 의 글이 가장 도움되었던거 같다.
DNS 작업은 내가 잘한다고 바로 반영되는게 아니기때문에 약간 시간과의 싸움이다. 인내를 가지고 기다리자ㅠㅠ
그래도 DNS는 그나마 쉽게 적용되었다. 수없이 많은 ipconfig/flushdns 이후에 되는거보고 환호성을 지른것 같다. (잘 따라하면 된다..)

다만 나는 ip가 한개이기때문에 약간 제약이 있다.
네임서버는 (왠만하면) 두개의 아이피로 구성되어야한다. (ex, ns.fantazm.net / ns2.fantazm.net)
하지만 권장이지 반드시 따라야되는건 아니기때문에 알아만 놓자. 나같이 아이피가 딱 한개인사람은 별 수가 없다.

다만 MX가 정말 골치였는데 표기되는데 너무 아리송하게 표기되어서 고생했다
MX는 진짜 반영이 잘 안되는데, 여기서 시킨대로 설정하면 된다. 다만 alt1.l.google.com.@domain 이런식으로 뜨는데 실제로는 안붙여도 된다.
여전히 CNAME은 잘 안되고 있는데 큰 문제는 아니라 넘어가기로 했다. 여기서 시간을 어마어마하게 까먹었다...

우여곡절끝에 요렇게 서버 세팅이 마무리되었다.
자잘자잘한 문제는 알아서 수정하고, 큼지막한 줄기만 적어봤는데 누군가에겐 도움이 되길 바라며~
2016/01/19 16:41 2016/01/19 16:41