홈서버 워드프레스 운영 로그와 모니터링 – 문제를 사전에 감지하는 방법
홈서버로 워드프레스를 운영한다는 건
서버 관리까지 직접 책임지는 것을 의미한다.
웹사이트가 갑자기 느려지거나 접속이 되지 않을 때,
원인을 빠르게 파악하고 조치하지 않으면 방문자 이탈 + 수익 손실로 이어진다.
이번 글에서는 홈서버 워드프레스의 운영 상태를 실시간으로 파악하고
문제를 사전에 감지할 수 있는 실전 모니터링 방법을 정리한다.
📊 장애 발생 시 손실 규모
다운타임과 손실의 관계
| 다운타임 | 방문자 손실 | 수익 손실 | SEO 영향 |
|---|---|---|---|
| 1시간 | 100명 | $5~$10 | 없음 |
| 6시간 | 600명 | $30~$60 | ⚠️ 경고 |
| 24시간 | 2,400명 | $120~$240 | ❌ 순위 하락 |
| 1주일 | 17,000명 | $850~$1,700 | ❌❌ 심각한 하락 |
장애 원인별 발생 빈도
| 원인 | 빈도 | 감지 시간 | 복구 시간 |
|---|---|---|---|
| 디스크 용량 부족 | ⭐⭐⭐⭐⭐ | 즉시 | 10분 |
| 메모리 부족 (OOM) | ⭐⭐⭐⭐ | 즉시 | 5분 |
| 컨테이너 다운 | ⭐⭐⭐ | 1분 | 2분 |
| 네트워크 장애 | ⭐⭐⭐ | 5분 | 30분+ |
| 정전 | ⭐⭐ | 즉시 | 변동 |
| DDoS 공격 | ⭐ | 5분 | 1시간+ |
핵심: 모니터링은 서버의 건강검진, 조기 발견이 손실 최소화
🖥️ Level 1: 시스템 리소스 모니터링
기본 명령어
# 1. htop - 실시간 프로세스 모니터링
sudo apt install htop -y
htop
확인 사항:
- CPU 사용률 (80% 이상 주의)
- 메모리 사용률 (90% 이상 주의)
- Load Average (CPU 코어 수보다 높으면 과부하)
- 프로세스별 리소스 사용
단축키:
F3: 프로세스 검색
F9: 프로세스 종료
q: 종료
# 2. df - 디스크 사용량
df -h
확인:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 85G 15G 85% /
→ 90% 이상 시 정리 필요
# 3. free - 메모리 상태
free -h
total used free shared buff/cache available
Mem: 8.0G 3.2G 1.5G 100M 3.3G 4.5G
Swap: 2.0G 500M 1.5G
→ available < 500MB 시 주의
# 4. uptime - 시스템 부하
uptime
10:30:01 up 15 days, 3:42, 1 user, load average: 0.52, 0.58, 0.59
→ Load Average가 CPU 코어 수보다 높으면 과부하
# 5. iotop - 디스크 I/O 모니터링
sudo apt install iotop -y
sudo iotop
→ 디스크 읽기/쓰기가 많은 프로세스 확인
Docker 컨테이너 리소스 모니터링
# 실시간 모니터링
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O
abc123def456 wordpress-app 2.34% 245MiB / 512MiB 47.85% 1.2MB / 3.4MB
def789ghi012 wordpress-db 5.67% 890MiB / 1GiB 86.91% 800KB / 2.1MB
ghi012jkl345 nginx-proxy 0.12% 25MiB / 256MiB 9.77% 5.6MB / 12MB
확인 사항:
- CPU %: 80% 이상 지속 시 문제
- MEM %: 90% 이상 시 OOM 위험
- NET I/O: 급격한 증가 시 공격 의심
# 특정 컨테이너 상세 정보
docker inspect wordpress-app | grep -A 10 "Memory"
# 컨테이너별 로그 크기 확인
docker ps -aq | xargs -I {} sh -c 'echo "Container: {}"; docker inspect {} | grep LogPath | cut -d\" -f4 | xargs ls -lh'
자동 알림 스크립트
#!/bin/bash
# ~/monitoring/resource-check.sh
# 설정
DISK_THRESHOLD=85
MEM_THRESHOLD=90
EMAIL="[email protected]"
# 디스크 체크
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt $DISK_THRESHOLD ]; then
echo "⚠️ Disk usage: ${DISK_USAGE}%" | mail -s "Disk Alert" $EMAIL
fi
# 메모리 체크
MEM_USAGE=$(free | awk 'NR==2 {printf "%.0f", $3/$2 * 100}')
if [ $MEM_USAGE -gt $MEM_THRESHOLD ]; then
echo "⚠️ Memory usage: ${MEM_USAGE}%" | mail -s "Memory Alert" $EMAIL
fi
# Docker 컨테이너 체크
CONTAINERS=$(docker ps -q)
for container in $CONTAINERS; do
if ! docker ps | grep -q $container; then
CONTAINER_NAME=$(docker ps -a | grep $container | awk '{print $NF}')
echo "⚠️ Container down: $CONTAINER_NAME" | mail -s "Container Alert" $EMAIL
fi
done
# 실행 권한
chmod +x ~/monitoring/resource-check.sh
# Cron 자동화 (5분마다)
crontab -e
*/5 * * * * ~/monitoring/resource-check.sh
📝 Level 2: WordPress 로그 관리
디버그 로그 활성화
# wp-config.php 편집
docker exec wordpress-app nano /var/www/html/wp-config.php
# 추가 (/* That's all, stop editing! */ 위에)
// 개발 환경
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );
// 로그 파일 위치
define( 'WP_DEBUG_LOG', '/var/www/html/wp-content/debug.log' );
저장 → Ctrl+X → Y → Enter
# 로그 확인
docker exec wordpress-app tail -f /var/www/html/wp-content/debug.log
# 로그 크기 제한 (Cron)
0 0 * * * docker exec wordpress-app sh -c 'echo "" > /var/www/html/wp-content/debug.log'
일반적인 WordPress 에러
| 에러 | 원인 | 해결 |
|---|---|---|
| Fatal error: Maximum execution time | PHP 타임아웃 | max_execution_time 증가 |
| Fatal error: Allowed memory size | 메모리 부족 | WP_MEMORY_LIMIT 증가 |
| Error establishing database connection | DB 연결 실패 | DB 컨테이너 재시작 |
| Warning: Cannot modify header | 출력 전 헤더 | 공백/BOM 제거 |
| 404 on all pages except homepage | 퍼머링크 오류 | .htaccess 재생성 |
Query Monitor 플러그인
# 설치
플러그인 → "Query Monitor" 검색 → 설치 → 활성화
# 기능
- 느린 DB 쿼리 식별
- PHP 에러 실시간 표시
- HTTP 요청 추적
- Hook 실행 순서
- 플러그인 성능 분석
# 사용
사이트 방문 → 상단 바 "Query Monitor" 클릭
→ Queries by Component 확인
→ 느린 쿼리 최적화
🌐 Level 3: 웹서버 로그 분석
Nginx 로그 위치 및 분석
# Access 로그 (접속 기록)
docker exec nginx-proxy tail -f /var/log/nginx/access.log
# 로그 형식
192.168.0.100 - - [11/Nov/2025:10:30:01 +0000] "GET /wordpress-setup HTTP/1.1" 200 15234 "https://google.com" "Mozilla/5.0..."
분석:
- IP: 192.168.0.100
- 시간: 11/Nov/2025:10:30:01
- 요청: GET /wordpress-setup
- 상태: 200 (성공)
- 크기: 15234 bytes
- Referer: https://google.com
- User Agent: Mozilla/5.0
# Error 로그 (오류 기록)
docker exec nginx-proxy tail -f /var/log/nginx/error.log
# 일반적인 에러
- 404: 파일 없음 (봇 탐색 시도 의심)
- 502: Bad Gateway (WordPress 다운)
- 504: Gateway Timeout (응답 느림)
# 로그 분석 명령어
# 1. 가장 많이 접속한 IP Top 10
docker exec nginx-proxy awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 2. 가장 많이 접속한 페이지
docker exec nginx-proxy awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 3. 404 에러가 많은 URL
docker exec nginx-proxy awk '$9 == "404" {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 4. User Agent 분석 (봇 확인)
docker exec nginx-proxy awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 5. 시간대별 트래픽
docker exec nginx-proxy awk '{print $4}' /var/log/nginx/access.log | cut -d: -f2 | sort | uniq -c
# 6. 느린 요청 (응답 시간)
docker exec nginx-proxy awk '$NF > 1 {print $0}' /var/log/nginx/access.log | tail -20
GoAccess 실시간 로그 분석
# 설치
sudo apt install goaccess -y
# 실시간 터미널 분석
docker exec nginx-proxy cat /var/log/nginx/access.log | goaccess --log-format=COMBINED -
# HTML 리포트 생성
docker exec nginx-proxy cat /var/log/nginx/access.log | \
goaccess --log-format=COMBINED -o /tmp/report.html
# 웹으로 확인
docker cp nginx-proxy:/tmp/report.html ~/report.html
# 브라우저에서 file:///home/user/report.html 열기
# 실시간 HTML 업데이트
docker exec nginx-proxy goaccess /var/log/nginx/access.log \
--log-format=COMBINED \
--output=/usr/share/nginx/html/stats.html \
--real-time-html \
--daemon
# 접속
https://yourdomain.com/stats.html
📦 Level 4: Docker 로그 관리
컨테이너 로그 확인
# 로그 확인 (최근 100줄)
docker logs wordpress-app --tail 100
# 실시간 로그
docker logs wordpress-app -f
# 시간 범위 지정
docker logs wordpress-app --since 1h
docker logs wordpress-app --since "2025-11-11T10:00:00"
docker logs wordpress-app --until "2025-11-11T12:00:00"
# 타임스탬프 포함
docker logs wordpress-app -t
# 에러만 필터링
docker logs wordpress-app 2>&1 | grep -i error
docker logs wordpress-app 2>&1 | grep -i warning
로그 크기 제한
# docker-compose.yml 수정
services:
wordpress:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
db:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 또는 /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
# Docker 재시작
sudo systemctl restart docker
# 기존 로그 정리
docker system prune -a --volumes
🔔 Level 5: Uptime 모니터링 (외부)
UptimeRobot 설정 (무료)
# 1. 가입
https://uptimerobot.com/
# 2. 모니터 추가
Dashboard → Add New Monitor
Monitor Type: HTTP(s)
Friendly Name: My WordPress Blog
URL: https://yourdomain.com
Monitoring Interval: 5 minutes (무료)
# 3. 알림 설정
Alert Contacts → Add Alert Contact
Type: Email
Email: [email protected]
또는:
- Slack
- Discord
- Telegram
- Webhook
# 4. 고급 설정
Keyword Monitoring: "WordPress" (페이지에 특정 단어 있는지 확인)
Alert Threshold: Down for 5 minutes
# 5. 모니터 확인
Status: Up (녹색)
Uptime: 99.98%
Response Time: 342ms
# 결과
- 다운 시 즉시 이메일 수신
- 월간 리포트 제공
- 공개 Status Page 생성 가능
Better Uptime 설정 (대안)
# 사이트: https://betterstack.com/better-uptime
장점:
- 더 빠른 체크 (30초 간격, 무료)
- 예쁜 UI
- Incident Management
- Status Page 포함
설정:
1. 사이트 추가
2. 알림 채널 연결
3. 팀원 초대 (선택)
→ UptimeRobot보다 빠르고 직관적
📊 Level 6: 종합 모니터링 대시보드
Uptime Kuma (자체 호스팅)
# Docker Compose에 추가
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
volumes:
- ./uptime-kuma:/app/data
ports:
- "3001:3001"
restart: unless-stopped
# 시작
docker compose up -d
# 접속
http://서버IP:3001
# 초기 설정
1. 관리자 계정 생성
2. 모니터 추가
- HTTP(s): https://yourdomain.com
- Heartbeat: 60초
3. 알림 설정
- Email / Slack / Discord
4. 대시보드 확인
# 기능
✅ 다중 사이트 모니터링
✅ 응답 시간 그래프
✅ 다운타임 히스토리
✅ Public Status Page
✅ Docker / Port / Ping 모니터링
Grafana + Prometheus (고급)
# docker-compose.yml에 추가
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
restart: unless-stopped
grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
restart: unless-stopped
node-exporter:
image: prom/node-exporter
ports:
- "9100:9100"
restart: unless-stopped
volumes:
prometheus_data:
grafana_data:
# prometheus.yml 생성
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
# 시작
docker compose up -d
# Grafana 접속
http://서버IP:3000
admin / admin
# 대시보드 import
Dashboard → Import
ID: 1860 (Node Exporter Full)
# 결과
- CPU, 메모리, 디스크 실시간 그래프
- 네트워크 트래픽
- 알림 설정 (임계값 초과 시)
✅ 주간 운영 체크리스트
| 항목 | 주기 | 확인 방법 |
|---|---|---|
| 디스크 용량 | 매일 | df -h → 85% 이하 |
| 메모리 사용률 | 매일 | free -h → available > 500MB |
| 컨테이너 상태 | 매일 | docker ps → 모두 Up |
| WordPress 에러 | 주 1회 | debug.log 확인 |
| 접속 로그 | 주 1회 | nginx access.log 분석 |
| Uptime | 실시간 | UptimeRobot 대시보드 |
| 백업 확인 | 주 1회 | 백업 파일 존재 및 크기 |
| 보안 로그 | 주 1회 | fail2ban 차단 IP 확인 |
📝 정리하며
핵심 요약
- Level 1: htop, df, free로 시스템 리소스 모니터링
- Level 2: WordPress debug.log + Query Monitor
- Level 3: Nginx 로그 + GoAccess 분석
- Level 4: Docker 로그 + 크기 제한
- Level 5: UptimeRobot 외부 모니터링
- Level 6: Uptime Kuma 또는 Grafana 대시보드
모니터링 자동화 스택
최소 구성 (무료):
- htop (시스템 리소스)
- docker stats (컨테이너)
- UptimeRobot (외부 모니터링)
권장 구성:
+ Uptime Kuma (자체 대시보드)
+ GoAccess (로그 분석)
+ 리소스 알림 스크립트
고급 구성:
+ Grafana + Prometheus (시각화)
+ ELK Stack (로그 집계)
+ PagerDuty (알림 관리)
다음 단계
다음 글에서는 홈서버 워드프레스 트래픽 분석을 다룬다:
- Google Analytics 4 고급 설정
- 방문자 행동 패턴 분석
- 유입 경로 추적
- 전환율 최적화
- 데이터 기반 콘텐츠 전략
모니터링으로 서버 안정성을 확보했다면,
이제 방문자 데이터를 수익으로 전환할 차례다. 📈
댓글 남기기