안녕하세요! 지난 포스팅에서 AWS Free Tier를 활용해 EC2와 RDS를 설정하는 과정을 다뤘는데요. 이번에는 Docker, Nginx, WordPress, 그리고 SSL 인증서 발급까지 한 번에 설정하는 과정을 공유해보려고 합니다. AWS Free Tier에서 최대한 비용을 절감하면서 웹서비스를 구축하는 것이 목표입니다. 😊
특히, 이번 포스팅에서는 제 도메인 www.azaza.me에 WordPress 블로그를 직접 셋업한 경험을 바탕으로 진행됩니다. 만약 여러분도 저처럼 저렴한 비용으로 블로그를 운영하고 싶다면 도움이 될 거예요!
1. AWS EC2에 Docker 설치
먼저 EC2 인스턴스에 Docker를 설치합니다. 현재 EC2에서 운영체제로 Ubuntu 24.04.1을 사용하고 있다고 가정하겠습니다.
sudo apt update -y
sudo apt install docker.io -y
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER
설치 후, 현재 쉘에서 로그아웃 후 다시 로그인하면 docker
명령어를 root 권한 없이 사용할 수 있습니다.
docker --version
위 명령어로 Docker가 정상적으로 설치되었는지 확인합니다.
2. Docker Compose 설치
Docker Compose를 사용하면 여러 컨테이너를 쉽게 관리할 수 있습니다. 다음 명령어를 실행하여 설치합니다.
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
Docker Compose가 정상적으로 설치되었는지 확인하세요.
3. docker-compose.yml
파일 생성
SSL 설정되지 않은 초기 버전의 docker-compose.yml은 다음과 같습니다. 이 yml 파일은 SSL 인증서 발급 후 수정이 필요합니다.
services:
wordpress:
image: wordpress:6.7.2-php8.1-fpm-alpine
container_name: wordpress_fpm
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
volumes:
- ./wp-data:/var/www/html
deploy:
resources:
limits:
memory: 512M
cpus: "0.5"
restart: always
nginx:
image: nginx:alpine
container_name: nginx_server
ports:
- "80:80"
- "443:443"
volumes:
- ./wp-data:/var/www/html
- ./nginx-config:/etc/nginx/conf.d
depends_on:
- wordpress
restart: always
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/www:/var/www/certbot
- ./certbot/conf:/etc/letsencrypt
depends_on:
- nginx
command: certonly --webroot --webroot-path=/var/www/certbot --email your@email.address --agree-tos --no-eff-email -d azaza.me -d www.azaza.me
WORDPRESS_DB_HOST, WORDPRESS_DB_NAME, WORDPRESS_DB_USER, WRODRPESS_DB_PASSWORD 값은 .env에서 관리하면 됩니다.
4. Nginx 설정 (default.conf)
아래는 Nginx default.conf
설정 파일입니다. HTTPS는 HTTP 구동을 확인하고 셋업을 진행했습니다. SSL 인증서 발급 후 수정이 필요합니다.
server {
listen 80;
server_name azaza.me www.azaza.me;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
allow all;
}
location / {
default_type text/plain;
return 200 "Hello Azaza";
}
}
5. SSl 인증서 발급 받기
아래 명령어를 실행하여 certbot이 SSL을 발급할 수 있게 합니다. certbot 컨테이너를 실행하면 설정한 volume에 인증서가 마운트됩니다.
docker-compose up -d
6. docker-compose.yml nginx 컨테이너 ssl 설정 추가
먼저 Nginx 컨테이너를 종료시켜 줍니다.
docker-compose down nginx
그리고 docker-compose.yml
파일의 Nginx 서비스 블록에 아래 코드를 추가합니다.
services:
wordpress:
image: wordpress:6.7.2-php8.1-fpm-alpine
container_name: wordpress_fpm
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
volumes:
- ./wp-data:/var/www/html
deploy:
resources:
limits:
memory: 512M
cpus: "0.5"
restart: always
nginx:
image: nginx:alpine
container_name: nginx_server
ports:
- "80:80"
- "443:443"
volumes:
- ./wp-data:/var/www/html
- ./certbot/www:/var/www/certbot #추가!!!
- ./certbot/conf:/etc/letsencrypt #추가!!!
- ./nginx-config:/etc/nginx/conf.d
depends_on:
- wordpress
restart: always
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/www:/var/www/certbot
- ./certbot/conf:/etc/letsencrypt
depends_on:
- nginx
command: certonly --webroot --webroot-path=/var/www/certbot --email seokieys@gmail.com --agree-tos --no-eff-email -d azaza.me -d www.azaza.me
Nginx volume에 certbot 인증서 관련 파일을 마운트합니다.
7. nginx conf에 ssl 적용하기
이제 Nginx에 발급받은 SSL 인증서를 적용하고 http에 대한 호출을 https로 Redirection 설정을 추가합니다.
server {
listen 80;
server_name azaza.me www.azaza.me;
return 301 https://www.azaza.me$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name azaza.me;
ssl_certificate /etc/letsencrypt/live/azaza.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/azaza.me/privkey.pem;
location / {
return 301 https://www.azaza.me$request_uri;
}
}
server {
listen 443 ssl;
http2 on;
server_name www.azaza.me;
ssl_certificate /etc/letsencrypt/live/azaza.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/azaza.me/privkey.pem;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass wordpress_fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_keep_conn on;
}
location ~ /\.ht {
deny all;
}
}
8. docker 재시작
다음과 같은 커멘드를 사용하여 docker를 다시 시작하면 모든 설정이 완료되고, 사용하는 워드프레스에 https를 사용할 수 있게 됩니다.
docker-compose up -d
6. 마무리
이제 AWS Free Tier에서 Docker, Nginx, WordPress, 그리고 SSL 인증서까지 적용한 웹 서비스를 구축했습니다. 🎉
요약
- EC2에 Docker와 Docker Compose 설치
docker-compose.yml
을 활용해 WordPress (FPM), Nginx, Certbot 실행- Nginx에 80포트로 certbot을 이용한 SSL 인증서 발급
docker-compose.yml
에 Certbot 인증서를 Nginx에 마운트- Nginx
default.conf
설정을 통해 HTTPS 리디렉션 및 PHP-FPM 처리 구성
이 모든 과정은 www.azaza.me 블로그를 직접 운영하면서 겪은 경험을 바탕으로 정리한 것입니다. 지난 포스팅에서는 EC2와 RDS 설정을 다뤘고, 이번에는 WordPress와 관련된 설정을 중점적으로 소개했습니다. 저와 같은 가난한(?) 개발자분들께 유용한 정보가 되었으면 좋겠네요! 앞으로도 AWS Free Tier를 최대한 활용하는 방법을 계속 공유할 예정이니 많은 관심 부탁드립니다! 🚀