목표
WordPress 사이트의 Apache 액세스 로그를 실시간으로 수집하여 Kibana에서 모니터링할 수 있는 시스템 구축
사전 준비
- Docker & Docker Compose 설치
- 포트 8081 (WordPress), 5601 (Kibana), 9200 (Elasticsearch), 3306 (MySQL) 사용 가능
1단계: 프로젝트 구조 생성
2단계: Docker Compose 파일 생성
docker-compose.yml
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
ports:
- "9200:9200"
networks:
- elk
restart: unless-stopped
kibana:
image: docker.elastic.co/kibana/kibana:8.11.0
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
networks:
- elk
depends_on:
- elasticsearch
restart: unless-stopped
filebeat:
image: docker.elastic.co/beats/filebeat:8.11.0
container_name: filebeat
user: root
volumes:
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/log/filebeat:/var/log/filebeat
networks:
- elk
depends_on:
- elasticsearch
restart: unless-stopped
wordpress:
image: wordpress:latest
container_name: wordpress
environment:
- WORDPRESS_DB_HOST=mysql:3306
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
ports:
- "8081:80"
networks:
- mysql
- elk
depends_on:
- mysql
- filebeat
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
mysql:
image: mysql:8.0
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
ports:
- "3306:3306"
networks:
- mysql
restart: unless-stopped
networks:
elk:
driver: bridge
mysql:
driver: bridge
3단계: Filebeat 설정 파일 생성
filebeat.yml
filebeat.inputs:
- type: container
paths:
- '/var/lib/docker/containers/*/*.log'
processors:
- add_docker_metadata:
host: "unix:///var/run/docker.sock"
- add_fields:
fields:
service: wordpress
- dissect:
tokenizer: "%{client_ip} - - [%{timestamp}] \"%{http_method} %{request_path} %{http_version}\" %{response_code} %{response_size} \"%{referer}\" \"%{user_agent}\""
field: "message"
target_prefix: "apache"
when.contains.message: "GET"
- add_fields:
fields:
log_type: apache_access
when.has_fields: ["apache.client_ip"]
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
output.elasticsearch:
hosts: ["elasticsearch:9200"]
index: "wordpress-logs-%{+yyyy.MM.dd}"
setup.template.name: "wordpress-logs"
setup.template.pattern: "wordpress-logs-*"
setup.template.settings:
index.number_of_shards: 1
index.number_of_replicas: 0
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0644
4단계: 시스템 시작
5단계: WordPress 컨테이너 ID 확인 및 Filebeat 설정 업데이트
6단계: 테스트 로그 생성
7단계: Kibana 설정
- Kibana 접속: http://localhost:5601
- Data View 생성:
- Stack Management → Data Views → Create data view
- Index pattern: wordpress-logs-*
- Time field: @timestamp
- Create data view
- Discover에서 로그 확인:
- Discover 메뉴에서 wordpress-logs-* 선택
- 시간 범위를 "Last 1 hour" 또는 "Today"로 설정
- 필드 추가: apache.client_ip, apache.http_method, apache.request_path, apache.response_code
8단계: 대시보드 생성 (선택사항)
Visualization 예시:
- 요청 수: X축: @timestamp, Y축: Count
- 상태 코드별 분포: Pie chart, apache.response_code
- 상위 IP: Data table, apache.client_ip
- 상위 페이지: Data table, apache.request_path
문제 해결
인덱스가 보이지 않는 경우:
Filebeat 로그 확인:
WordPress 로그 확인:
수집되는 데이터 구조
핵심 포인트
- Logstash 제거: 복잡한 파싱 로직 대신 Filebeat의 dissect 프로세서 사용
- 직접 전송: Filebeat → Elasticsearch 직접 연결로 단순화
- 자동 파싱: Apache 로그를 구조화된 필드로 자동 분리
- 실시간 모니터링: WordPress 접속 시 즉시 Kibana에서 확인 가능

'만들기' 카테고리의 다른 글
| Grafana를 활용한 Apache 로그 실시간 통계 대시보드 구축 (0) | 2025.10.02 |
|---|---|
| docker, php github 프로젝트 & wordpress 프로젝트 : ELK 스택으로 Apache 로그 모니터링 시스템 구축 (0) | 2025.10.02 |
| (docker) php 로컬 개발환경 구축 (0) | 2025.10.02 |
| (docker) wordpress + mysql (0) | 2025.10.02 |