Categories
AWS

AWS Lightsail에 Docker 설치하고 WordPress 운영하기(feat. Let’s Encrypt)

원래 집에서 운영하던 서버가 Docker에 MySQL, WordPress, Nginx 컨테이너를 사용하여 운영하였으므로 Lightsail에도 똑같이 셋팅해보았다. 역시 CMS는 WordPress지!

AWS Lightsail 인스턴스 생성

Lightsail의 인스턴스 생성기능을 사용하면 WordPress가 미리 설치된 블루프린트를 제공하지만 나는 WordPress외에도 개인적인 서비스들을 운영할 생각이므로 Docker를 설치하고 그 위에 WordPress를 운영하기 위해 OS 전용 블루프린트 중 내가 사용하기 편한 Ubuntu 18.04 이미지를 선택했다.

서버에 접속하기 위한 SSH 키도 적절히 설정한다.

AWS Route53 연결

Lightsail 인스턴스를 생성하고 실행이 완료되었다면 퍼블릭 IP를 할당 받는다. 기본 설정으로는 동적 IP를 부여 받으므로 이것을 고정 IP(무료인 것 같다.)로 변경하고 가지고 있는 도메인에 연결한다. Lightsail에도 DNS를 제공하는 것 같지만 나는 Route53을 더 선호하기 때문에 Route53에 DNS 영역을 생성하고 네임서버를 연결한다.

Route53에 레코드를 추가할 때 지원되는 AWS 서비스는 Alias로 추가하는 것이 좋지만 Lightsail 인스턴스는 Route53에서 Alias로 연결할 수 없는 것 같다. 그래서 고정 IP를 부여했고 해당 IP를 DNS 영역에 A 레코드로 연결했다.

Lightsail에 Docker 설치

Docker 설치는 공식 문서(Install using the repository)를 참고했다.

1. apt 패키지 인덱스 업데이트

2. apt가 https를 통해 저장소를 사용할 수 있도록 패키지 설치

3. Docker 공식 GPG 키 추가

4. Docker stable 저장소를 추가

x86_64 / amd64 아키텍처를 선택한다.

Docker에 Certbot 사용해서 인증서 발급

https 프로토콜을 사용하기 위해 Certbot을 사용해서 Let’s Encrypt 인증서를 발급 받아서 사용한다. CloudFront 같은 것을 사용하면 인증서 갱신 신경 쓸 필요 없이 아마존 인증서를 사용할 수도 있지만 지금은 무료 인증서를 사용하기로 했다.

명령어의 환경변수나 이메일 값은 자신의 환경에 맞는 값으로 설정한다.

Docker에 MySQL 5.7 실행

WordPress에서 사용하기 위한 데이터베이스 컨테이너를 실행한다. Lightsail의 관리되는 데이터베이스를 사용해도 무방하다.

자신의 환경에 맞는 환경변수 및 인자 값을 설정한다.

참고로 앞으로 실행할 컨테이너가 모두 동일한 네트워크에 있어야 호스트 이름 검색이 가능하다.

Docker에 WordPress 실행

데이터베이스가 준비되었으면 WordPress 컨테이너를 실행한다.

자신의 환경에 맞는 환경변수 및 인자 값을 설정한다.

Docker에 Nginx 실행

이제 인증서, 데이터베이스, 워드프레스 컨테이너가 모두 준비되었다면 외부에서 접속하기 위해 리버스 프록시 역할을 할 Nginx 컨테이너를 실행한다.

외부로 공개될 포트의 설정과 Let’s Encrypt로 받아온 인증서를 마운트해서 사용한다.

Nginx의 설정은 각자의 환경에 맞게 설정하고 systemd를 사용하여 각 컨테이너가 시스템이 재부팅되어도 실행되도록 설정하면 관리가 수월해진다.

외부에서 접속이 되지 않을 때에는 Lightsail의 방화벽을 확인하고 DNS 설정을 확인해 보면 좋다.

또한 Lightsail의 가장 저렴한 인스턴스의 경우 메모리가 매우 적으므로 컨테이너 실행에 문제가 있을수 있는데 인스턴스 타입을 올리지 말고 그냥 swap을 추가하여 해결했다. 개인 서버에는 이 정도면 충분하다.