홈서버 운영 중 자주 발생하는 문제와 해결 방법 – 실전 Q&A 모음
워드프레스를 도커로 설치하고, 도메인까지 연결해서 성공적으로 홈서버를 구축했더라도
운영 중에는 다양한 예상치 못한 문제들이 발생할 수 있다.
특히 비전문가 입장에서는 처음 보는 에러나 접속 실패가
당황스럽고 해결하기 어려울 수 있다.
이번 글에서는 실제 홈서버 운영 중 자주 발생하는 문제들을
Q&A 형식으로 정리하고, 빠르게 대처할 수 있는 팁을 공유한다.
📊 홈서버 문제 발생 빈도 TOP 10
| 순위 | 문제 | 발생 빈도 | 심각도 |
|---|---|---|---|
| 1 | 외부 접속 안 됨 | ⭐⭐⭐⭐⭐ | 🔴 높음 |
| 2 | 컨테이너 다운 | ⭐⭐⭐⭐ | 🔴 높음 |
| 3 | 디스크 용량 부족 | ⭐⭐⭐⭐ | 🟡 중간 |
| 4 | 내부 IP 변경 | ⭐⭐⭐ | 🟡 중간 |
| 5 | SSL 인증서 만료 | ⭐⭐ | 🔴 높음 |
| 6 | WordPress 느림 | ⭐⭐⭐⭐⭐ | 🟡 중간 |
| 7 | 파일 업로드 실패 | ⭐⭐⭐ | 🟢 낮음 |
| 8 | 포트 충돌 | ⭐⭐ | 🟡 중간 |
| 9 | DB 연결 오류 | ⭐⭐ | 🔴 높음 |
| 10 | 플러그인 충돌 | ⭐⭐⭐ | 🟡 중간 |
🔌 Q1. 외부에서 도메인 접속이 안 돼요!
증상
- 집 안(내부 네트워크)에서는 접속 가능
- 모바일 데이터(외부 네트워크)에서는 접속 불가
- “연결할 수 없음” 또는 “사이트에 연결할 수 없습니다” 오류
원인 체크리스트
| 원인 | 확인 방법 | 해결 |
|---|---|---|
| 포트포워딩 미설정 | 공유기 관리 페이지 확인 | 80, 443 포트포워딩 추가 |
| 내부 IP 변경 | ip addr 확인 | 고정 IP 또는 DHCP 예약 |
| ISP 포트 차단 | 포트 스캔 사이트 테스트 | 8080, 8443 대체 포트 사용 |
| 방화벽 차단 | sudo ufw status | sudo ufw allow 80/443 |
| DNS 전파 안 됨 | nslookup 도메인 | 24~48시간 대기 |
단계별 진단
# Step 1: 내부 접속 테스트
curl http://localhost
curl http://192.168.0.100
# Step 2: 외부 IP 확인
curl ifconfig.me
# Step 3: 포트 오픈 확인
https://www.yougetsignal.com/tools/open-ports/
→ IP: 내 외부 IP
→ Port: 80, 443
# Step 4: DNS 확인
nslookup myblog.duckdns.org
→ 내 외부 IP와 일치하는지 확인
# Step 5: Traceroute
traceroute myblog.duckdns.org
→ 어디서 막히는지 확인
해결 방법
1. 포트포워딩 재설정
공유기 관리 페이지 (보통 192.168.0.1 or 192.168.1.1)
→ 고급 설정 → NAT/라우터 관리 → 포트포워딩
추가:
외부 포트: 80 → 내부 IP: 192.168.0.100, 포트: 80
외부 포트: 443 → 내부 IP: 192.168.0.100, 포트: 443
저장 → 공유기 재부팅
2. ISP 차단 시 대체 포트 사용
# docker-compose.yml 수정
services:
npm:
ports:
- "8080:80"
- "8443:443"
# 재시작
docker compose restart
# 공유기 포트포워딩도 변경
외부: 8080 → 내부: 192.168.0.100:8080
외부: 8443 → 내부: 192.168.0.100:8443
# 접속 테스트
https://myblog.duckdns.org:8443
🛑 Q2. Docker 컨테이너가 갑자기 꺼졌어요
증상
- 사이트 접속 불가 (502 Bad Gateway)
docker ps에서 컨테이너 안 보임
진단
# 모든 컨테이너 상태 확인 (중지된 것 포함)
docker ps -a
# 출력 예시:
CONTAINER ID STATUS
abc123def456 Exited (137) 2 minutes ago # 강제 종료
def789ghi012 Exited (1) 5 minutes ago # 오류로 종료
# 로그 확인
docker logs wordpress-app
docker logs wordpress-db
# 컨테이너 리소스 사용 이력
docker stats --no-stream
원인별 해결
원인 1: 메모리 부족 (OOM Killer)
# 로그에서 "OOM" 또는 "killed" 확인
docker logs wordpress-db | grep -i oom
# 해결: 메모리 제한 완화 또는 증설
# docker-compose.yml
services:
db:
deploy:
resources:
limits:
memory: 1G # 512M → 1G로 증가
# 재시작
docker compose up -d
원인 2: 디스크 용량 부족
# 디스크 확인
df -h
# Docker 정리
docker system prune -a
docker volume prune
# 로그 파일 정리
sudo journalctl --vacuum-size=100M
원인 3: MySQL 충돌
# 로그 확인
docker logs wordpress-db
# 일반적인 오류:
"InnoDB: The innodb_system data file 'ibdata1' must be writable"
# 해결: 권한 수정
docker exec wordpress-db chown -R mysql:mysql /var/lib/mysql
# 재시작
docker restart wordpress-db
원인 4: 포트 충돌
# 80 포트 사용 중인 프로세스 확인
sudo lsof -i :80
# 출력 예시:
apache2 1234 root 4u IPv6 ... TCP *:http (LISTEN)
# Apache 중지
sudo systemctl stop apache2
sudo systemctl disable apache2
# Docker 재시작
docker compose restart
자동 재시작 설정
# docker-compose.yml
services:
wordpress:
restart: unless-stopped # 수동 중지 외 항상 재시작
db:
restart: unless-stopped
🌐 Q3. 홈서버의 내부 IP가 자꾸 바뀌어요
문제
서버 재부팅 시마다 192.168.0.100 → 192.168.0.105 등으로 변경
해결 방법 2가지
방법 1: 공유기에서 DHCP 예약 (권장)
공유기 관리 페이지
→ LAN 설정 → DHCP 서버 → 수동 할당 (또는 IP/MAC 바인딩)
MAC 주소 확인:
ip link show
MAC 주소: aa:bb:cc:dd:ee:ff
할당 IP: 192.168.0.100
저장 → 서버 재부팅
방법 2: Ubuntu에서 고정 IP 설정
# Netplan 설정 파일 편집
sudo nano /etc/netplan/00-installer-config.yaml
내용:
network:
version: 2
ethernets:
enp0s3: # 네트워크 인터페이스 이름 (ip a로 확인)
dhcp4: no
addresses:
- 192.168.0.100/24
routes:
- to: default
via: 192.168.0.1 # 공유기 IP (게이트웨이)
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
# 적용
sudo netplan apply
# 확인
ip addr show
🔐 Q4. HTTPS 인증서가 갑자기 만료되었어요
증상
- 브라우저에서 “연결이 비공개로 설정되어 있지 않습니다” 경고
- “NET::ERR_CERT_DATE_INVALID” 오류
원인
Let’s Encrypt 인증서는 90일 유효, 자동 갱신 실패
갱신 실패 원인
| 원인 | 확인 | 해결 |
|---|---|---|
| 포트 80 닫힘 | 포트포워딩 확인 | 80 포트 재오픈 |
| 도메인 IP 불일치 | nslookup 도메인 | DDNS 업데이트 |
| NPM 컨테이너 다운 | docker ps | 컨테이너 재시작 |
| Rate Limit 초과 | NPM 로그 확인 | 1주일 대기 |
수동 갱신
# NPM 관리 페이지 (http://서버IP:81)
SSL Certificates → 해당 인증서 클릭 → Renew Certificate
# 또는 CLI
docker exec nginx-proxy-manager certbot renew
# NPM 재시작
docker restart nginx-proxy-manager
자동 갱신 확인
# NPM 로그 확인
docker logs nginx-proxy-manager | grep -i renew
# Cron 작업 확인 (NPM 내장)
docker exec nginx-proxy-manager crontab -l
💾 Q5. 디스크 용량이 부족해요
진단
# 전체 디스크 사용량
df -h
# 큰 파일/폴더 찾기
du -h --max-depth=1 / | sort -hr | head -20
# Docker 사용량
docker system df
# 출력 예시:
Images 15 5.2GB
Containers 10 2.1GB
Local Volumes 8 12.3GB # 여기가 큼!
Build Cache 0 0B
해결 방법
1. Docker 정리
# 사용하지 않는 이미지 삭제
docker image prune -a
# 중지된 컨테이너 삭제
docker container prune
# 사용하지 않는 볼륨 삭제 (주의!)
docker volume prune
# 전체 정리 (Build Cache 포함)
docker system prune -a --volumes
# 확인
docker system df
2. 로그 파일 정리
# 시스템 로그 정리
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=100M
# Docker 로그 제한 설정
sudo nano /etc/docker/daemon.json
내용:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
# Docker 재시작
sudo systemctl restart docker
3. WordPress 미디어 정리
# Media Cleaner 플러그인 설치
플러그인 → Media Cleaner 검색 → 설치
# 사용하지 않는 미디어 스캔 및 삭제
📂 Q6. WordPress 파일 업로드 실패
증상
- “업로드: 실패. 잘못된 MIME 타입”
- “파일 크기가 너무 큽니다”
- “파일을 임시 디렉터리로 이동할 수 없습니다”
원인 1: 업로드 크기 제한
# 현재 제한 확인
워드프레스 관리자 → 미디어 → 새로 추가
"최대 업로드 크기: 2 MB" 확인
# php.ini 수정
docker exec -it wordpress-app bash
nano /usr/local/etc/php/conf.d/uploads.ini
내용:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
# 재시작
exit
docker restart wordpress-app
원인 2: 권한 문제
# wp-content/uploads 권한 확인
docker exec wordpress-app ls -la /var/www/html/wp-content/
# 권한 수정
docker exec wordpress-app chown -R www-data:www-data /var/www/html/wp-content/uploads
docker exec wordpress-app chmod -R 755 /var/www/html/wp-content/uploads
원인 3: 디스크 용량 부족
# 컨테이너 내부 디스크 확인
docker exec wordpress-app df -h
# 볼륨 정리 (위 Q5 참고)
🐌 Q7. WordPress가 너무 느려요
속도 진단
# PageSpeed Insights
https://pagespeed.web.dev/
→ 도메인 입력 → 분석
# GTmetrix
https://gtmetrix.com/
→ 상세 분석
# Query Monitor 플러그인
플러그인 → Query Monitor 설치
→ 느린 쿼리, 플러그인 확인
해결 체크리스트
| 항목 | 확인 | 해결 |
|---|---|---|
| 캐시 | LiteSpeed Cache 설치? | 캐시 플러그인 활성화 |
| 이미지 | 이미지 크기 (MB 단위?) | ShortPixel로 압축 |
| 플러그인 | 20개 이상? | 불필요한 것 비활성화 |
| 테마 | Divi, Avada 등 무거운 테마? | 경량 테마로 교체 |
| DB | 리비전 많음? | WP-Optimize로 정리 |
| PHP | 7.4 이하? | 8.2로 업그레이드 |
🔄 Q8. 컨테이너 재시작 시 데이터 사라짐
원인
볼륨 설정 안 함 → 컨테이너 내부에만 데이터 저장
확인
# docker-compose.yml 확인
cat ~/wordpress-project/docker-compose.yml | grep volumes
# 볼륨 목록
docker volume ls
해결
# docker-compose.yml에 볼륨 추가
services:
wordpress:
volumes:
- wordpress_data:/var/www/html
db:
volumes:
- db_data:/var/lib/mysql
volumes:
wordpress_data:
db_data:
# 재시작
docker compose down
docker compose up -d
📝 정리하며
문제 해결 일반 원칙
- 로그 확인:
docker logs [컨테이너명] - 상태 확인:
docker ps -a - 리소스 확인:
docker stats,df -h - 네트워크 확인: 포트포워딩, 방화벽, DNS
- 백업 확인: 문제 전 백업 있는지
필수 모니터링 명령어
# 매일 실행 권장
docker ps # 컨테이너 상태
docker stats --no-stream # 리소스 사용량
df -h # 디스크 용량
docker system df # Docker 디스크 사용
free -h # 메모리 사용량
다음 단계
다음 글에서는 워드프레스 설치와 최적화가 완료된 상태에서
블로그 초기 방문자를 확보하는 실전 유입 전략을 다룬다.
- 검색 외 트래픽 소스 발굴
- 커뮤니티 마케팅 전략
- SNS 계정 브랜딩
- 자동화 도구 활용
- 유입 분석 및 최적화
서버 운영의 기술적 문제를 해결했다면,
이제 방문자를 모으는 마케팅 전략이 필요하다. 🚀
댓글 남기기