이 블로그는 AWS Lightsail 서울 리전의 Ubuntu 24.04 서버에 워드프레스를 직접 올려 운영하고 있습니다. Lightsail에는 워드프레스가 미리 설치된 이미지(Bitnami)도 있지만, 구조를 직접 알고 관리하고 싶어서 빈 Ubuntu에 Nginx · MariaDB · PHP 8.3을 하나씩 설치했습니다. 인스턴스 생성부터 HTTPS 적용까지, 실제로 진행한 순서대로 정리합니다.
결론
- Lightsail $7 플랜(1GB 메모리)의 Ubuntu 24.04로 워드프레스 블로그 운영이 가능합니다.
- 인스턴스를 만든 뒤 고정 IP를 먼저 붙이고, 그 IP로 도메인 A 레코드를 등록해야 합니다. 처음 받은 IP는 재시작하면 바뀔 수 있습니다.
- 방화벽에 HTTPS(443)를 직접 추가해야 합니다. 기본 규칙은 SSH(22)와 HTTP(80)뿐입니다.
- Let’s Encrypt 인증서는 DNS가 새 IP로 바뀐 것을 확인한 뒤 발급해야 실패하지 않습니다.
환경
| 항목 | 내용 |
|---|---|
| 서버 | AWS Lightsail, 서울 영역 A (ap-northeast-2a) |
| 플랜 | 월 $7 · 1GB 메모리 · vCPU 2개 · SSD 40GB · 전송 2TB |
| OS | Ubuntu 24.04 LTS (OS 전용 이미지) |
| 웹 서버 | Nginx 1.24.0 (Ubuntu 기본 저장소) |
| DB · PHP | MariaDB (Ubuntu 기본 저장소) · PHP 8.3-FPM |
| 인증서 | Let’s Encrypt (Certbot) |
| 도메인 · DNS | whein.xyz · 호스팅케이알 DNS |
1. Lightsail 준비 (콘솔)
인스턴스 만들기
- Lightsail → 인스턴스 생성 → 리전 서울, 영역 A
- 플랫폼 Linux/Unix → 블루프린트 운영 체제(OS) 전용 → Ubuntu 24.04 LTS
- 네트워크 유형 듀얼 스택, 플랜 월별 $7 선택 → 인스턴스 이름 입력 → 인스턴스 생성

$5 플랜(512MB)은 워드프레스와 MariaDB를 함께 돌리기에 메모리가 빠듯하므로 1GB 이상을 권합니다.

고정 IP 붙이기
- 인스턴스 → 네트워킹 탭 → 고정 IP 연결 (또는 Lightsail 홈 → 네트워킹 → 고정 IP 생성)
- 이름을 정하고 방금 만든 인스턴스에 연결합니다.
고정 IP는 인스턴스에 연결해 두는 동안에는 따로 요금이 붙지 않습니다.
방화벽에 HTTPS(443) 추가
- 인스턴스 → 네트워킹 탭 → IPv4 방화벽 → 규칙 추가
- 애플리케이션 HTTPS 선택 → 생성 (IPv6 방화벽에도 같은 규칙이 있는지 확인)

도메인 연결 (DNS A 레코드)
- 도메인 업체 DNS 관리(저는 호스팅케이알)에서 A 레코드 2개를 고정 IP로 등록합니다.
- 호스트
@→ 고정 IP, 호스트www→ 고정 IP

2. SSH 접속
인스턴스 화면의 기본 키 다운로드로 받은 키 파일(.pem)로 접속합니다. 사용자 이름은 ubuntu입니다. 저는 MobaXterm을 썼고, Xshell·PuTTY·Windows 터미널의 ssh 명령 등 어떤 프로그램이든 방법은 같습니다.
ubuntu 계정은 비밀번호 없이 키로만 로그인하고, sudo도 비밀번호를 묻지 않습니다. 처음에 “비밀번호를 설정한 적이 없는데 괜찮은가” 싶었는데 Lightsail 기본 동작입니다. 그래서 키 파일 관리가 중요합니다.접속 후 메모리부터 확인했습니다.
free -h
- 메모리와 스왑 크기를 사람이 읽기 쉬운 단위로 보여줍니다.
- 1GB 플랜이면
Mem의total이 1GB보다 약간 작게 나옵니다.
스왑 만들기 (메모리 1GB 플랜)
1GB 메모리에서 MariaDB·PHP를 같이 돌리면 메모리가 부족할 때 MariaDB가 강제로 종료될 수 있습니다. 디스크 일부를 메모리처럼 쓰는 스왑을 만들어 두면 이를 막을 수 있습니다.
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
- 디스크에 2GB 스왑 파일을 만들어 켭니다. 메모리(1GB)의 2배 크기로 잡았습니다. 메모리가 부족할 때 MariaDB가 강제로 종료되는 것을 막아 줍니다.
free -h의Swap줄이 2.0Gi로 나오면 적용된 것입니다.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
- 재부팅 후에도 스왑이 자동으로 켜지도록 등록합니다.
swapon --show에서 /swapfile 크기가 2G로 나오는 것을 확인했습니다.3. 패키지 설치
시스템 업데이트
sudo apt update && sudo apt upgrade -y
- 패키지 목록을 새로 받고, 설치된 패키지를 최신으로 올립니다.
- 새 서버에서 가장 먼저 해야 보안 업데이트가 적용된 상태로 시작할 수 있습니다.
- 커널 업데이트가 있으면 마지막에 재시작 안내가 나옵니다. 그때는
sudo reboot후 다시 접속합니다.
Nginx · MariaDB · PHP 8.3 설치
sudo apt install -y nginx mariadb-server php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-intl
nginx: 웹 서버,mariadb-server: DB,php8.3-fpm: Nginx가 PHP를 실행할 때 쓰는 PHP 처리기입니다.- 나머지
php8.3-*는 워드프레스가 쓰는 확장 모듈입니다. 빠지면 사이트 상태 화면에 “필수 모듈 누락”이 뜹니다. - Ubuntu 24.04 기본 저장소의 PHP 버전이 8.3이라 별도 저장소 추가가 필요 없습니다.
systemctl is-active nginx mariadb php8.3-fpm
active active active
- 세 서비스가 실행 중인지 한 번에 확인합니다.
- 세 줄 모두
active면 정상입니다.failed가 있으면sudo systemctl status 서비스명으로 원인을 봅니다.
4. 워드프레스용 DB 만들기
sudo mariadb
- MariaDB에 관리자(root)로 접속합니다.
- 비밀번호를 묻지 않고 바로
MariaDB [(none)]>프롬프트가 나옵니다.
Ubuntu의 MariaDB는 root 계정이 unix_socket 인증으로 되어 있어서, 서버에서 sudo 권한이 있는 사용자만 root로 들어갈 수 있습니다. 비밀번호가 없는 게 아니라 비밀번호 대신 서버 계정으로 확인하는 방식이라 외부에서 root로 접속할 수는 없습니다.
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '여기에-강한-비밀번호'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost'; FLUSH PRIVILEGES; EXIT;
- 워드프레스 전용 DB
wordpress와 사용자wpuser를 만들고, 그 DB에만 권한을 줍니다. utf8mb4로 만들어야 한글과 이모지가 깨지지 않습니다.- DB 이름·사용자·비밀번호는 예시입니다. 바꿔서 쓰고, 8단계 설치 화면에서 그대로 입력하니 메모해 둡니다.
5. 워드프레스 파일 받기
cd /tmp && wget https://wordpress.org/latest.tar.gz
- 공식 사이트에서 최신 워드프레스 압축 파일을 받습니다.
/tmp는 임시 폴더라 작업 후 남아도 문제없습니다.
tar xzf latest.tar.gz && sudo mv wordpress /var/www/wordpress
- 압축을 풀고 웹 문서 폴더
/var/www/wordpress로 옮깁니다. - 이 경로가 다음 단계 Nginx 설정의
root와 같아야 합니다.
sudo chown -R www-data:www-data /var/www/wordpress
- 폴더 소유자를 Nginx·PHP가 쓰는 계정
www-data로 바꿉니다. - 이걸 안 하면 플러그인 설치나 이미지 업로드 때 “디렉터리를 만들 수 없습니다” 같은 권한 오류가 납니다.
6. Nginx 사이트 설정
sudo nano /etc/nginx/sites-available/wordpress
- 워드프레스용 사이트 설정 파일을 새로 만듭니다.
- 아래 내용을 붙여 넣고
Ctrl+O→ Enter로 저장,Ctrl+X로 나옵니다.
server {
listen 80;
listen [::]:80;
server_name whein.xyz www.whein.xyz;
root /var/www/wordpress;
index index.php index.html;
client_max_body_size 64M;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
server_name: 이 설정이 응답할 도메인. 본인 도메인으로 바꿉니다.try_files ... /index.php?$args: 워드프레스 고유주소(슬러그 주소)가 404 없이 열리게 합니다.fastcgi_pass: PHP 요청을 PHP 8.3-FPM으로 넘깁니다. PHP 버전이 다르면 소켓 이름도 바뀝니다.client_max_body_size 64M: 큰 이미지 업로드 때 413 오류를 막습니다.
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/ && sudo rm /etc/nginx/sites-enabled/default
- 만든 설정을 활성화하고, Nginx 기본 환영 페이지 설정은 끕니다.
- 기본 설정을 그대로 두면 도메인으로 접속해도 “Welcome to nginx!”가 나올 수 있습니다.
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
- 설정 파일 문법을 검사합니다. 적용 전에 항상 먼저 실행합니다.
syntax is ok와test is successful이 나오면 정상입니다. 오류가 나면 몇 번째 줄인지 알려줍니다.
sudo systemctl reload nginx
- 바뀐 설정을 서비스 중단 없이 적용합니다.
- 이제
http://도메인으로 접속하면 워드프레스 설치 화면이 나옵니다. HTTPS는 다음 단계에서 붙입니다.
7. HTTPS 적용 (Let’s Encrypt)
sudo apt install -y certbot python3-certbot-nginx
- 무료 인증서를 발급하는 Certbot과 Nginx 연동 플러그인을 설치합니다.
막힌 곳: DNS를 바꾼 직후 발급 실패
도메인을 기존 NAS에서 새 서버로 옮긴 직후 바로 인증서를 받으려 했더니 인증에 실패했습니다. Let’s Encrypt가 도메인으로 접속해 확인하는데, 아직 이전 IP(NAS)로 연결되고 있었기 때문입니다.
nslookup whein.xyz 8.8.8.8
Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: Name: whein.xyz Address: (고정 IP가 나와야 정상)
- 구글 DNS(8.8.8.8)에 도메인이 어느 IP로 연결되는지 물어봅니다.
Address가 고정 IP로 나올 때까지 기다린 뒤 발급합니다. 이전 IP가 나오면 DNS 캐시가 남은 것입니다.- TTL을 짧게(저는 180초) 두면 바뀌는 데 오래 걸리지 않습니다.
인증서 발급
sudo certbot --nginx -d whein.xyz -d www.whein.xyz
- 두 도메인(whein.xyz, www.whein.xyz)의 인증서를 받고, Nginx 설정에 HTTPS를 자동으로 추가합니다.
- 처음 실행하면 이메일 입력(만료 알림용)과 약관 동의를 묻습니다.
- 끝나면
Successfully deployed certificate가 나오고, HTTP로 들어오면 HTTPS로 자동 이동됩니다.
자동 갱신 확인
인증서는 90일짜리라 자동 갱신이 되는지 확인해야 합니다. 처음에 발급 명령에 --dry-run을 붙였더니 아래 오류가 났습니다.
--dry-run currently only works with the 'certonly' or 'renew' subcommands ('run')
--dry-run(모의 실행)은 renew나 certonly와 함께 써야 합니다. 갱신 확인은 이렇게 합니다.
sudo certbot renew --dry-run
Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/whein.xyz/fullchain.pem (success)
- 실제로 갱신하지 않고 갱신 과정만 시험합니다.
all simulated renewals succeeded가 나오면 자동 갱신도 정상입니다. 갱신은 Certbot이 등록한 타이머가 알아서 실행합니다.
8. 워드프레스 설치 화면
- 브라우저에서
https://도메인접속 → 언어 한국어 선택 - DB 정보 입력: 데이터베이스 이름
wordpress, 사용자명wpuser, 비밀번호, 호스트localhost, 테이블 접두어는 그대로 - 사이트 제목, 관리자 아이디·비밀번호·이메일 입력 → 워드프레스 설치
- 로그인 후 설정 → 고유주소를 글 이름으로 바꾸고 저장
설치 화면이 DB 정보를 받아 wp-config.php를 자동으로 만들어 줍니다. 위에서 소유자를 www-data로 바꿔 두었기 때문에 직접 파일을 만들 필요가 없습니다.
주의사항
- 키 파일(.pem)을 잃어버리면 SSH 접속이 어렵습니다. 안전한 곳에 백업해 두세요.
- Lightsail 방화벽의 SSH(22)는 기본이 모든 IP 허용입니다. 고정된 접속 위치가 있다면 그 IP로 제한하는 것이 안전합니다.
- 고정 IP는 인스턴스에 연결되지 않은 채로 두면 요금이 붙습니다. 인스턴스를 지울 때 함께 정리하세요.
- 스냅샷(백업)을 한 번 만들어 두면 설정을 잘못 건드렸을 때 되돌리기 쉽습니다.
server: nginx/1.24.0 (Ubuntu)처럼 버전이 그대로 보입니다. 숨기는 방법은 아래 참고에 정리했습니다.참고: Nginx 버전 표시 숨기기
sudo sed -i 's/# server_tokens off;/server_tokens off;/' /etc/nginx/nginx.conf && sudo nginx -t && sudo systemctl reload nginx
nginx.conf에 주석으로 들어 있는server_tokens off;를 켜고, 문법 검사 후 적용합니다.- 응답 헤더와 오류 페이지에 Nginx 버전이 나오지 않게 됩니다. 공격자에게 버전 정보를 주지 않기 위한 설정입니다.
정리
- Lightsail 서울에 Ubuntu 24.04 ($7, 1GB) 인스턴스를 만들고, 메모리가 작으니 스왑부터 만든다.
- 고정 IP를 붙이고, 방화벽에 HTTPS(443)를 추가하고, 도메인 A 레코드를 고정 IP로 등록한다.
- Nginx · MariaDB · PHP 8.3-FPM을 설치하고 워드프레스 DB와 파일을 준비한다.
- Nginx 사이트 설정 후
nginx -t로 검사하고 적용한다. - DNS가 새 IP로 바뀐 것을 확인한 뒤 Certbot으로 HTTPS를 적용하고,
renew --dry-run으로 갱신을 확인한다.
설치하다 막히는 부분이 있으면 댓글로 오류 메시지를 남겨 주세요. 같은 환경에서 확인해 보고 답변드리겠습니다.