메모리 여유를 확보하고 나서 실제로 두 번째 워드프레스를 올렸습니다. 이 글은 왜 워드프레스 멀티사이트를 쓰지 않고 스택을 통째로 분리했는지, 그리고 어떻게 했는지에 대한 이야기입니다.
멀티사이트로 묶을 수도 있었습니다
워드프레스에는 멀티사이트라는 기능이 있습니다. 설치 하나에 사이트를 여러 개 얹는 방식입니다. 관리 화면이 하나로 합쳐지니 편하고, 자원도 덜 씁니다.
그런데 이렇게 하면 두 블로그가 같은 데이터베이스, 같은 플러그인, 같은 PHP를 공유합니다. 한쪽에서 플러그인 충돌이 나면 다른 쪽도 같이 멈춥니다. 한쪽 트래픽이 몰리면 다른 쪽도 느려집니다.
이미 돌아가고 있는 블로그가 있는 상태에서, 새 블로그를 실험하다가 기존 블로그를 멈추게 하고 싶지 않았습니다. 그래서 스택을 통째로 나눴습니다.
| 멀티사이트 | 스택 분리 | |
|---|---|---|
| 관리 지점 | 하나 | 둘 |
| 메모리 | 적게 씀 | 더 씀 (스택당 250~450MB) |
| 장애 영향 | 한쪽 문제가 양쪽에 | 서로 격리됨 |
| 실험 | 조심스러움 | 마음껏 |
메모리를 더 쓰는 건 감수했습니다. 앞 편에서 여유를 확보해둔 이유가 이것이었습니다.
포트가 겹치면 안 올라갑니다
컨테이너를 나눌 때 가장 먼저 부딪히는 게 포트입니다. 기존 워드프레스가 이미 어떤 포트를 쓰고 있으니, 새 것은 다른 번호를 줘야 합니다.
NAS에서 어떤 포트가 이미 쓰이고 있는지 확인하는 방법입니다.
cat /proc/net/tcp | awk 'NR>1 {print $2}' | cut -d: -f2 | sort -u | while read p; do printf '%d
' 0x$p; done | sort -n | uniq
DSM 자체도 여러 포트를 씁니다. 5000·5001은 관리 화면이고, 그 밖에도 패키지마다 쓰는 번호가 있습니다. 목록에 없는 번호를 골라야 안전합니다.
저는 기존 블로그가 8082를 쓰고 있어서 새 블로그에 8083을 줬습니다.
컴포즈 파일은 이렇게 나눴습니다
핵심은 서비스 이름, 네트워크, 데이터베이스를 전부 다르게 주는 것입니다. 이름이 겹치면 도커가 같은 것으로 취급하거나 충돌합니다.
services:
myblog_db:
image: mariadb:11
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- myblog_db_data:/var/lib/mysql
networks:
- myblog_net
myblog:
image: wordpress:php8.3-apache
restart: unless-stopped
depends_on:
- myblog_db
environment:
WORDPRESS_DB_HOST: myblog_db
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ./wp_data:/var/www/html
ports:
- "8083:80"
networks:
- myblog_net
networks:
myblog_net:
driver: bridge
volumes:
myblog_db_data:
비밀번호는 파일에 직접 쓰지 않고 같은 폴더의 .env에 두고 불러옵니다.
여기서 워드프레스 파일과 데이터베이스를 다르게 취급한 것을 눈여겨봐 주십시오. 워드프레스는 폴더로 연결했고(./wp_data), 데이터베이스는 도커 볼륨(myblog_db_data)을 씁니다. 이유가 있는데, 그 얘기는 다음 편에서 하겠습니다. 여기서 제대로 막혔거든요.
빌드 전에 폴더를 만들어둬야 합니다
Container Manager에서 프로젝트를 만들고 빌드했더니 폴더가 없다는 오류가 났습니다.
컴포즈 파일이 ./wp_data를 연결하는데, 도커가 그 폴더를 알아서 만들어주지 않습니다. 미리 만들어두면 됩니다.
그리고 빌드가 끝난 직후 사이트에 들어가면 데이터베이스 오류가 뜰 수 있습니다. 이건 정상입니다. 데이터베이스가 처음 초기화되는 데 30초쯤 걸리기 때문입니다. 저는 이걸 모르고 원인을 찾아 헤맸습니다. 30초쯤 기다렸다 새로고침해 보시면 됩니다.
정리
- 이미 돌아가는 블로그가 있다면 멀티사이트보다 스택 분리가 안전합니다. 메모리를 더 쓰는 대신 장애가 격리됩니다.
- 포트는 미리 확인하고 안 쓰는 번호를 고르십시오. DSM도 여러 포트를 씁니다.
- 서비스 이름·네트워크·데이터베이스 이름을 전부 다르게 주십시오.
- 바인드마운트할 폴더는 빌드 전에 미리 만들어야 합니다.
- 빌드 직후의 데이터베이스 오류는 초기화 중이라 그런 것일 수 있습니다. 30초 기다려 보십시오.
NAS 복구·재구축 연재 — 전 11편 중 8편
1막 · 잃음
2막 · 다시 지음
3막 · 그 위에 블로그를 올림
- 나스 한 대로 블로그 두 개, 병목은 CPU가 아니었습니다
- 도커로 워드프레스 스택 분리하기, 멀티사이트를 안 쓴 이유 — 지금 읽는 글
- MariaDB가 Permission denied로 죽는다, 시놀로지 ACL 함정
- 포트포워딩 없이 도메인 붙이기, 관리자 화면은 숨기기
- 같은 일을 두 번 겪지 않으려고, RAID는 백업이 아닙니다