目录
在现代云原生应用中,使用 Docker 容器化部署 ELK Stack(Elasticsearch、Logstash 和 Kibana)来监控 Nginx 日志,能够有效提高系统的可维护性和扩展性。本文将详细介绍如何使用 Docker 部署 ELK Stack,并配置其监控 Nginx。
1. 什么是 ELK Stack?
ELK Stack 是一个强大的日志管理和分析平台,由以下组件组成:
- Elasticsearch:用于存储和搜索日志数据。
- Logstash:用于处理和转发日志数据。
- Kibana:用于可视化和分析数据。
通过将 Nginx 日志发送到 ELK Stack,用户可以实时监控网站的访问情况和性能。
2. 准备工作
在开始之前,请确保您的系统上已安装以下软件:
- Docker:容器化平台,用于构建和运行容器。
- Docker Compose:用于定义和管理多容器应用的工具。
可以通过以下命令安装 Docker 和 Docker Compose(以 Ubuntu 为例):
sudo apt update
sudo apt install docker.io docker-compose
安装完成后,确保 Docker 服务正在运行:
sudo systemctl start docker
sudo systemctl enable docker
3. 使用 Docker Compose 部署 ELK Stack
创建一个新的项目目录,例如 elk-nginx-monitor
,并在该目录下创建 docker-compose.yml
文件:
version: '3.7'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.6.3
container_name: elasticsearch
environment:
- discovery.type=single-node
- ELASTIC_PASSWORD=changeme # 设置 Elasticsearch 密码
ports:
- "9200:9200" # 映射端口
volumes:
- esdata:/usr/share/elasticsearch/data # 持久化数据
logstash:
image: docker.elastic.co/logstash/logstash:8.6.3
container_name: logstash
ports:
- "5044:5044" # Logstash 输入端口
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf # Logstash 配置文件
depends_on:
- elasticsearch # 确保 Elasticsearch 先启动
kibana:
image: docker.elastic.co/kibana/kibana:8.6.3
container_name: kibana
ports:
- "5601:5601" # Kibana 用户界面端口
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200 # Elasticsearch 地址
- ELASTICSEARCH_USERNAME=elastic # Elasticsearch 用户名
- ELASTICSEARCH_PASSWORD=changeme # Elasticsearch 密码
depends_on:
- elasticsearch # 确保 Elasticsearch 先启动
volumes:
esdata: # 定义数据卷
创建 Logstash 配置文件
在同一目录下创建 logstash.conf
文件,用于配置 Logstash 的输入、过滤和输出:
input {
beats {
port => 5044 # 定义接收 Beats 输入的端口
}
}
filter {
grok {
match => { "message" => "%{IPORHOST:client_ip} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:bytes}" }
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"] # 时间格式解析
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"] # 输出到 Elasticsearch
index => "nginx-access-%{+YYYY.MM.dd}" # 定义索引名称
user => "elastic"
password => "changeme"
}
}
4. 配置 Nginx 日志收集
接下来,确保 Nginx 将日志发送到 Logstash。可以使用 Filebeat 来收集 Nginx 日志并将其发送到 Logstash。
安装并配置 Filebeat
- 创建一个新的 Dockerfile,为 Filebeat 创建镜像:
FROM docker.elastic.co/beats/filebeat:8.6.3 # 使用官方 Filebeat 镜像
COPY filebeat.yml /usr/share/filebeat/filebeat.yml # 复制配置文件
- 创建
filebeat.yml
配置文件,内容如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log # 定义 Nginx 日志路径
output.logstash:
hosts: ["logstash:5044"] # 定义 Logstash 地址
- 修改
docker-compose.yml
文件,添加 Filebeat 服务:
filebeat:
build: . # 使用当前目录下的 Dockerfile
volumes:
- /var/log/nginx:/var/log/nginx:ro # 只读挂载 Nginx 日志
depends_on:
- logstash # 确保 Logstash 先启动
5. 访问 Kibana 并可视化数据
- 启动 ELK Stack:
在项目目录下运行以下命令启动所有服务:
docker-compose up -d
- 访问 Kibana:
打开浏览器,访问 http://localhost:5601
,确认 Kibana 是否正常运行。
- 配置索引模式:
在 Kibana 中,进入 “Management” -> “Index Patterns”,创建新的索引模式,输入 nginx-access-*
,选择时间字段为 @timestamp
。
- 创建可视化:
在 Kibana 中,选择 “Visualize”,可以创建各种图表,如请求量趋势、响应状态分布等。
总结
通过 Docker 部署 ELK Stack 来监控 Nginx,可以简化环境的配置和管理。使用 Filebeat 作为日志收集工具,可以轻松将 Nginx 日志发送到 Logstash,并利用 Kibana 实现数据的可视化。