워드프레스 uploads 폴더를 aws S3으로

아마존 웹서비스(aws)와 워드프레스(WordPress)의 궁합에 대한 개인 후기를 공유해 봅니다.

작업한 웹사이트는 한국인을 대상으로 한 인터넷 강의 웹사이트(LMS)였고, 작업의 핵심은 서버를 도쿄 리전에서 서울 리전으로 옮기고, lapm 웹서버에서 모든 것을 처리하던 기존 방식에서, aws EC2 + RDS + S3으로 분리하여 재구성하는 것이었습니다. 개인적으로 이 궁합이 비용과 안정성에서 aws와 WordPress의 가장 좋은 궁합이라 판단합니다. autoscale과 cloudfront만 붙이면 이후에 서버 확장이 간편해 지고요.

  • EC2 : ubuntu 16기반의 apache2, php7.0, mysql-client, sendmail , ssl… 등
  • RDS : mysql 5.6
  • S3 : 워드프레스의 uploads 폴더를 S3으로

 

aws 도쿄 리전에서 서울 리전으로 서버 이전

먼저 도쿄 리전에 있는 서버를 서울 리전으로 이사했습니다.  2016년 1월에 aws 서울 리전이 발표되면서 더이상 서버를 도쿄 리전에 둘 필요가 없어졌습니다. aws 서버 이전에 대한 내용은 아래의 포스트를 참고하였습니다. 다만 저는 일일이 수동으로 세팅하고 이전하였습니다.

 

aws와 WordPress의 새 궁합

이번 작업의 핵심은 EC2에 웹서버 세팅하여 워드프레스를 두고, db는 aws RDS로 분리하고, 워드프레스의 uploads 폴더는 aws S3에 저장하는 것입니다.

(1) 도쿄 리전 백업

파일 백업과 DB 백업이며 방법은 생략합니다.

(2) 서울 리전 ec2, rds, s3 설정

Ec2의 OS는 ubuntu 14버전에서 16버전으로 바꾸었고, php도 5.6에서 php7.0으로 버전업하였습니다.  체감상 속도 향상이 느껴집니다.  각각의 설정 방법은 구글링하면 많이 나오므로 생략합니다. 몇가지 확인할 사항은…

  • ec2 웹서버 세팅시 mysql은 mysql-server는 설치하지 않고 mysql-client만 설치하며.
  • RDS 설정시 문자셋 utf8mb4(또는 utf8)를 설정한 Parameta Group을 추가 적용하고, rds 접속을 위한 security group을 확인하고.
  • S3 설정시 s3사용 권한만 있는(AmazonS3FullAccess) s3 전용 사용자 추가를 권장하고, 과정에서 생성되는 access key도 꼭 다운받아 두시고요. 당연히 사전 지식으로 IAM 사용법이 필요합니다.

 

작업한 웹사이트는 특정 시간대에는 접속가가 거의 없지만, 학원이 시작되는 저녁에 접속자가 폭주합니다. 따라서 autoscale로 자동 서버 증설과 축소를 계획하였습니다. 이 과정에서 함께 고려했던 것이 Elastic Beanstalk으로 구성하는 방법이었는데 이는 장단점이 동시에 존재하는듯 합니다.

워드프레스는 업데이트가 자주 있고 특히 플러그인 등의 업데이트마다 버전 관리가 필요한데 작은 사이트의 관리자에게는 오히려 번거로운 작업이 되는듯 합니다. 중대형 사이트라면 자체 개발자가 있을 것이고 그렇다면 차라리 Git 등을 활용한 버전관리가 더 적합하지 않나 생각됩니다.

그럼에도 elastic beanstalk은 충분히 고려할만한 좋은 선택이라는 점은 동의합니다. 아래 관련 링크입니다만, 꼭 그대로 하기보다는 aws를 어느정도 익숙한 분이라면 응용의 실마리가 될거라 생각됩니다.

(3) uploads 폴더를 S3으로

일부 문서는 w3 total cache 플러그인을 제안했는데, 2017년 6월 현재 아래 2가지 플러그인이 정답입니다.

플러그인 세팅 방법은 구글링으로 대체합니다. 위에서도 생략했습니다만 s3 사용권한을 가진 사용자의 access key가 필요합니다.

 

기존의 uploads 폴더를 S3으로

이전을 잘 마쳤습니다. 이제 남은 일은 이미 운영되던 웹사이트라서 전부터 쌓여있는 uploads 폴더를 s3으로 옮기는 작업만 남았습니다.

wp offload s3 lite는 플러그인을 설치한 이후에 추가되는 미디어 파일만 s3으로 저장 또는 (설정에 따라) 복사합니다. 기존 파일을 옮기려면 Pro버전을 구매해야 하는데 wp offload s3 Lite 무료 버전으로 기존 uploads 폴더의 파일을 s3으로 옮겨 보겠습니다.

첫번째 방법은 단순 무식하게 수동으로 직접!! 파일이 많지 않다면 이미지 등의 미디어를 수동으로 다시 업로드하는 방법입니다. ^^;; 수동이라는 의미는 워드프레스 포스트에서 이미 업로드된 이미지를 다시 업로드하라는 의미입니다. 하지만 파일이 수 백 수 천개라서 수동으로 하기 힘든 경우라면?

두번째 방법은 순서대로 적어보면…

(1) wp offload s3 lite의 설정을 보면 [Path] 부분에 설정한대로 S3의 버킷에 폴더가 만들어졌을 겁니다.

 

(2) 기존 /uploads/ 이하의 폴더를 S3 버킷의 설정한 폴더로 직접 업로드합니다. s3 brower 등의 툴로  마치 ftp와 같은 화면으로 s3에 직접 업로드할 수 있습니다.

 

(3) 데이터베이스를 수정합니다. (DB 백업은 필수!!)

이제 mysql 워드프레스 데이터베이스의 wp_posts 테이블의 post_content 에 있는 href 와 src 값을 변경합니다.

console에 직접 접속하거나 MySQL Workbench 등을 활용합니다.

mysql -h myinstance.123456789012.us-east-1.rds.amazonaws.com -P 3306 -u mymasteruser -p

아래를 참고하여 실행합니다.

UPDATE wp_posts SET post_content = replace(post_content, 'href="http://UR-SITE/wp-content/uploads/', 'href="http://aws-bucket-URL/wp-content/uploads/');
UPDATE wp_posts SET post_content = replace(post_content, 'src="http://UR-SITE/wp-content/uploads/', 'src="http://aws-bucket-URL/wp-content/uploads/');

 

(4) 위의 (3)번 과정에 도움이 되는 script를 외국 개발자 TJ Nevis가 공개하였기에 소개합니다.

해당 파일을 wp-config.php 파일이 있는 폴더에 업로드하여 실행하면 됩니다.(http://UR-SITE/S3FixExistingMedia.php)

변경 값을 다시 원상태로 되돌리려면 ?remove=ture로 재실행하면 됩니다.(http://UR-SITE/S3FixExistingMedia.php?remove=true)

확인 후 S3FixExistingMedia.php 파일은 삭제합니다.

 

이제 uploads 와 하부 폴더는 모두 S3에 위치합니다. 마지막으로 wp offload s3 lite 설정에서 [Advanced Options] – [Remove Files From Servere] 를 on으로 할지 off로 할지 결정하십시오. 기본값인 off로 그대로 두면 업로드된 파일은 ec2에서 s3으로 복사가 되지만 실제는 s3에 있는 파일로 링크 됩니다.

이상의 설정에 더하여 CloudWatch에 요금 알람을 만들고 Ec2의 cpu 알람을 만들고, RDS의 메모리 사용 알람을 만들었습니다. 이제 클라이언트는 스마트폰의 AWS Console 앱을 이용하여 서버를 실시간으로 모니터링하게 하였습니다.

 

Leave a Reply