AWS 워드프레스 인스턴스 3개를 하나의 mulit-wordpress로 합치는 작업 이력 남김
누군가에게 필요한 정보가 되길 바라며, 기록을 남긴다. 기존 도메인 그대로 사용 할것이며, 전체를 백업하여 작업하는 것이 아니고 데이터베이스와 첨부파일만 백업 받아서 진행한다. 전체 백업작업을 시도를 하였으나, 아마존 워드프레스 서버가 버티지 못하고 죽는다.
mulit-wordpress로 합치는 작업은 왜 시작하게 되었나?
이유는 간단하다. 구글 애드센스 광고 수익이 더 이상 증가세를 보이지 않고, 줄어들고 있기 때문이다. 총 3개의 인스턴스를 별도로 구성해서 사용중인데, 한달에 호스팅비용으로 약 7만원가량 지출되고 있다. 3개의 블로그 중에 2개는 겨우 밥값(1달 호스팅 비용)을 뽑을 정도만 수입이 발생하고 있다.
애드센스 광고 수익 급감 배경은 ?
ai 전성시대!! chatGPT, 제미나이, 그록AI, 퍼플렉스시티, 코파일럿 등 수많은 AI가 웹 검색시장을 장악하고 있다. 나 역시도 이제는 웹에서 검색하여 필요한 자료를 찾지 않는다. 이 블로그도 나만의 기록용으로 사용되고 있다.
워드프레스 통합 작업 절차
해당 절차별로 방법에 대한 링크를 걸거나, 작업 절차 아래에 작업 기록을 남겼으나, 작업 후 몇 일 지나서 남기는 기록이라 누락이 있을 수 있다. 궁금한 점이 있을시 댓글 남겨주시면 아는한 답변을 드리겠다.
- 아마존 라이트세일 콘솔에 로그인 후 새로운 WordPress Multisite 인스턴스를 생성한다.
- 고정IP를 신규로 생성 후 WordPress Multisite 인스턴스에 연결해준다.
- “SSH를 사용하여 연결” 창을 띄운 후 cat ~/bitnami_application_password 명령어를 입력하여 비밀번호를 확인한 후 메모장 등에 기록해둔다.
- http://[고정 IP]/wp-admin 접속 후 아이디로 user입력, 메모장에 기록해둔 비밀번호를 입력 후 로그인한다.
- 로그인 후 새 사이트 추가: 대시보드 > My Sites > Network Admin > Sites > Add New 클릭하여 2개의 사이트를 추가해준다. 기본적으로 1개는 자동 생성되어 있다.
- 사이트 1: Site Address: test1 ( 도메인 전체주소를 입력하는게 아니라, 서브 도메인만 입력, 기존에 사용하던 서브 도메인 이름), 제목: 블로그 타이틀.
- 사이트 2: Site Address: test2, 제목: 두번째 블로그 타이틀.
- 사이트 리스트에서 각각 Edit 버튼 클릭 > Setting 탭 클릭 > 블로그 이름과 제일 중요한 permalink_structure를 변경한다. 기존에 검색엔진이 이미 크롤링 해갔음으로, URL 방식이 바뀌면 블로그는 저품질에 빠짐으로 주의해라. 과거에 ssl인증서 갱신할때, www.test.com 트래픽을 test.com으로 유입되도록 해버리는 바람에 낭패를 본 적이 있다.
- 기존 블로그 DB 및 uploads 폴더 백업
- 백업 파일을 FileZilla프로그램을 사용하여 새로 생성한 사이트에 복사하기 (/home/bitnami/폴더에 복사)
- 기존 블로그 DB 및 uploads 폴더 마이그레이션
- 브라우저에서 고정IP로 들어가 모든 글/이미지 정상 노출 확인
- DNS 도메인 연결
- SSL 인증서 생성(Let’s Encrypt)
- 브라우저에서 연결한 도메인주소로 들어가 모든 글/이미지 정상 노출 확인
- 백업: 스냅샷 탭에서 수동 스냅샷 생성
- 기존 서버 3대 종료 : Lightsail에서 인스턴스 삭제 및 기존 고정IP 삭제
5번 사이트 추가 작업
메인 Site ID 1 = naragara.com
Site ID 2 = test1
Site ID 3 = test2
사이트 3개 모두 permalink_structure를 변경작업

9번 기존 블로그 DB 및 uploads 폴더 백업
아래 작업을 3개의 사이트 SSH로 접근 후 모두 실행한다. 파일명은 다른게 해줄것(naragara, test1, test2)
# 1. 데이터베이스 덤프 (Bitnami는 mysql 사용자)
mysqldump -u root -p bitnami_wordpress > naragara_db.sql
# 비밀번호는 cat ~/bitnami_application_password 로 확인
# 2. 첨부파일 폴더 압축
cd /opt/bitnami/wordpress
sudo tar -czf ~/naragara_uploads.tar.gz wp-content/uploads/
# 3. (옵션) 사용 중인 테마/플러그인도 같이 가져갈 경우
sudo tar -czf ~/naragara_themes_plugins.tar.gz wp-content/themes/wp-content/plugins/
압축된 파일 용량 메가로 확인 명령어
# 가장 보기 좋은 형태 (예: 1.2G, 856M, 12K)
du -h ~/test1_uploads.tar.gz
# 또는
ls -lh ~/test1_uploads.tar.gz
#정확히 MB 숫자만 딱 보고 싶을 때 (소수점 둘째 자리까지)
du -m ~/lottery_uploads.tar.gz | awk '{print $1 " MB"}'
# 또는
ls -l --block-size=MB ~/lottery_uploads.tar.gz
#여러 파일 한꺼번에 보기
du -h ~/*.tar.gz | sort -h
11번 기존 블로그 DB 및 uploads 폴더 마이그레이션
- Multisite는 테이블 프리픽스가 자동 생성된다. (wp_, wp_2_, wp_3_ …)
- wp_2_xxx (test1용) wp_3_xxx (test2용)
- uploads 폴더 구조가 /wp-content/uploads/sites/2/, /sites/3/ 이런 식으로 바뀜
# 1. Multisite DB 백업 (혹시 모르니)
mysqldump -u root -p bitnami_wordpress > multisite_backup_before.sql
# 2. test1 서브사이트 테이블 확인
mysql -u root -p bitnami_wordpress -e "show tables like 'wp_2_%'"
# 3. 기존 테이블 모두 삭제 (wp_2_ 로 시작하는 테이블만!)
mysql -u root -p bitnami_wordpress
> SET FOREIGN_KEY_CHECKS=0;
> SHOW TABLES LIKE 'wp_2_%'; -- 여기서 나오는 테이블들 복사
> DROP TABLE wp_2_posts, wp_2_postmeta, wp_2_comments, ... (전부 드롭);
> EXIT;
# 4. 백업받은 test1 DB를 임시로 복구
mysql -u root -p bitnami_wordpress < test1_db.sql
# 5. 테이블 접두사 일괄 변경 (wp_ → wp_2_)
# 방법 1: sed 명령 (빠름)
sed -i 's/wp_/wp_2_/g' naragara_playground_db.sql
mysql -u root -p bitnami_wordpress < naragara_playground_db.sql
위 절차대로 4번의 삽질을 했다. 제대로 되지않아, 인스턴스를 4번 새로 생성했다. 위 절차대로 잘 되면 좋은데, 멀티사이트의 경우 wp_로 시작되는 테이블중에 싱글 워드프레스에는 없는 테이블들이 존재한다.(wp_blogs, wp_site 등등) 그 테이블들을 삭제하면 로그인페이지가 나오지 않음으로 위 방법으로 하지않고, 필요한 테이블만 복원 하는 방식으로 작업하였다.
sed -i 's/wp_/naragara_/g' naragara_db.sql
mysql -u root -p bitnami_wordpress < naragara_db.sql
sed -i 's/wp_/test1_/g' test1_db.sql
mysql -u root -p bitnami_wordpress < test1_db.sql
sed -i 's/wp_/test1_/g' test2_db.sql
mysql -u root -p bitnami_wordpress < test2_db.sql
#테이블 삭제 및 기존 db로 복원
drop table wp_posts;
alter table naragara_posts rename wp_posts;
drop table wp_2_posts;
alter table test1_posts rename wp_2_posts;
drop table wp_3_posts;
alter table test2_posts rename wp_3_posts;
--카테고리 ( test1, test2도 동일하게 할 것)
drop table wp_terms;
alter table naragara_terms rename wp_terms;
drop table wp_term_taxonomy;
alter table naragara_term_taxonomy rename wp_term_taxonomy;
drop table wp_term_relationships;
alter table naragara_term_relationships rename wp_term_relationships;
#블로그에 댓글이 있었다면 댓글 테이블도 동일하게 처리해줄것
wp_comments 테이블이 댓글 테이블이다.
첨부파일 복사
cd /opt/bitnami/wordpress/wp-content/uploads/sites/
#naragara.com 메인
sudo tar -xzf ~/naragara_uploads.tar.gz -C /opt/bitnami/wordpress/wp-content/uploads/
# test1은 사이트 ID 2번
sudo tar -xzf ~/test1_uploads.tar.gz -C /opt/bitnami/wordpress/wp-content/uploads/sites/2/
# lottery는 사이트 ID 3번
sudo tar -xzf ~/test2_uploads.tar.gz -C /opt/bitnami/wordpress/wp-content/uploads/sites/3/
# 권한 정리
sudo chown -R bitnami:daemon /opt/bitnami/wordpress/wp-content/uploads/sites/
sudo chmod -R 755 /opt/bitnami/wordpress/wp-content/uploads/sites/
압축파일을 풀고 난 후 확인해보면 경로가 /opt/bitnami/wordpress/wp-content/uploads/sites/2/wp-content/uploads/ 이런식으로 “/wp-content/uploads/” 하나 더 들어가 있어서, 블로그 글의 이미지가 보이지 않는다.
# 3개 uploads 경로 모두 파일 이동 처리가 필요하다.
cd /opt/bitnami/wordpress/wp-content/uploads/sites/3/wp-content/uploads/
sudo mv * ../../
cd /opt/bitnami/wordpress/wp-content/uploads/sites/2/wp-content/uploads/
sudo mv * ../../
cd /opt/bitnami/wordpress/wp-content/uploads/wp-content/uploads/
sudo mv * ../../
#Apache 재시작
sudo /opt/bitnami/ctlscript.sh restart apache
이제 모든 작성글에서 첨부파일 url 주소를 변경해준다. phpMyAdmin 열고 쿼리 실행
#메인사이트-경로가 동일함으로 불필요
#test1 사이트
UPDATE wp_2_posts
SET post_content = REPLACE(
post_content,
'/wp-content/uploads/',
'/wp-content/uploads/sites/2/'
);
#test2 사이트
UPDATE wp_3_posts
SET post_content = REPLACE(
post_content,
'/wp-content/uploads/',
'/wp-content/uploads/sites/3/'
);
동시에 guid 컬럼도 같이 바꿔줘야 함 (첨부파일 페이지용)
UPDATE wp_2_posts
SET guid = REPLACE(
guid,
'/wp-content/uploads/',
'/wp-content/uploads/sites/2/'
)
WHERE post_type = 'attachment';
UPDATE wp_3_posts
SET guid = REPLACE(
guid,
'/wp-content/uploads/',
'/wp-content/uploads/sites/3/'
)
WHERE post_type = 'attachment';
참고 : sudo tail -f /opt/bitnami/apache2/logs/error_log
13번 DNS 도메인 연결
IP 하나만 써야 한다.
WordPress Multisite(서브도메인 방식)는 한 대의 서버 + 하나의 IP에서 모든 서브도메인을 처리하도록 설계되어 있다. 그래서 DNS 설정은 아래처럼 모두 똑같은 새로 발급받은 Static IP를 가리켜야 정상 작동한다.
naragara.com A 12.34.56.78 ← 새 Lightsail Static IP
test1.naragara.com A 12.34.56.78 ← 똑같은 IP
test2.naragara.com A 12.34.56.78 ← 똑같은 IP
WordPress Multisite는 Apache가 HTTP Host 헤더를 보고 → “지금 요청 온 도메인이 naragara.com 이냐? test1.naragara.com 이냐?”를 판단한다. 서버는 하나인데, 들어오는 도메인 이름만 보고 알아서 다른 서브사이트를 보여준다.
14번 SSL 인증서 생성(Let’s Encrypt)
ssh로 접근 후 아래 명령어를 실행.
sudo /opt/bitnami/bncert-tool
Domain list []: naragara.com test1.naragara.com test2.naragara.com
인증서를 잘못 발행했다면? 제거하는 방법
# 1. 인증서 비활성화 (가장 빠름)
sudo /opt/bitnami/bncert-tool --disable_https
# 2. 혹시 모르니 Apache 재시작
sudo /opt/bitnami/ctlscript.sh restart apache
더 확실하게 하고 싶으면 인증서 파일까지 날리기
sudo rm -rf /opt/bitnami/letsencrypt/
sudo /opt/bitnami/ctlscript.sh restart apache
<참고사항 >
사이트 2개가 추가되면 아래와 같은 테이블 구조로 생성된다.
MariaDB [bitnami_wordpress]> show tables;
+-----------------------------+
| Tables_in_bitnami_wordpress |
+-----------------------------+
| wp_2_commentmeta |
| wp_2_comments |
| wp_2_links |
| wp_2_options |
| wp_2_postmeta |
| wp_2_posts |
| wp_2_term_relationships |
| wp_2_term_taxonomy |
| wp_2_termmeta |
| wp_2_terms |
| wp_3_commentmeta |
| wp_3_comments |
| wp_3_links |
| wp_3_options |
| wp_3_postmeta |
| wp_3_posts |
| wp_3_term_relationships |
| wp_3_term_taxonomy |
| wp_3_termmeta |
| wp_3_terms |
| wp_blogmeta |
| wp_blogs |
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_registration_log |
| wp_signups |
| wp_site |
| wp_sitemeta |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------------+
38 rows in set (0.001 sec)
<도메인 주소 연결 전 조회 결과>
MariaDB [bitnami_wordpress]> select * from wp_blogs;
+---------+---------+---------------------------------+------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
| blog_id | site_id | domain | path | registered | last_updated | public | archived | mature | spam | deleted | lang_id |
+---------+---------+---------------------------------+------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
| 1 | 1 | 16.114.11.12.nip.io | / | 2025-12-04 08:19:13 | 2025-12-04 08:40:16 | 1 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | test1.16.114.11.12.nip.io | / | 2025-12-04 08:27:29 | 2025-12-04 08:27:29 | 1 | 0 | 0 | 0 | 0 | 0 |
| 3 | 1 | test2.16.114.11.12.nip.io | / | 2025-12-04 08:28:17 | 2025-12-04 08:28:17 | 1 | 0 | 0 | 0 | 0 | 0 |
+---------+---------+---------------------------------+------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
3 rows in set (0.000 sec)
MariaDB [bitnami_wordpress]> select * from wp_site;
+----+----------------------+------+
| id | domain | path |
+----+----------------------+------+
| 1 | 16.114.11.12.nip.io | / |
+----+----------------------+------+
1 row in set (0.000 sec)
wp_posts 테이블 구조
MariaDB [bitnami_wordpress]> desc wp_posts;
+-----------------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------------+------+-----+---------------------+----------------+
| ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| post_author | bigint(20) unsigned | NO | MUL | 0 | |
| post_date | datetime | NO | | 0000-00-00 00:00:00 | |
| post_date_gmt | datetime | NO | | 0000-00-00 00:00:00 | |
| post_content | longtext | NO | | NULL | |
| post_title | text | NO | | NULL | |
| post_excerpt | text | NO | | NULL | |
| post_status | varchar(20) | NO | | publish | |
| comment_status | varchar(20) | NO | | open | |
| ping_status | varchar(20) | NO | | open | |
| post_password | varchar(255) | NO | | | |
| post_name | varchar(200) | NO | MUL | | |
| to_ping | text | NO | | NULL | |
| pinged | text | NO | | NULL | |
| post_modified | datetime | NO | | 0000-00-00 00:00:00 | |
| post_modified_gmt | datetime | NO | | 0000-00-00 00:00:00 | |
| post_content_filtered | longtext | NO | | NULL | |
| post_parent | bigint(20) unsigned | NO | MUL | 0 | |
| guid | varchar(255) | NO | | | |
| menu_order | int(11) | NO | | 0 | |
| post_type | varchar(20) | NO | MUL | post | |
| post_mime_type | varchar(100) | NO | | | |
| comment_count | bigint(20) | NO | | 0 | |
+-----------------------+---------------------+------+-----+---------------------+----------------+
23 rows in set (0.001 sec)
MariaDB [bitnami_wordpress]>
#블로그 글 카테고리 확인
SELECT p.ID, p.post_title, t.name AS category_name, t.slug
FROM wp_3_posts p
JOIN wp_3_term_relationships tr ON p.ID = tr.object_id
JOIN wp_3_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_3_terms t ON tt.term_id = t.term_id
WHERE p.ID = 123
AND tt.taxonomy = 'category';
#한 글에 카테고리 여러 개일 때 다 보기 + 카테고리 ID까지
SELECT
p.ID,
p.post_title,
tt.term_taxonomy_id,
t.term_id,
t.name AS category_name,
t.slug
FROM wp_3_posts p
JOIN wp_3_term_relationships tr ON p.ID = tr.object_id
JOIN wp_3_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'category'
JOIN wp_3_terms t ON tt.term_id = t.term_id
WHERE p.ID = 123
ORDER BY t.name;
예외 사항 발생
mysqldump -u root -p bitnami_wordpress > multisite_backup_before.sql mysqldump: Deprecated program name. It will be removed in a future release, use ‘/opt/bitnami/mariadb/bin/mariadb-dump’ instead메세지는?
이 메시지는 그냥 경고(warning) 일 뿐이고, multisite_backup_before.sql 파일은 제대로 생성된다.
Bitnami 최신 버전부터는 mysqldump 대신 /opt/bitnami/mariadb/bin/mariadb-dump 라는 이름으로 바꿔 달라고 하는 거다. 하지만 옛날 이름(mysqldump)도 아직은 그대로 작동하게 남겨 놨기 때문에 → 파일은 정상적으로 백업됐고, 지금 당장 문제 전혀 없다.
# 앞으로는 이걸쓰면됨.
sudo /opt/bitnami/mariadb/bin/mariadb-dump -u root -p bitnami_wordpress > 백업파일명.sql


