wordpress를 aws로 옮겨보자
매번 이사때마다, 짐 쌀 때는 서버를 제일 마지막에 챙기고 짐 풀 때는 서버 먼저 꺼내서 구동하는 식으로 해왔었다. 그런데 이번에는 보관이사를 짧지 않은 기간동안 해야하는데 이 동안 블로그가 내려가있는게 썩 내키지 않아서 보관 기간 동안 만이라도 저 사양으로 운영하려고 찾아보니, aws 프리티어로 워드프레스 정도는 충분히 운영이 가능한 조합이 있었다.
ec2, efs, rds 이 세 가지 서비스를 free tier 에서 제공하는 사양으로 생성하면 다음과 같다.
1. ec2 (t2.micro)
- x86 1 cpu
- 1GB mem
2. efs
- 5GB
3. rds (db.t2.micro)
- 20GB
텍스트 위주의 컨텐츠들이어서 차고 넘치는 용량이고, 하루 200명 남짓한 트래픽을 받아 내기에도 충분하다. 라즈베리 파이는 고사양이었다.
다음과 같은 아키텍처로 조합해서 써보니 충분하다.
금융 서비스도 클라우드로 올라가는 요즘같은 세상에 워드프레스 하나 때문에 이 난리를 치는건 좀 아닌 것도 같고 이 참에 aws 로 아예 넘어가는 것도 좋을 것 같다. 과금 정책은 다시 확인 해봐야겠다.
docker 설정
Dockerfile
기존 운영중이던 5.6.2
버전을 베이스로 해서 ssl 을 활성화 해주고, 기존 운영 소스를 활용할 예정이므로 초기 템플릿은 제거해준다.
FROM wordpress:5.6.2
RUN apt-get install openssl \
&& a2enmod ssl \
&& a2enmod rewrite \
&& rm -rf /var/www/html/*
EXPOSE 80 443
docker-entrypoint.sh
기존 entrypoint 스크립트에서 초기 템플릿을 로드하고 데이터베이스를 생성해주는 단계를 제거했다.
#!/bin/bash
set -euo pipefail
# usage: file_env VAR [DEFAULT]
# ie: file_env 'XYZ_DB_PASSWORD' 'example'
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
file_env() {
local var="$1"
local fileVar="${var}_FILE"
local def="${2:-}"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
exit 1
fi
local val="$def"
if [ "${!var:-}" ]; then
val="${!var}"
elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")"
fi
export "$var"="$val"
unset "$fileVar"
}
if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then
if [ "$(id -u)" = '0' ]; then
case "$1" in
apache2*)
user="${APACHE_RUN_USER:-www-data}"
group="${APACHE_RUN_GROUP:-www-data}"
# strip off any '#' symbol ('#1000' is valid syntax for Apache)
pound='#'
user="${user#$pound}"
group="${group#$pound}"
;;
*) # php-fpm
user='www-data'
group='www-data'
;;
esac
else
user="$(id -u)"
group="$(id -g)"
fi
for e in "${envs[@]}"; do
unset "$e"
done
fi
exec "$@"
docker-compose
3개월마다 갱신해줘야하는 let’s encrypt 인증서랑 웹 리소스들을 persistent volume 으로 처리한다.
version: "3"
services:
wordpress:
image: wordpress:oboki
ports:
- "80:80"
- "443:443"
restart: always
environment:
WORDPRESS_DB_HOST: yourdbhost.rds.amazonaws.com:3306
WORDPRESS_DB_USER: yourdbuser
WORDPRESS_DB_PASSWORD: yourpassword
WORDPRESS_DB_NAME: yourdbname
volumes:
- ./data/html:/var/www/html
- ./cert.pem:/etc/ssl/certs/ssl-cert-snakeoil.pem
- ./privkey.pem:/etc/ssl/private/ssl-cert-snakeoil.key
- ./default-ssl.conf:/etc/apache2/sites-enabled/default-ssl.conf
- ./docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh
permalink 설정
.htaccess
파일이 생성돼있지 않아서 기존에 설정돼있던 고유링크가 제대로 동작하지 않는 경우가 있는데 이때는 data 경로의 소유권을 www-data
로 변경해주었는지 확인해보고, wordpress > 설정 > 고유주소 에서 기본값으로 돌렸다가 다시 기존 고유링크 설정을하면 정상적으로 적용된다.