Initial commit
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,94 @@
|
||||
Ansible 是一个开源的自动化工具,主要用于配置管理、应用部署、和任务自动化。它通过编写简单的人可读的配置文件(YAML 格式的剧本,称为Playbooks)来定义自动化流程。Ansible 不需要在被管理节点上安装任何代理程序,使用的是 SSH 协议进行通信,这使得它非常轻量且易于部署。
|
||||
|
||||
### Ansible 可以做什么:
|
||||
|
||||
1. **配置管理**:确保服务器的状态如期望的那样。例如,安装软件包、设置系统配置等等。
|
||||
2. **应用部署**:自动化应用程序的安装、升级和管理过程。
|
||||
3. **任务自动化**:可以自动化执行日常的维护和操作任务。
|
||||
4. **编排**:管理不同设备和服务之间的复杂工作流。
|
||||
|
||||
### 搭建流程:
|
||||
|
||||
1. **安装 Ansible**:
|
||||
- 首先确保你有一台控制节点(通常是你的本地开发机),以及一台或多台被管理节点。
|
||||
- 在控制节点上安装 Ansible。可以通过以下命令在大多数 Linux 发行版上安装:
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install ansible
|
||||
```
|
||||
|
||||
对于 macOS 用户,可以使用 Homebrew:
|
||||
|
||||
```bash
|
||||
brew install ansible
|
||||
```
|
||||
|
||||
2. **配置 SSH 访问**:
|
||||
- 确保 Ansible 控制节点可以通过 SSH 访问到被管理节点。
|
||||
- 你可以用 SSH 密钥对来配置无密码登录:
|
||||
|
||||
```bash
|
||||
ssh-keygen -t rsa
|
||||
ssh-copy-id user@managed_node_ip
|
||||
```
|
||||
|
||||
3. **设置清单文件**:
|
||||
- 创建一个清单文件用于定义被管理节点,可以命名为 `hosts.ini`:
|
||||
|
||||
```ini
|
||||
[webservers]
|
||||
192.168.0.101
|
||||
192.168.0.102
|
||||
|
||||
[databases]
|
||||
192.168.0.103
|
||||
```
|
||||
|
||||
4. **编写一个简单的 Playbook**:
|
||||
- 创建一个 YAML 文件,如 `site.yml`:
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Install and start Apache
|
||||
hosts: webservers
|
||||
become: yes
|
||||
tasks:
|
||||
- name: Ensure Apache is installed
|
||||
apt:
|
||||
name: apache2
|
||||
state: present
|
||||
|
||||
- name: Ensure Apache is running
|
||||
service:
|
||||
name: apache2
|
||||
state: started
|
||||
```
|
||||
|
||||
5. **运行 Ansible Playbook**:
|
||||
- 运行以下命令执行 Playbook:
|
||||
|
||||
```bash
|
||||
ansible-playbook -i hosts.ini site.yml
|
||||
```
|
||||
|
||||
### 测试一个小 Demo:
|
||||
|
||||
首先确保你控制节点配置好了 SSH 访问和清单文件。然后,创建一个简单的 Playbook 文件 `demo.yml`,内容如下:
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Echo message to managed nodes
|
||||
hosts: all
|
||||
tasks:
|
||||
- name: Echo Hello World
|
||||
command: echo "Hello World"
|
||||
```
|
||||
|
||||
运行如下命令来执行这个简单的 Playbook:
|
||||
|
||||
```bash
|
||||
ansible-playbook -i hosts.ini demo.yml
|
||||
```
|
||||
|
||||
这个 Playbook 将会在所有被管理节点上执行 `echo "Hello World"` 命令。通过这种小测试,可以确认 Ansible 环境的配置是否成功,并验证基础功能的正常运行。
|
||||
@@ -0,0 +1,138 @@
|
||||
---
|
||||
title: Docker容器目录组织
|
||||
created: 2025-07-23
|
||||
source: Cherry Studio
|
||||
tags: []
|
||||
---
|
||||
|
||||
# 推荐的目录结构
|
||||
|
||||
这个结构的核心思想是 **“配置”与“数据”分离**,并且 **每个应用/服务栈都是独立的模块**。
|
||||
|
||||
```
|
||||
/opt/docker/
|
||||
├── compose-projects/ # 存放所有 docker-compose 项目的目录
|
||||
│ ├── sub-store/ # sub-store 项目
|
||||
│ │ ├── docker-compose.yml
|
||||
│ │ └── .env # (可选但推荐) 环境变量文件
|
||||
│ │
|
||||
│ ├── portainer/ # 另一个项目,例如 Portainer
|
||||
│ │ ├── docker-compose.yml
|
||||
│ │ └── .env
|
||||
│ │
|
||||
│ └── another-service/ # 其他任何服务...
|
||||
│ ├── docker-compose.yml
|
||||
│ └── .env
|
||||
│
|
||||
└── appdata/ # 存放所有容器持久化数据的目录
|
||||
├── sub-store/ # sub-store 的数据
|
||||
│ └── ... (容器会自动在这里生成文件)
|
||||
│
|
||||
├── portainer/ # Portainer 的数据
|
||||
│ └── ...
|
||||
│
|
||||
└── another-service/ # 其他服务的数据
|
||||
└── ...
|
||||
```
|
||||
|
||||
# 为什么这个结构好?
|
||||
|
||||
1. **清晰分离**:`compose-projects` 目录只包含启动容器所需的配置文件 (`.yml`, `.env` 等),而 `appdata` 目录只包含容器运行时产生的数据。
|
||||
2. **易于管理**:想修改 `sub-store` 的配置?直接去 `/opt/docker/compose-projects/sub-store/` 就行了。想添加一个新服务?只需在 `compose-projects` 和 `appdata` 下创建对应的目录即可。
|
||||
3. **易于备份**:
|
||||
- 备份配置:`tar -czvf docker_config_backup.tar.gz /opt/docker/compose-projects`
|
||||
- 备份数据:`tar -czvf docker_data_backup.tar.gz /opt/docker/appdata`
|
||||
- 备份全部:`tar -czvf docker_full_backup.tar.gz /opt/docker`
|
||||
4. **可移植性**:通过使用 `.env` 文件,你的 `docker-compose.yml` 文件中不会有硬编码的绝对路径,这使得整个项目更容易迁移到另一台服务器。
|
||||
5. **安全性**:你可以为 `appdata` 目录设置更严格的权限,因为它包含了你的应用数据。
|
||||
|
||||
# 实践:配置你的 Sub-Store 项目
|
||||
|
||||
让我们按照上面的结构来配置你的 `sub-store`。
|
||||
|
||||
## 步骤 1: 创建目录结构
|
||||
|
||||
首先,在你的服务器上创建所需的目录。因为 `/opt` 目录通常需要 root 权限,所以我们使用 `sudo`。
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /opt/docker/compose-projects/sub-store
|
||||
sudo mkdir -p /opt/docker/appdata/sub-store
|
||||
```
|
||||
|
||||
## 步骤 2: 创建 `.env` 文件(推荐)
|
||||
|
||||
在 `sub-store` 的项目目录中创建一个 `.env` 文件。这个文件用来存放通用的、可能变化的环境变量,比如数据存储的根路径。
|
||||
|
||||
**文件路径**: `/opt/docker/compose-projects/sub-store/.env`
|
||||
|
||||
**文件内容**:
|
||||
|
||||
```ini
|
||||
# Docker 应用数据根目录
|
||||
APP_DATA_PATH=/opt/docker/appdata
|
||||
```
|
||||
|
||||
这样做的好处是,如果将来你决定把数据目录从 `/opt/docker/appdata` 换到别的地方(比如 `/srv/docker-data`),你只需要修改这一个 `.env` 文件里的路径,而不需要修改所有 `docker-compose.yml` 文件。
|
||||
|
||||
## 步骤 3: 修改并创建 `docker-compose.yml` 文件
|
||||
|
||||
现在,我们来修改你的 `sub-store` 的 `docker-compose.yml` 文件,使其适应新的结构并利用我们刚刚创建的 `.env` 文件。
|
||||
|
||||
**文件路径**: `/opt/docker/compose-projects/sub-store/docker-compose.yml`
|
||||
|
||||
**文件内容**:
|
||||
|
||||
```yaml
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
sub-store:
|
||||
image: xream/sub-store:latest
|
||||
container_name: sub-store
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:3001:3001"
|
||||
volumes:
|
||||
# 使用 .env 文件中定义的变量来构建路径
|
||||
# ${APP_DATA_PATH} 会被替换为 /opt/docker/appdata
|
||||
# 最终的路径是 /opt/docker/appdata/sub-store
|
||||
- "${APP_DATA_PATH}/sub-store:/opt/app/data"
|
||||
environment:
|
||||
SUB_STORE_BACKEND_SYNC_CRON: "55 23 * * *"
|
||||
SUB_STORE_FRONTEND_BACKEND_PATH: "/4yBiAh65rxCFkPk0CbPj"
|
||||
# 设置时区,对定时任务(CRON)很重要
|
||||
TZ: "Asia/Shanghai"
|
||||
```
|
||||
|
||||
**关键改动**:
|
||||
|
||||
- `volumes`: 原来的 `- /opt/docker-data/sub-store:/opt/app/data` 被改成了 `- "${APP_DATA_PATH}/sub-store:/opt/app/data"`。`docker compose` 会自动读取同目录下的 `.env` 文件,并将 `${APP_DATA_PATH}` 替换为 `/opt/docker/appdata`。这样就实现了配置和路径的解耦。
|
||||
- `environment`: 我额外增加了一个 `TZ` 环境变量。设置正确的时区对于依赖 `CRON` 定时任务的应用非常重要,否则它可能会在错误的时间执行。
|
||||
|
||||
## 步骤 4: 启动容器
|
||||
|
||||
现在,你的目录结构已经准备好了。你可以启动你的服务了。
|
||||
|
||||
```bash
|
||||
# 1. 进入你的 sub-store 项目目录
|
||||
cd /opt/docker/compose-projects/sub-store/
|
||||
|
||||
# 2. 以后台模式启动服务
|
||||
# Docker 会自动读取当前目录的 docker-compose.yml 和 .env 文件
|
||||
# 注意:新版本的命令是 `docker compose` (没有横杠)
|
||||
sudo docker compose up -d
|
||||
|
||||
# 3. 检查容器是否正在运行
|
||||
sudo docker compose ps
|
||||
```
|
||||
|
||||
# 总结
|
||||
|
||||
当你需要添加新服务时,比如一个 Nginx Proxy Manager,你只需要重复以上步骤:
|
||||
|
||||
1. 创建目录:`sudo mkdir -p /opt/docker/compose-projects/npm` 和 `sudo mkdir -p /opt/docker/appdata/npm`
|
||||
2. 在 `npm` 目录下创建 `docker-compose.yml` 和可选的 `.env` 文件。
|
||||
3. 在 `docker-compose.yml` 中,将数据卷映射到 `${APP_DATA_PATH}/npm`。
|
||||
4. `cd /opt/docker/compose-projects/npm` 然后 `sudo docker compose up -d`。
|
||||
|
||||
这个结构会让你在管理越来越多的 Docker 服务时,保持清晰、高效和从容。
|
||||
@@ -0,0 +1,975 @@
|
||||
# 1. 环境准备
|
||||
|
||||
```bash
|
||||
# 更新系统包
|
||||
sudo apt update && sudo apt full-upgrade -y
|
||||
|
||||
# 安装必要的依赖
|
||||
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg
|
||||
|
||||
# 提高文件描述符限制
|
||||
sudo vim /etc/security/limits.conf
|
||||
|
||||
# 提高文件描述符限制,在 limits.conf 文件末尾添加
|
||||
sudo vim /etc/security/limits.conf
|
||||
elasticsearch soft nofile 65535
|
||||
elasticsearch hard nofile 65535
|
||||
```
|
||||
|
||||
# 2. Elasticsearch
|
||||
|
||||
## 添加 Elastic 官方仓库
|
||||
|
||||
```bash
|
||||
# 添加 Elastic GPG 密钥
|
||||
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
|
||||
|
||||
# 添加 Elastic 仓库
|
||||
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
|
||||
```
|
||||
|
||||
## 安装 Elasticsearch
|
||||
|
||||
```bash
|
||||
sudo apt update && sudo apt install -y elasticsearch=8.13.*
|
||||
```
|
||||
|
||||
Elasticsearch 会自动生成密码和令牌。
|
||||
|
||||
## 调整启动内存
|
||||
|
||||
```bash
|
||||
# ES 8.x+ 推荐的内存配置方式是在 jvm.options.d 目录下创建覆盖文件,文件名可以是任意 .options 后缀的文件
|
||||
sudo vim /etc/elasticsearch/jvm.options
|
||||
|
||||
-Xms512m
|
||||
-Xmx512m
|
||||
```
|
||||
|
||||
# 3. Kibana
|
||||
|
||||
```bash
|
||||
sudo apt install -y kibana=8.13.*
|
||||
```
|
||||
|
||||
# 4. Logstash
|
||||
|
||||
```bash
|
||||
sudo apt install -y logstash=1:8.13.*
|
||||
```
|
||||
|
||||
# 5. Filebeat
|
||||
|
||||
```bash
|
||||
sudo apt install -y filebeat=8.13.*
|
||||
```
|
||||
|
||||
# 6. 基本配置
|
||||
|
||||
## Elasticsearch 配置
|
||||
|
||||
```bash
|
||||
sudo vim /etc/elasticsearch/elasticsearch.yml
|
||||
```
|
||||
|
||||
修改以下配置
|
||||
|
||||
```yaml
|
||||
# ======================== Elasticsearch 配置 (单机测试版) =========================
|
||||
|
||||
# ---------------------------------- 集群与节点 -----------------------------------
|
||||
# 集群名称
|
||||
cluster.name: my-elk-stack
|
||||
# 节点名称
|
||||
node.name: node-1
|
||||
|
||||
# ----------------------------------- 路径 ------------------------------------
|
||||
# 数据存储目录
|
||||
path.data: /var/lib/elasticsearch
|
||||
# 日志文件目录
|
||||
path.logs: /var/log/elasticsearch
|
||||
|
||||
# ---------------------------------- 网络 -----------------------------------
|
||||
# 监听所有网络接口的请求,这样Kibana和Logstash才能连接到它
|
||||
# 如果你只想在本机访问,可以设置为 localhost
|
||||
network.host: 0.0.0.0
|
||||
# HTTP端口
|
||||
http.port: 9200
|
||||
|
||||
# --------------------------------- 发现 ----------------------------------
|
||||
# 对于单节点集群,这是最简单的发现配置
|
||||
discovery.type: single-node
|
||||
|
||||
# ---------------------------------- 安全 -----------------------------------
|
||||
# 完全禁用安全功能,方便测试
|
||||
xpack.security.enabled: false
|
||||
xpack.security.enrollment.enabled: false
|
||||
xpack.security.http.ssl.enabled: false
|
||||
xpack.security.transport.ssl.enabled: false
|
||||
```
|
||||
|
||||
## Kibana 配置
|
||||
|
||||
```bash
|
||||
sudo vim /etc/kibana/kibana.yml
|
||||
```
|
||||
|
||||
修改以下配置
|
||||
|
||||
```yaml
|
||||
# /etc/kibana/kibana.yml
|
||||
|
||||
# ---------------------------------- 服务器设置 -----------------------------------
|
||||
# Kibana 服务端口
|
||||
server.port: 5601
|
||||
|
||||
# 监听所有网络接口,这样你可以从任何地方访问 Kibana UI
|
||||
# 如果你只想在本机通过 localhost:5601 访问,可以设置为 "localhost"
|
||||
server.host: "0.0.0.0"
|
||||
|
||||
# 给你的 Kibana 实例起个名字,会显示在浏览器标签页上
|
||||
server.name: "My Nginx Logs Dashboard"
|
||||
|
||||
# -------------------------------- Elasticsearch 连接 ---------------------------------
|
||||
# 指定 Elasticsearch 的地址。因为安全功能已禁用,所以使用 http 协议。
|
||||
# 如果 Kibana 和 Elasticsearch 在同一台服务器上,使用 localhost 是最佳选择。
|
||||
elasticsearch.hosts: ["http://localhost:9200"]
|
||||
|
||||
# (可选) 设置请求超时时间,单位毫秒
|
||||
# elasticsearch.requestTimeout: 30000
|
||||
|
||||
# ---------------------------------- 日志 -----------------------------------
|
||||
# (可选) 如果你不想让日志打印到控制台,可以取消注释
|
||||
# logging.dest: /var/log/kibana/kibana.log
|
||||
# logging.quiet: true
|
||||
|
||||
# ---------------------------------- 语言 -----------------------------------
|
||||
i18n.locale: "zh-CN"
|
||||
```
|
||||
|
||||
## Logstash 配置
|
||||
|
||||
创建一个简单的 Logstash 配置
|
||||
|
||||
```bash
|
||||
sudo vim /etc/logstash/conf.d/01-test.conf
|
||||
```
|
||||
|
||||
添加以下内容
|
||||
|
||||
```shell
|
||||
# /etc/logstash/conf.d/02-nginx-pipeline.conf
|
||||
|
||||
# ============================ 输入 (Input) =============================
|
||||
# 定义一个输入,监听来自 Beats (Filebeat) 的数据
|
||||
input {
|
||||
beats {
|
||||
# Filebeat 连接到 Logstash 的端口
|
||||
port => 5044
|
||||
}
|
||||
}
|
||||
|
||||
# ============================ 过滤器 (Filter) ============================
|
||||
# Filebeat 的 Nginx 模块已经对日志进行了预处理和解析。
|
||||
# 所以在这里,我们通常不需要再用 grok 等复杂插件进行解析。
|
||||
# 这个 filter 块可以保持为空,或者用于添加一些自定义的字段。
|
||||
filter {
|
||||
# 例如,可以添加一个标签
|
||||
# mutate {
|
||||
# add_tag => [ "from_logstash" ]
|
||||
# }
|
||||
}
|
||||
|
||||
# ============================ 输出 (Output) ==============================
|
||||
# 定义数据发送到哪里
|
||||
output {
|
||||
# 发送到 Elasticsearch
|
||||
elasticsearch {
|
||||
# Elasticsearch 的地址,同样使用 http
|
||||
hosts => ["http://localhost:9200"]
|
||||
|
||||
# 索引名称。Filebeat 模块通常会自带 index 字段,
|
||||
# Logstash 会优先使用它。这里设置一个备用格式。
|
||||
# 变量 `[@metadata][beat]` 来自 Filebeat,通常是 "filebeat"。
|
||||
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
|
||||
}
|
||||
|
||||
# (可选, 用于调试) 在 Logstash 的控制台打印日志,方便查看数据是否正常接收
|
||||
# stdout {
|
||||
# codec => rubydebug
|
||||
# }
|
||||
}
|
||||
```
|
||||
|
||||
## Filebeat 配置
|
||||
|
||||
```bash
|
||||
sudo vim /etc/filebeat/filebeat.yml
|
||||
```
|
||||
|
||||
配置为收集系统日志
|
||||
|
||||
### 配置一
|
||||
|
||||
```yaml
|
||||
filebeat.inputs:
|
||||
|
||||
- type: filestream
|
||||
|
||||
id: my-filestream-id
|
||||
|
||||
enabled: false
|
||||
|
||||
paths:
|
||||
- /var/log/*.log
|
||||
|
||||
filebeat.config.modules:
|
||||
path: ${path.config}/modules.d/*.yml
|
||||
|
||||
reload.enabled: false
|
||||
|
||||
|
||||
setup.template.settings:
|
||||
index.number_of_shards: 1
|
||||
|
||||
# setup.kibana:
|
||||
|
||||
output.elasticsearch:
|
||||
hosts: ["localhost:9200"]
|
||||
preset: balanced
|
||||
indices:
|
||||
- index: "ibs-portal-%{+yyyy.MM.dd}"
|
||||
when.equals:
|
||||
fields.log_index: "ibs-portal"
|
||||
|
||||
processors:
|
||||
- add_host_metadata:
|
||||
when.not.contains.tags: forwarded
|
||||
- add_cloud_metadata: ~
|
||||
- add_docker_metadata: ~
|
||||
- add_kubernetes_metadata: ~
|
||||
|
||||
|
||||
filebeat.inputs:
|
||||
- type: log
|
||||
enabled: true
|
||||
paths:
|
||||
- /opt/MyLogs/monitorJsonLog.log
|
||||
- /opt/MyLogs/noticeAlarmLog.log
|
||||
fields:
|
||||
log_index: "ibs-portal"
|
||||
|
||||
setup.kibana:
|
||||
host: "localhost:5601"
|
||||
|
||||
```
|
||||
|
||||
### 配置二(Ng 采集)
|
||||
|
||||
filebeat 模块启用查询
|
||||
|
||||
```bash
|
||||
sudo filebeat modules list
|
||||
```
|
||||
|
||||
启用 Nginx 模块
|
||||
|
||||
```bash
|
||||
sudo filebeat modules enable nginx
|
||||
```
|
||||
|
||||
配置 Nginx 模块
|
||||
|
||||
```bash
|
||||
sudo vim /etc/filebeat/modules.d/nginx.yml
|
||||
```
|
||||
|
||||
修改文件内容如下:
|
||||
|
||||
```yaml
|
||||
# /etc/filebeat/modules.d/nginx.yml
|
||||
|
||||
- module: nginx
|
||||
# Nginx access log
|
||||
access:
|
||||
enabled: true
|
||||
# !! 重要:修改为你服务器上 Nginx access 日志的实际路径 !!
|
||||
# 使用 * 通配符可以匹配日志轮转后的文件,如 access.log, access.log.1
|
||||
var.paths: ["/var/log/nginx/access.log*"]
|
||||
|
||||
# Nginx error log
|
||||
error:
|
||||
enabled: true
|
||||
# !! 重要:修改为你服务器上 Nginx error 日志的实际路径 !!
|
||||
var.paths: ["/var/log/nginx/error.log*"]
|
||||
```
|
||||
|
||||
配置 Filebeat 主文件,让 Filebeat 把数据发送给 Logstash,而不是直接发给 Elasticsearch。
|
||||
|
||||
```bash
|
||||
sudo vim /etc/filebeat/filebeat.yml
|
||||
```
|
||||
|
||||
找到 `output` 部分,进行如下修改:
|
||||
|
||||
```yaml
|
||||
# /etc/filebeat/filebeat.yml
|
||||
|
||||
# ... (其他 filebeat.inputs 部分可以保持默认或注释掉) ...
|
||||
# filebeat.inputs:
|
||||
# - type: filestream
|
||||
# ...
|
||||
|
||||
# ================================== Outputs ===================================
|
||||
|
||||
# ---------------------------- Elasticsearch Output ----------------------------
|
||||
# !! 重要:注释掉整个 Elasticsearch output 部分 !!
|
||||
# 我们不希望 Filebeat 直接连接 Elasticsearch,而是通过 Logstash。
|
||||
# output.elasticsearch:
|
||||
# hosts: ["localhost:9200"]
|
||||
|
||||
# ------------------------------ Logstash Output -------------------------------
|
||||
# !! 重要:取消注释并配置 Logstash output 部分 !!
|
||||
output.logstash:
|
||||
# Logstash 服务器的地址和端口 (与 Logstash input 配置中一致)
|
||||
hosts: ["localhost:5044"]
|
||||
|
||||
# ... (其他设置保持默认) ...
|
||||
```
|
||||
|
||||
测试配置和运行
|
||||
|
||||
```bash
|
||||
# 测试配置文件
|
||||
sudo filebeat test config
|
||||
|
||||
# 测试 Elasticsearch 连接(如果使用 ES 输出)
|
||||
sudo filebeat test output
|
||||
|
||||
# 加载索引模板
|
||||
sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["localhost:9200"]'
|
||||
```
|
||||
|
||||
加载索引模板主要功能说明:
|
||||
|
||||
1. `--index-management` - 设置索引生命周期管理 (ILM) 策略
|
||||
2. 创建索引模板 - 定义字段映射和设置
|
||||
3. 创建 Kibana 仪表板 - 预制的可视化界面
|
||||
4. 设置采集端点 - 配置数据采集管道
|
||||
|
||||
# 7. 启动服务并验证
|
||||
|
||||
## 启动
|
||||
|
||||
```bash
|
||||
sudo systemctl enable elasticsearch kibana logstash filebeat
|
||||
|
||||
sudo systemctl start elasticsearch
|
||||
|
||||
sudo systemctl start kibana
|
||||
|
||||
sudo systemctl start logstash
|
||||
|
||||
sudo systemctl start filebeat
|
||||
```
|
||||
|
||||
## 验证
|
||||
|
||||
```bash
|
||||
# 检查每个服务的状态
|
||||
sudo systemctl status elasticsearch
|
||||
sudo systemctl status kibana
|
||||
sudo systemctl status logstash
|
||||
sudo systemctl status filebeat
|
||||
|
||||
# 检查 Elasticsearch 是否正常运行
|
||||
curl -X GET http://localhost:9200
|
||||
```
|
||||
|
||||
## 访问 Kibana
|
||||
|
||||
在浏览器中访问:`http://192.168.126.100:5601`
|
||||
|
||||
如果启用了安全功能,使用 `elastic` 用户和安装时提供的密码登录。
|
||||
|
||||
# 8. Elasticsearch 命令参考
|
||||
|
||||
## 获取所有索引
|
||||
|
||||
```elasticsearch
|
||||
GET /_cat/indices?v
|
||||
```
|
||||
|
||||
## 查询特定索引中的所有文档
|
||||
|
||||
```elasticsearch
|
||||
GET ibs/_search
|
||||
{
|
||||
"query": {
|
||||
"match_all": {}
|
||||
},
|
||||
"sort": [
|
||||
{
|
||||
"@timestamp": {
|
||||
"order": "desc"
|
||||
}
|
||||
}
|
||||
],
|
||||
"size": 20
|
||||
}
|
||||
```
|
||||
|
||||
## 搜索消息中包含特定关键词的文档
|
||||
|
||||
```elasticsearch
|
||||
GET ibs-portal-2025.04.18/_search
|
||||
{
|
||||
"query": {
|
||||
"bool": {
|
||||
"should": [
|
||||
{ "match": { "message": "话单" }},
|
||||
{ "match": { "message": "查询" }},
|
||||
{ "match": { "message": "通话记录" }},
|
||||
{ "match": { "message": "CDR" }},
|
||||
{ "match": { "message": "billing" }}
|
||||
]
|
||||
}
|
||||
},
|
||||
"sort": [{ "@timestamp": { "order": "desc" }}],
|
||||
"size": 20
|
||||
}
|
||||
```
|
||||
|
||||
## 从特定日志文件中搜索文档
|
||||
|
||||
```elasticsearch
|
||||
GET ibs-portal-2025.04.18/_search
|
||||
{
|
||||
"query": {
|
||||
"bool": {
|
||||
"must": [
|
||||
{
|
||||
"terms": {
|
||||
"log.file.path.keyword": [ "/opt/MyLogs/noticeAlarmLog.log" ]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"sort": [
|
||||
{
|
||||
"@timestamp": {
|
||||
"order": "desc"
|
||||
}
|
||||
}
|
||||
],
|
||||
"size": 20
|
||||
}
|
||||
```
|
||||
|
||||
## 创建具有特定设置和映射的新索引
|
||||
|
||||
```elasticsearch
|
||||
PUT /ibs-portal
|
||||
{
|
||||
"settings": {
|
||||
"number_of_shards": 1,
|
||||
"number_of_replicas": 1
|
||||
},
|
||||
"mappings": {
|
||||
"properties": {
|
||||
"field1": {
|
||||
"type": "text"
|
||||
},
|
||||
"field2": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"@timestamp": {
|
||||
"type": "date"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
# 9. 生成测试的 Nginx 日志
|
||||
|
||||
创建测试脚本来生成各种 HTTP 状态码的请求:
|
||||
|
||||
```bash
|
||||
# 创建测试脚本
|
||||
sudo tee /tmp/generate_nginx_test_logs.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
NGINX_LOG_DIR="/var/log/nginx"
|
||||
NGINX_ACCESS_LOG="$NGINX_LOG_DIR/access.log"
|
||||
|
||||
# 确保日志目录存在
|
||||
sudo mkdir -p $NGINX_LOG_DIR
|
||||
|
||||
# 生成测试日志条目的函数
|
||||
generate_log_entry() {
|
||||
local method=$1
|
||||
local status=$2
|
||||
local path=$3
|
||||
local timestamp=$(date '+%d/%b/%Y:%H:%M:%S %z')
|
||||
local ip="192.168.1.$((RANDOM % 255))"
|
||||
local user_agent="Mozilla/5.0 (Test User Agent)"
|
||||
local response_size=$((RANDOM % 5000 + 100))
|
||||
|
||||
# Nginx 标准日志格式
|
||||
echo "$ip - - [$timestamp] \"$method $path HTTP/1.1\" $status $response_size \"-\" \"$user_agent\""
|
||||
}
|
||||
|
||||
# 清空现有日志(可选)
|
||||
# sudo truncate -s 0 $NGINX_ACCESS_LOG
|
||||
|
||||
# 生成各种测试日志
|
||||
echo "生成测试 Nginx 访问日志..."
|
||||
|
||||
# 正常请求 (200)
|
||||
for i in {1..5}; do
|
||||
generate_log_entry "GET" "200" "/index.html" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
generate_log_entry "POST" "200" "/api/login" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
generate_log_entry "GET" "200" "/images/logo.png" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
done
|
||||
|
||||
# 404 错误
|
||||
for i in {1..3}; do
|
||||
generate_log_entry "GET" "404" "/nonexistent-page.html" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
generate_log_entry "POST" "404" "/api/invalid-endpoint" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
done
|
||||
|
||||
# 500 错误
|
||||
for i in {1..2}; do
|
||||
generate_log_entry "GET" "500" "/api/crash" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
generate_log_entry "POST" "500" "/api/error" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
done
|
||||
|
||||
# 其他状态码
|
||||
generate_log_entry "GET" "301" "/old-page" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
generate_log_entry "GET" "403" "/admin" | sudo tee -a $NGINX_ACCESS_LOG
|
||||
|
||||
echo "测试日志生成完成!"
|
||||
echo "日志文件位置: $NGINX_ACCESS_LOG"
|
||||
echo "内容示例:"
|
||||
sudo tail -5 $NGINX_ACCESS_LOG
|
||||
EOF
|
||||
|
||||
# 给脚本执行权限并运行
|
||||
sudo chmod +x /tmp/generate_nginx_test_logs.sh
|
||||
sudo /tmp/generate_nginx_test_logs.sh
|
||||
```
|
||||
|
||||
# 10. ELK 脚本
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
|
||||
# ==============================================================================
|
||||
# ELK Stack (Elasticsearch, Kibana, Logstash, Filebeat) 一键安装脚本
|
||||
#
|
||||
# 支持系统: Ubuntu 24.04 LTS
|
||||
# 目标版本: ELK v8.7.*
|
||||
#
|
||||
# 使用方法:
|
||||
# 1. 保存此脚本为 install_elk_stack.sh
|
||||
# 2. chmod +x install_elk_stack.sh
|
||||
# 3. sudo ./install_elk_stack.sh
|
||||
# ==============================================================================
|
||||
|
||||
# --- 配置段 ---
|
||||
ELK_VERSION="8.7.*"
|
||||
LOGSTASH_VERSION="1:8.7.*"
|
||||
|
||||
# --- 脚本设置 ---
|
||||
# -e: 当命令失败时,立即退出脚本
|
||||
# -u: 当使用未定义的变量时,立即退出脚本
|
||||
# -o pipefail: 管道中的任何命令失败,整个管道都视为失败
|
||||
set -euo pipefail
|
||||
|
||||
# --- 颜色定义 ---
|
||||
readonly C_RESET='\033[0m'
|
||||
readonly C_RED='\033[0;31m'
|
||||
readonly C_GREEN='\033[0;32m'
|
||||
readonly C_YELLOW='\033[0;33m'
|
||||
readonly C_BLUE='\033[0;34m'
|
||||
|
||||
# --- 日志函数 ---
|
||||
log_info() {
|
||||
echo -e "${C_BLUE}[INFO] $1${C_RESET}"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${C_GREEN}[SUCCESS] $1${C_RESET}"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${C_YELLOW}[WARNING] $1${C_RESET}"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${C_RED}[ERROR] $1${C_RESET}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# --- 权限检查 ---
|
||||
check_root() {
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
log_error "此脚本需要以 root 权限运行。请使用 'sudo ./install_elk_stack.sh'"
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 1. 环境准备 ---
|
||||
prepare_environment() {
|
||||
log_info "1. 开始准备系统环境..."
|
||||
|
||||
log_info "安装必要的依赖..."
|
||||
apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg
|
||||
|
||||
log_info "提高 Elasticsearch 的文件描述符限制..."
|
||||
local limits_conf="/etc/security/limits.conf"
|
||||
if ! grep -q "elasticsearch soft nofile 65535" "$limits_conf"; then
|
||||
echo "elasticsearch soft nofile 65535" >> "$limits_conf"
|
||||
echo "elasticsearch hard nofile 65535" >> "$limits_conf"
|
||||
log_success "文件描述符限制已设置。"
|
||||
else
|
||||
log_info "文件描述符限制已存在,跳过设置。"
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 2. 添加 Elastic 官方仓库 ---
|
||||
add_elastic_repo() {
|
||||
log_info "2. 添加 Elastic 官方 APT 仓库..."
|
||||
|
||||
local key_path="/usr/share/keyrings/elasticsearch-keyring.gpg"
|
||||
local repo_path="/etc/apt/sources.list.d/elastic-8.x.list"
|
||||
|
||||
if [ ! -f "$key_path" ]; then
|
||||
log_info "添加 Elastic GPG 密钥..."
|
||||
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o "$key_path"
|
||||
else
|
||||
log_info "Elastic GPG 密钥已存在,跳过。"
|
||||
fi
|
||||
|
||||
if [ ! -f "$repo_path" ]; then
|
||||
log_info "添加 Elastic 仓库源..."
|
||||
echo "deb [signed-by=$key_path] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee "$repo_path" > /dev/null
|
||||
else
|
||||
log_info "Elastic 仓库源已存在,跳过。"
|
||||
fi
|
||||
|
||||
log_info "更新 APT 软件包列表..."
|
||||
apt update
|
||||
}
|
||||
|
||||
# --- 3. 安装和配置组件 ---
|
||||
install_components() {
|
||||
log_info "3. 开始安装 ELK 组件..."
|
||||
|
||||
# 安装 Elasticsearch
|
||||
log_info "正在安装 Elasticsearch v${ELK_VERSION}..."
|
||||
apt install -y "elasticsearch=${ELK_VERSION}"
|
||||
log_success "Elasticsearch 安装完成。"
|
||||
|
||||
log_warn "=========================== 重要提示 ==========================="
|
||||
log_warn "Elasticsearch 安装过程已自动生成密码和令牌。"
|
||||
log_warn "================================================================"
|
||||
# 增加一个短暂的暂停,让用户有时间看到这个重要信息
|
||||
sleep 5
|
||||
|
||||
log_info "调整 Elasticsearch JVM 堆内存为 512m..."
|
||||
local jvm_options_dir="/etc/elasticsearch/jvm.options.d"
|
||||
mkdir -p "$jvm_options_dir"
|
||||
cat <<EOF > "${jvm_options_dir}/heap_size.options"
|
||||
-Xms512m
|
||||
-Xmx512m
|
||||
EOF
|
||||
log_success "JVM 堆内存已配置。"
|
||||
|
||||
# 安装 Kibana
|
||||
log_info "正在安装 Kibana v${ELK_VERSION}..."
|
||||
apt install -y "kibana=${ELK_VERSION}"
|
||||
log_success "Kibana 安装完成。"
|
||||
|
||||
# 安装 Logstash
|
||||
log_info "正在安装 Logstash v${LOGSTASH_VERSION}..."
|
||||
apt install -y "logstash=${LOGSTASH_VERSION}"
|
||||
log_success "Logstash 安装完成。"
|
||||
|
||||
# 安装 Filebeat
|
||||
log_info "正在安装 Filebeat v${ELK_VERSION}..."
|
||||
apt install -y "filebeat=${ELK_VERSION}"
|
||||
log_success "Filebeat 安装完成。"
|
||||
}
|
||||
|
||||
# --- 4. 配置 Elasticsearch ---
|
||||
configure_elasticsearch() {
|
||||
log_info "4. 配置 Elasticsearch..."
|
||||
|
||||
local es_config="/etc/elasticsearch/elasticsearch.yml"
|
||||
local es_backup="${es_config}.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
|
||||
# 备份原配置文件
|
||||
if [ -f "$es_config" ]; then
|
||||
log_info "备份原配置文件到: ${es_backup}"
|
||||
cp "$es_config" "$es_backup"
|
||||
fi
|
||||
|
||||
# 写入新的配置文件(完全覆盖)
|
||||
log_info "写入 Elasticsearch 配置..."
|
||||
cat > "$es_config" <<'EOF'
|
||||
# ======================== Elasticsearch 配置 (单机测试版) =========================
|
||||
|
||||
# ---------------------------------- 集群与节点 -----------------------------------
|
||||
# 集群名称
|
||||
cluster.name: my-elk-stack
|
||||
# 节点名称
|
||||
node.name: node-1
|
||||
|
||||
# ----------------------------------- 路径 ------------------------------------
|
||||
# 数据存储目录
|
||||
path.data: /var/lib/elasticsearch
|
||||
# 日志文件目录
|
||||
path.logs: /var/log/elasticsearch
|
||||
|
||||
# ---------------------------------- 网络 -----------------------------------
|
||||
# 监听所有网络接口的请求,这样Kibana和Logstash才能连接到它
|
||||
# 如果你只想在本机访问,可以设置为 localhost
|
||||
network.host: 0.0.0.0
|
||||
# HTTP端口
|
||||
http.port: 9200
|
||||
|
||||
# --------------------------------- 发现 ----------------------------------
|
||||
# 对于单节点集群,这是最简单的发现配置
|
||||
discovery.type: single-node
|
||||
|
||||
# ---------------------------------- 安全 -----------------------------------
|
||||
# 完全禁用安全功能,方便测试
|
||||
xpack.security.enabled: false
|
||||
xpack.security.enrollment.enabled: false
|
||||
xpack.security.http.ssl.enabled: false
|
||||
xpack.security.transport.ssl.enabled: false
|
||||
EOF
|
||||
|
||||
log_success "Elasticsearch 配置完成。备份文件: ${es_backup}"
|
||||
}
|
||||
|
||||
# --- 5. 配置 Kibana ---
|
||||
configure_kibana() {
|
||||
log_info "5. 配置 Kibana..."
|
||||
|
||||
local kibana_config="/etc/kibana/kibana.yml"
|
||||
local kibana_backup="${kibana_config}.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
|
||||
# 备份原配置文件
|
||||
if [ -f "$kibana_config" ]; then
|
||||
log_info "备份原配置文件到: ${kibana_backup}"
|
||||
cp "$kibana_config" "$kibana_backup"
|
||||
fi
|
||||
|
||||
# 写入新的配置文件(完全覆盖)
|
||||
log_info "写入 Kibana 配置..."
|
||||
cat > "$kibana_config" <<'EOF'
|
||||
# /etc/kibana/kibana.yml
|
||||
|
||||
# ---------------------------------- 服务器设置 -----------------------------------
|
||||
# Kibana 服务端口
|
||||
server.port: 5601
|
||||
|
||||
# 监听所有网络接口,这样你可以从任何地方访问 Kibana UI
|
||||
# 如果你只想在本机通过 localhost:5601 访问,可以设置为 "localhost"
|
||||
server.host: "0.0.0.0"
|
||||
|
||||
# 给你的 Kibana 实例起个名字,会显示在浏览器标签页上
|
||||
server.name: "My Nginx Logs Dashboard"
|
||||
|
||||
# -------------------------------- Elasticsearch 连接 ---------------------------------
|
||||
# 指定 Elasticsearch 的地址。因为安全功能已禁用,所以使用 http 协议。
|
||||
# 如果 Kibana 和 Elasticsearch 在同一台服务器上,使用 localhost 是最佳选择。
|
||||
elasticsearch.hosts: ["http://localhost:9200"]
|
||||
|
||||
# (可选) 设置请求超时时间,单位毫秒
|
||||
# elasticsearch.requestTimeout: 30000
|
||||
|
||||
# ---------------------------------- 日志 -----------------------------------
|
||||
# (可选) 如果你不想让日志打印到控制台,可以取消注释
|
||||
# logging.dest: /var/log/kibana/kibana.log
|
||||
# logging.quiet: true
|
||||
|
||||
# ---------------------------------- 语言 -----------------------------------
|
||||
i18n.locale: "zh-CN"
|
||||
EOF
|
||||
|
||||
log_success "Kibana 配置完成。备份文件: ${kibana_backup}"
|
||||
}
|
||||
|
||||
# --- 6. 配置 Logstash ---
|
||||
configure_logstash() {
|
||||
log_info "6. 配置 Logstash..."
|
||||
|
||||
local logstash_conf_dir="/etc/logstash/conf.d"
|
||||
local logstash_pipeline="${logstash_conf_dir}/02-nginx-pipeline.conf"
|
||||
|
||||
# 确保配置目录存在
|
||||
mkdir -p "$logstash_conf_dir"
|
||||
|
||||
# 创建 Logstash pipeline 配置文件(新建,无需备份)
|
||||
log_info "创建 Logstash pipeline 配置文件..."
|
||||
cat > "$logstash_pipeline" <<'EOF'
|
||||
# /etc/logstash/conf.d/02-nginx-pipeline.conf
|
||||
|
||||
# ============================ 输入 (Input) =============================
|
||||
# 定义一个输入,监听来自 Beats (Filebeat) 的数据
|
||||
input {
|
||||
beats {
|
||||
# Filebeat 连接到 Logstash 的端口
|
||||
port => 5044
|
||||
}
|
||||
}
|
||||
|
||||
# ============================ 过滤器 (Filter) ============================
|
||||
# Filebeat 的 Nginx 模块已经对日志进行了预处理和解析。
|
||||
# 所以在这里,我们通常不需要再用 grok 等复杂插件进行解析。
|
||||
# 这个 filter 块可以保持为空,或者用于添加一些自定义的字段。
|
||||
filter {
|
||||
# 例如,可以添加一个标签
|
||||
# mutate {
|
||||
# add_tag => [ "from_logstash" ]
|
||||
# }
|
||||
}
|
||||
|
||||
# ============================ 输出 (Output) ==============================
|
||||
# 定义数据发送到哪里
|
||||
output {
|
||||
# 发送到 Elasticsearch
|
||||
elasticsearch {
|
||||
# Elasticsearch 的地址,同样使用 http
|
||||
hosts => ["http://localhost:9200"]
|
||||
|
||||
# 索引名称。Filebeat 模块通常会自带 index 字段,
|
||||
# Logstash 会优先使用它。这里设置一个备用格式。
|
||||
# 变量 `[@metadata][beat]` 来自 Filebeat,通常是 "filebeat"。
|
||||
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
|
||||
}
|
||||
|
||||
# (可选, 用于调试) 在 Logstash 的控制台打印日志,方便查看数据是否正常接收
|
||||
# stdout {
|
||||
# codec => rubydebug
|
||||
# }
|
||||
}
|
||||
EOF
|
||||
|
||||
log_success "Logstash 配置完成。配置文件: ${logstash_pipeline}"
|
||||
}
|
||||
|
||||
# --- 7. 启动和启用服务 ---
|
||||
enable_and_start_services() {
|
||||
log_info "7. 启动和启用 ELK 服务..."
|
||||
|
||||
# 启用开机自启动
|
||||
log_info "设置服务开机自启动..."
|
||||
systemctl enable elasticsearch.service
|
||||
systemctl enable kibana.service
|
||||
systemctl enable logstash.service
|
||||
log_success "服务已设置为开机自启动。"
|
||||
|
||||
# 启动服务
|
||||
log_info "启动 Elasticsearch..."
|
||||
systemctl start elasticsearch.service
|
||||
log_success "Elasticsearch 已启动。"
|
||||
|
||||
log_info "启动 Kibana..."
|
||||
systemctl start kibana.service
|
||||
log_success "Kibana 已启动。"
|
||||
|
||||
log_info "启动 Logstash..."
|
||||
systemctl start logstash.service
|
||||
log_success "Logstash 已启动。"
|
||||
|
||||
# 等待服务启动
|
||||
log_info "等待服务完全启动(15秒)..."
|
||||
sleep 15
|
||||
}
|
||||
|
||||
# --- 8. 检查服务状态 ---
|
||||
check_services_status() {
|
||||
log_info "8. 检查服务状态..."
|
||||
|
||||
echo ""
|
||||
log_info "========== Elasticsearch 状态 =========="
|
||||
systemctl status elasticsearch.service --no-pager -l || true
|
||||
|
||||
echo ""
|
||||
log_info "========== Kibana 状态 =========="
|
||||
systemctl status kibana.service --no-pager -l || true
|
||||
|
||||
echo ""
|
||||
log_info "========== Logstash 状态 =========="
|
||||
systemctl status logstash.service --no-pager -l || true
|
||||
|
||||
echo ""
|
||||
log_info "========== Elasticsearch 健康检查 =========="
|
||||
if curl -s http://localhost:9200 > /dev/null 2>&1; then
|
||||
curl -s http://localhost:9200
|
||||
log_success "Elasticsearch HTTP 接口响应正常。"
|
||||
else
|
||||
log_warn "Elasticsearch HTTP 接口未响应,可能还在启动中。"
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 9. 显示最终信息 ---
|
||||
show_final_message() {
|
||||
echo ""
|
||||
echo ""
|
||||
log_success "=========================================="
|
||||
log_success " ELK Stack 安装和配置完成!"
|
||||
log_success "=========================================="
|
||||
echo ""
|
||||
log_info "已安装组件:"
|
||||
echo " - Elasticsearch ${ELK_VERSION}"
|
||||
echo " - Kibana ${ELK_VERSION}"
|
||||
echo " - Logstash ${LOGSTASH_VERSION}"
|
||||
echo " - Filebeat ${ELK_VERSION}"
|
||||
echo ""
|
||||
log_info "服务访问地址:"
|
||||
echo " - Elasticsearch: http://localhost:9200"
|
||||
echo " - Kibana UI: http://localhost:5601"
|
||||
echo " - Logstash Beats: localhost:5044"
|
||||
echo ""
|
||||
log_info "配置文件位置:"
|
||||
echo " - Elasticsearch: /etc/elasticsearch/elasticsearch.yml"
|
||||
echo " - Kibana: /etc/kibana/kibana.yml"
|
||||
echo " - Logstash: /etc/logstash/conf.d/02-nginx-pipeline.conf"
|
||||
echo ""
|
||||
log_info "备份文件位置:"
|
||||
echo " - 原配置文件已备份到 *.backup.YYYYMMDD_HHMMSS"
|
||||
echo ""
|
||||
log_info "常用管理命令:"
|
||||
echo " - 查看服务状态: sudo systemctl status elasticsearch|kibana|logstash"
|
||||
echo " - 重启服务: sudo systemctl restart elasticsearch|kibana|logstash"
|
||||
echo " - 查看日志: sudo journalctl -u elasticsearch|kibana|logstash -f"
|
||||
echo ""
|
||||
log_warn "注意事项:"
|
||||
echo " 1. 所有服务已设置为开机自启动"
|
||||
echo " 2. 安全功能已禁用,仅适用于测试环境"
|
||||
echo " 3. 生产环境请务必启用安全功能"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# --- 主函数 ---
|
||||
main() {
|
||||
check_root
|
||||
prepare_environment
|
||||
add_elastic_repo
|
||||
install_components
|
||||
configure_elasticsearch
|
||||
configure_kibana
|
||||
configure_logstash
|
||||
enable_and_start_services
|
||||
check_services_status
|
||||
show_final_message
|
||||
}
|
||||
|
||||
# --- 脚本执行入口 ---
|
||||
main "$@"
|
||||
```
|
||||
@@ -0,0 +1,61 @@
|
||||
# filebeat 验证版本
|
||||
|
||||
> 整个 ELK 均采用 8.* 版本自测。
|
||||
|
||||
```
|
||||
filebeat version 8.7.1 (amd64)
|
||||
```
|
||||
|
||||
# 关键设置
|
||||
|
||||
paths 需改为实际日志存放位置。fields 是为了方便后见进行日志索引名称定义和日志切割。
|
||||
|
||||
```yaml
|
||||
- type: filestream
|
||||
id: nginx-portal-input
|
||||
enabled: true
|
||||
paths:
|
||||
- /opt/portalaccess5.log
|
||||
|
||||
# 添加一个自定义字段,用于在后面处理时区分日志类型
|
||||
fields:
|
||||
log_type: nginx_portal
|
||||
fields_under_root: true
|
||||
```
|
||||
|
||||
indices 实现索引名称定义。
|
||||
|
||||
```yaml
|
||||
output.elasticsearch:
|
||||
# Array of hosts to connect to.
|
||||
hosts: ["localhost:9200"]
|
||||
indices:
|
||||
- index: "nginx_portal-%{+yyyy.MM.dd}"
|
||||
when.equals:
|
||||
log_type: "nginx_portal"
|
||||
```
|
||||
|
||||
> dissect 用于按固定分隔符(|)快速拆分日志字段。
|
||||
|
||||
```yaml
|
||||
- dissect:
|
||||
when:
|
||||
equals:
|
||||
log_type: "nginx_portal"
|
||||
|
||||
field: "message"
|
||||
|
||||
# 切割出来的字段都会自动加上 nginx. 前缀
|
||||
target_prefix: "nginx"
|
||||
|
||||
# 切割模板:对应 ng 的 log_format
|
||||
# %{?ignore} 代表对应位置的 "-" 符号,不要了
|
||||
tokenizer: "%{record_end_time_utc}|%{upstream_addr}|%{remote_addr}|%{server_addr}|%{request_method}|%{server_protocol}|%{host}|%{request_uri}|%{http_user_agent}|%{http_referer}|%{sent_http_content_type}|%{status}|%{?ignore}|%{server_port}|%{bytes_sent}|%{request_start_time_utc}|%{request_end_time_utc}|%{header_response_time_utc}|%{?ignore}|%{?ignore}|%{upstream_status}|%{hostnamex}|%{http_CMCDN_Auth_Token}|%{cp_id}|%{sub_action_type}|%{action_type}|%{request_time}|%{upstream_response_time}"
|
||||
|
||||
- timestamp:
|
||||
field: "nginx.record_end_time_utc"
|
||||
target_field: "@timestamp"
|
||||
layouts:
|
||||
- "20060102T150405Z"
|
||||
timezone: "UTC"
|
||||
```
|
||||
Reference in New Issue
Block a user