Lightsail Ubuntu 24.04에 워드프레스 직접 설치 — Nginx · MariaDB · PHP 8.3 · Let’s Encrypt

이 블로그는 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
OSUbuntu 24.04 LTS (OS 전용 이미지)
웹 서버Nginx 1.24.0 (Ubuntu 기본 저장소)
DB · PHPMariaDB (Ubuntu 기본 저장소) · PHP 8.3-FPM
인증서Let’s Encrypt (Certbot)
도메인 · DNSwhein.xyz · 호스팅케이알 DNS

1. Lightsail 준비 (콘솔)

인스턴스 만들기

  1. Lightsail → 인스턴스 생성 → 리전 서울, 영역 A
  2. 플랫폼 Linux/Unix → 블루프린트 운영 체제(OS) 전용 → Ubuntu 24.04 LTS
  3. 네트워크 유형 듀얼 스택, 플랜 월별 $7 선택 → 인스턴스 이름 입력 → 인스턴스 생성
Lightsail 인스턴스 플랜 선택 화면, 월별 7달러 플랜 선택
월 $7 플랜: 1GB 메모리, vCPU 2개, SSD 40GB, 전송 2TB

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

[직접 확인] 지금 이 블로그가 이 $7 플랜(1GB)에서 돌아가고 있습니다.
생성된 Ubuntu 인스턴스의 연결 정보 화면
인스턴스 생성 직후 화면. 사용자 이름은 ubuntu, SSH 키는 서울 리전 기본 키 (IP는 가림)

고정 IP 붙이기

  1. 인스턴스 → 네트워킹 탭 → 고정 IP 연결 (또는 Lightsail 홈 → 네트워킹 → 고정 IP 생성)
  2. 이름을 정하고 방금 만든 인스턴스에 연결합니다.
[직접 확인] 처음 인스턴스에 붙어 있던 퍼블릭 IP와 고정 IP를 연결한 뒤의 주소가 달랐습니다. 도메인에는 반드시 고정 IP를 등록해야 합니다.

고정 IP는 인스턴스에 연결해 두는 동안에는 따로 요금이 붙지 않습니다.

방화벽에 HTTPS(443) 추가

  1. 인스턴스 → 네트워킹 탭 → IPv4 방화벽 → 규칙 추가
  2. 애플리케이션 HTTPS 선택 → 생성 (IPv6 방화벽에도 같은 규칙이 있는지 확인)
Lightsail 방화벽 규칙 HTTP, SSH, HTTPS
기본 규칙(SSH 22, HTTP 80)에 HTTPS 443을 추가한 상태

도메인 연결 (DNS A 레코드)

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

2. SSH 접속

인스턴스 화면의 기본 키 다운로드로 받은 키 파일(.pem)로 접속합니다. 사용자 이름은 ubuntu입니다. 저는 MobaXterm을 썼고, Xshell·PuTTY·Windows 터미널의 ssh 명령 등 어떤 프로그램이든 방법은 같습니다.

[직접 확인] Lightsail Ubuntu의 ubuntu 계정은 비밀번호 없이 키로만 로그인하고, sudo도 비밀번호를 묻지 않습니다. 처음에 “비밀번호를 설정한 적이 없는데 괜찮은가” 싶었는데 Lightsail 기본 동작입니다. 그래서 키 파일 관리가 중요합니다.

접속 후 메모리부터 확인했습니다.

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
free -h
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 메모리와 스왑 크기를 사람이 읽기 쉬운 단위로 보여줍니다.
  • 1GB 플랜이면 Mem의 total이 1GB보다 약간 작게 나옵니다.

스왑 만들기 (메모리 1GB 플랜)

1GB 메모리에서 MariaDB·PHP를 같이 돌리면 메모리가 부족할 때 MariaDB가 강제로 종료될 수 있습니다. 디스크 일부를 메모리처럼 쓰는 스왑을 만들어 두면 이를 막을 수 있습니다.

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 디스크에 2GB 스왑 파일을 만들어 켭니다. 메모리(1GB)의 2배 크기로 잡았습니다. 메모리가 부족할 때 MariaDB가 강제로 종료되는 것을 막아 줍니다.
  • free -h의 Swap 줄이 2.0Gi로 나오면 적용된 것입니다.
whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 재부팅 후에도 스왑이 자동으로 켜지도록 등록합니다.
[직접 확인] 이 서버에도 같은 방법으로 2GB 스왑을 만들어 두었고, swapon --show에서 /swapfile 크기가 2G로 나오는 것을 확인했습니다.

3. 패키지 설치

시스템 업데이트

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo apt update && sudo apt upgrade -y
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 패키지 목록을 새로 받고, 설치된 패키지를 최신으로 올립니다.
  • 새 서버에서 가장 먼저 해야 보안 업데이트가 적용된 상태로 시작할 수 있습니다.
  • 커널 업데이트가 있으면 마지막에 재시작 안내가 나옵니다. 그때는 sudo reboot 후 다시 접속합니다.

Nginx · MariaDB · PHP 8.3 설치

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
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
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • nginx: 웹 서버, mariadb-server: DB, php8.3-fpm: Nginx가 PHP를 실행할 때 쓰는 PHP 처리기입니다.
  • 나머지 php8.3-*는 워드프레스가 쓰는 확장 모듈입니다. 빠지면 사이트 상태 화면에 “필수 모듈 누락”이 뜹니다.
  • Ubuntu 24.04 기본 저장소의 PHP 버전이 8.3이라 별도 저장소 추가가 필요 없습니다.
whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
systemctl is-active nginx mariadb php8.3-fpm
active
active
active
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 세 서비스가 실행 중인지 한 번에 확인합니다.
  • 세 줄 모두 active면 정상입니다. failed가 있으면 sudo systemctl status 서비스명으로 원인을 봅니다.

4. 워드프레스용 DB 만들기

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo mariadb
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • MariaDB에 관리자(root)로 접속합니다.
  • 비밀번호를 묻지 않고 바로 MariaDB [(none)]> 프롬프트가 나옵니다.
[직접 확인] MariaDB root 비밀번호를 정한 적이 없는데 비밀번호 없이 바로 접속됐습니다.

Ubuntu의 MariaDB는 root 계정이 unix_socket 인증으로 되어 있어서, 서버에서 sudo 권한이 있는 사용자만 root로 들어갈 수 있습니다. 비밀번호가 없는 게 아니라 비밀번호 대신 서버 계정으로 확인하는 방식이라 외부에서 root로 접속할 수는 없습니다.

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
MariaDB [(none)]>
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;
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 워드프레스 전용 DB wordpress와 사용자 wpuser를 만들고, 그 DB에만 권한을 줍니다.
  • utf8mb4로 만들어야 한글과 이모지가 깨지지 않습니다.
  • DB 이름·사용자·비밀번호는 예시입니다. 바꿔서 쓰고, 8단계 설치 화면에서 그대로 입력하니 메모해 둡니다.

5. 워드프레스 파일 받기

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
cd /tmp && wget https://wordpress.org/latest.tar.gz
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 공식 사이트에서 최신 워드프레스 압축 파일을 받습니다.
  • /tmp는 임시 폴더라 작업 후 남아도 문제없습니다.
whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
tar xzf latest.tar.gz && sudo mv wordpress /var/www/wordpress
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 압축을 풀고 웹 문서 폴더 /var/www/wordpress로 옮깁니다.
  • 이 경로가 다음 단계 Nginx 설정의 root와 같아야 합니다.
whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo chown -R www-data:www-data /var/www/wordpress
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 폴더 소유자를 Nginx·PHP가 쓰는 계정 www-data로 바꿉니다.
  • 이걸 안 하면 플러그인 설치나 이미지 업로드 때 “디렉터리를 만들 수 없습니다” 같은 권한 오류가 납니다.

6. Nginx 사이트 설정

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo nano /etc/nginx/sites-available/wordpress
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 워드프레스용 사이트 설정 파일을 새로 만듭니다.
  • 아래 내용을 붙여 넣고 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 오류를 막습니다.
whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/ && sudo rm /etc/nginx/sites-enabled/default
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 만든 설정을 활성화하고, Nginx 기본 환영 페이지 설정은 끕니다.
  • 기본 설정을 그대로 두면 도메인으로 접속해도 “Welcome to nginx!”가 나올 수 있습니다.
whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 설정 파일 문법을 검사합니다. 적용 전에 항상 먼저 실행합니다.
  • syntax is ok와 test is successful이 나오면 정상입니다. 오류가 나면 몇 번째 줄인지 알려줍니다.
whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo systemctl reload nginx
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 바뀐 설정을 서비스 중단 없이 적용합니다.
  • 이제 http://도메인으로 접속하면 워드프레스 설치 화면이 나옵니다. HTTPS는 다음 단계에서 붙입니다.

7. HTTPS 적용 (Let’s Encrypt)

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo apt install -y certbot python3-certbot-nginx
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 무료 인증서를 발급하는 Certbot과 Nginx 연동 플러그인을 설치합니다.

막힌 곳: DNS를 바꾼 직후 발급 실패

도메인을 기존 NAS에서 새 서버로 옮긴 직후 바로 인증서를 받으려 했더니 인증에 실패했습니다. Let’s Encrypt가 도메인으로 접속해 확인하는데, 아직 이전 IP(NAS)로 연결되고 있었기 때문입니다.

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
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가 나와야 정상)
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 구글 DNS(8.8.8.8)에 도메인이 어느 IP로 연결되는지 물어봅니다.
  • Address가 고정 IP로 나올 때까지 기다린 뒤 발급합니다. 이전 IP가 나오면 DNS 캐시가 남은 것입니다.
  • TTL을 짧게(저는 180초) 두면 바뀌는 데 오래 걸리지 않습니다.
[직접 확인] 새 IP가 조회되는 것을 확인하고 다시 실행하니 바로 발급됐습니다.

인증서 발급

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo certbot --nginx -d whein.xyz -d www.whein.xyz
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 두 도메인(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와 함께 써야 합니다. 갱신 확인은 이렇게 합니다.

whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo certbot renew --dry-run
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/whein.xyz/fullchain.pem (success)
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • 실제로 갱신하지 않고 갱신 과정만 시험합니다.
  • all simulated renewals succeeded가 나오면 자동 갱신도 정상입니다. 갱신은 Certbot이 등록한 타이머가 알아서 실행합니다.
[직접 확인] 모의 갱신이 성공하는 것까지 확인했습니다. 지금 이 블로그의 주소창 자물쇠가 이 인증서입니다.

8. 워드프레스 설치 화면

  1. 브라우저에서 https://도메인 접속 → 언어 한국어 선택
  2. DB 정보 입력: 데이터베이스 이름 wordpress, 사용자명 wpuser, 비밀번호, 호스트 localhost, 테이블 접두어는 그대로
  3. 사이트 제목, 관리자 아이디·비밀번호·이메일 입력 → 워드프레스 설치
  4. 로그인 후 설정 → 고유주소를 글 이름으로 바꾸고 저장

설치 화면이 DB 정보를 받아 wp-config.php를 자동으로 만들어 줍니다. 위에서 소유자를 www-data로 바꿔 두었기 때문에 직접 파일을 만들 필요가 없습니다.

주의사항

  • 키 파일(.pem)을 잃어버리면 SSH 접속이 어렵습니다. 안전한 곳에 백업해 두세요.
  • Lightsail 방화벽의 SSH(22)는 기본이 모든 IP 허용입니다. 고정된 접속 위치가 있다면 그 IP로 제한하는 것이 안전합니다.
  • 고정 IP는 인스턴스에 연결되지 않은 채로 두면 요금이 붙습니다. 인스턴스를 지울 때 함께 정리하세요.
  • 스냅샷(백업)을 한 번 만들어 두면 설정을 잘못 건드렸을 때 되돌리기 쉽습니다.
[직접 확인] 오늘 확인해 보니 응답 헤더에 server: nginx/1.24.0 (Ubuntu)처럼 버전이 그대로 보입니다. 숨기는 방법은 아래 참고에 정리했습니다.

참고: Nginx 버전 표시 숨기기

[참고 · 직접 확인하지 않음] 아래 설정은 이 서버에 아직 적용하지 않았고, 문서 기준으로 정리했습니다. 적용 전 스냅샷을 만들어 두세요.
whein.xyz – Xshell–□✕
ssh://ubuntu@whein.xyz:22
1 whein.xyz
[ubuntu@whein ~]$
sudo sed -i 's/# server_tokens off;/server_tokens off;/' /etc/nginx/nginx.conf && sudo nginx -t && sudo systemctl reload nginx
ssh://ubuntu@whein.xyz:22SSH2xtermUTF-8
  • nginx.conf에 주석으로 들어 있는 server_tokens off;를 켜고, 문법 검사 후 적용합니다.
  • 응답 헤더와 오류 페이지에 Nginx 버전이 나오지 않게 됩니다. 공격자에게 버전 정보를 주지 않기 위한 설정입니다.

정리

  1. Lightsail 서울에 Ubuntu 24.04 ($7, 1GB) 인스턴스를 만들고, 메모리가 작으니 스왑부터 만든다.
  2. 고정 IP를 붙이고, 방화벽에 HTTPS(443)를 추가하고, 도메인 A 레코드를 고정 IP로 등록한다.
  3. Nginx · MariaDB · PHP 8.3-FPM을 설치하고 워드프레스 DB와 파일을 준비한다.
  4. Nginx 사이트 설정 후 nginx -t로 검사하고 적용한다.
  5. DNS가 새 IP로 바뀐 것을 확인한 뒤 Certbot으로 HTTPS를 적용하고, renew --dry-run으로 갱신을 확인한다.

설치하다 막히는 부분이 있으면 댓글로 오류 메시지를 남겨 주세요. 같은 환경에서 확인해 보고 답변드리겠습니다.

댓글 남기기