本教程适用于以下操作系统版本

  • Debian 12 (Bookworm)
  • Debian 11 (Bullseye)

本页内容

  • 先决条件
  • 步骤 1 - 配置防火墙
  • 步骤 2 - 安装 InfluxDB
  • 步骤 3 - 创建 InfluxDB 数据库与用户凭证
  • 步骤 4 - 安装 Telegraf
  • 步骤 5 - 验证 Telegraf 统计信息是否已存储到 InfluxDB
  • 步骤 6 - 安装 Grafana
  • 步骤 7 - 配置 Grafana 数据源
  • 步骤 8 - 配置 Grafana 仪表盘
  • 步骤 9 - 配置告警与通知、条件、规则、无数据及错误处理
  • 步骤 10 - 安装 Nginx
  • 步骤 11 - 安装 SSL
  • 步骤 12 - 为 Grafana 和 InfluxDB 配置 Nginx、为 HTTPS 配置 Telegraf、为 HTTPS 配置 Grafana、关闭 InfluxDB 与 Grafana 的防火墙端口
  • 结论
  • 条件
  • 规则
  • 无数据及错误处理
  • 为 HTTPS 配置 Telegraf
  • 为 HTTPS 配置 Grafana
  • 关闭 InfluxDB 与 Grafana 的防火墙端口

TIG(Telegraf、InfluxDB 和 Grafana)技术栈是一组开源工具平台的缩写,用于简化系统指标的采集、存储、绘图与告警。你可以从一处集中监控和可视化内存、磁盘空间、登录用户、系统负载、交换分区使用率、运行时长、运行中的进程等指标。该技术栈所使用的工具如下:

  • Telegraf - 是一个开源的指标采集代理,用于收集和发送来自数据库、系统和 IoT 传感器的数据及事件。它支持多种输出插件,如 InfluxDB、Graphite、Kafka 等,可将采集到的数据发送出去。
  • InfluxDB - 是一个用 Go 语言编写的开源时序数据库。它针对快速、高可用存储进行了优化,适用于任何涉及大量时间戳数据的场景,包括指标、事件和实时分析。
  • Grafana - 是一个开源的数据可视化和监控套件。它支持多种输入插件,如 Graphite、ElasticSearch、InfluxDB 等。它提供了美观的仪表盘和指标分析功能,让你可以可视化和监控各类系统指标与性能数据。

在本教程中,你将学习如何在单台 Debian 12 服务器上安装并配置 TIG 技术栈。

先决条件

  • 一台运行 Debian 12 的服务器,至少配备 1 GB 内存。
  • 一个具有 root 权限的非 sudo 用户。
  • 已启用并正在运行 uncomplicated 防火墙(UFW)。
  • 一个指向你服务器的完全限定域名(FQDN),例如 grafana.example.com。
  • 一个来自 Amazon SES 或 Mailgun 等邮件服务的 SMTP 账户,用于接收服务告警的邮件通知。
  • 确保所有软件都已更新。$ sudo apt update && sudo apt upgrade
  • 运行本教程和 Craft CMS 需要一些必要的软件包。其中部分可能已经安装在你的服务器上。$ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y

一台运行 Debian 12 的服务器,至少配备 1 GB 内存。

一个具有 root 权限的非 sudo 用户。

已启用并正在运行 uncomplicated 防火墙(UFW)。

一个指向你服务器的完全限定域名(FQDN),例如 grafana.example.com。

一个来自 Amazon SES 或 Mailgun 等邮件服务的 SMTP 账户,用于接收服务告警的邮件通知。

确保所有软件都已更新。

$ sudo apt update && sudo apt upgrade

运行本教程和 Craft CMS 需要一些必要的软件包。其中部分可能已经安装在你的服务器上。

$ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y

步骤 1 - 配置防火墙

在安装任何软件包之前,第一步是配置防火墙,开放 InfluxDB 和 Grafana 的端口。

检查防火墙的状态。

$ sudo ufw status

你应该会看到类似以下的输出。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

为 InfluxDB 开放 8086 端口,为 Grafana 服务器开放 3000 端口。

$ sudo ufw allow 8086
$ sudo ufw allow 3000

允许 HTTP 和 HTTPS 端口。

$ sudo ufw allow http
$ sudo ufw allow https

再次检查状态以确认。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
8086                       ALLOW       Anywhere
3000                       ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
8086 (v6)                  ALLOW       Anywhere (v6)
3000 (v6)                  ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

步骤 2 - 安装 InfluxDB

我们将使用 InfluxDB 的官方仓库来安装它。

下载 InfluxDB 的 GPG 密钥。

$ wget -q https://repos.influxdata.com/influxdata-archive_compat.key

将 GPG 密钥导入服务器。

$ echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
influxdata-archive_compat.key: OK

导入 InfluxDB 仓库。

$ echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list

更新系统的仓库列表。

$ sudo apt update

你可以选择安装 InfluxDB 1.8.x 或 2.0.x。不过,建议使用最新版本。安装 InfluxDB。

$ sudo apt install influxdb2

启动 InfluxDB 服务。

$ sudo systemctl start influxdb

检查该服务的状态。

$ sudo systemctl status influxdb
? influxdb.service - InfluxDB is an open-source, distributed, time series database
     Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-02 02:39:41 UTC; 1s ago
       Docs: https://docs.influxdata.com/influxdb/
    Process: 5584 ExecStart=/usr/lib/influxdb/scripts/influxd-systemd-start.sh (code=exited, status=0/SUCCESS)
   Main PID: 5585 (influxd)
      Tasks: 8 (limit: 2299)
     Memory: 53.1M
        CPU: 735ms
     CGroup: /system.slice/influxdb.service
             ??5585 /usr/bin/influxd
........

步骤 3 - 创建 InfluxDB 数据库与用户凭证

为了存储来自 Telegraf 的数据,你需要创建 Influx 数据库和用户。

InfluxDB 自带一个名为 influx 的命令行工具,用于与 InfluxDB 服务器交互。你可以把 influx 理解为类似 mysql 的命令行工具。

运行以下命令以执行 Influx 的初始配置。

$ influx setup
> Welcome to InfluxDB 2.0!
? Please type your primary username navjot
? Please type your password ***************
? Please type your password again ***************
? Please type your primary organization name howtoforge
? Please type your primary bucket name tigstack
? Please type your retention period in hours, or 0 for infinite 360
? Setup with these parameters?
  Username:          navjot
  Organization:      howtoforge
  Bucket:            tigstack
  Retention Period:  360h0m0s
 Yes
User    Organization    Bucket
navjot  howtoforge      tigstack

你需要设置初始用户名、密码、组织名称、用于存储数据的主存储桶(bucket)名称,以及该数据的保留时长(以小时计)。你的配置信息会保存在 /home/username/.influxdbv2/configs 文件中。

你也可以通过浏览器打开 http://:8086/ 来完成此设置。完成初始设置后,你可以使用上面创建的凭证登录该网址。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

你应该会看到如下仪表盘界面。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

初始设置过程会创建一个默认 token,它对数据库中所有组织拥有完整的读写权限。出于安全考虑,你需要创建一个新的 token,使其仅连接到我们想要连接的组织和存储桶。

要创建新的 token,请点击左侧边栏的如下图标,然后点击 API Tokens 链接继续。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

你将进入 API Tokens 页面。在这里,你会看到我们在初始配置时创建的默认 token。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Generate API Token(生成 API Token)按钮,并选择 Custom API Token(自定义 API Token)选项,弹出新的浮层窗口。为 Token 命名(telegraf),展开 Resources(资源)部分,并在 Read(读取)和 Write(写入)两个部分下都选择我们创建的默认存储桶。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Generate(生成)以完成 token 创建。点击 COPY TO CLIPBOARD(复制到剪贴板)按钮复制 token。该按钮在某些情况下可能不起作用,因此在关闭弹窗前请务必确认已复制成功。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

先将其保存好,因为我们稍后还会用到。

至此,InfluxDB 的安装与配置已完成。接下来,我们需要安装 Telegraf。

步骤 4 - 安装 Telegraf

Telegraf 与 InfluxDB 共用同一个仓库。这意味着你可以直接安装 Telegraf。

$ sudo apt install telegraf

Telegraf 的服务会在安装过程中自动启用并启动。

Telegraf 是一个插件驱动的代理,包含 4 种类型的插件:

  • 输入(Input)插件负责采集指标。
  • 处理器(Processor)插件负责转换、装饰和过滤指标。
  • 聚合器(Aggregator)插件负责创建并聚合指标。
  • 输出(Output)插件定义指标发送的目标位置,包括 InfluxDB。

Telegraf 将上述所有插件的配置保存在 /etc/telegraf/telegraf.conf 文件中。第一步是通过启用 influxdb_v2 输出插件将 Telegraf 连接到 InfluxDB。打开 /etc/telegraf/telegraf.conf 文件进行编辑。

$ sudo nano /etc/telegraf/telegraf.conf

找到 [[outputs.influxdb_v2]] 这一行,去掉前面的 # 注释符号以取消注释。然后按如下方式修改其下方的代码。

# # Configuration for sending metrics to InfluxDB 2.0
 [[outputs.influxdb_v2]]
#   ## The URLs of the InfluxDB cluster nodes.
#   ##
#   ## Multiple URLs can be specified for a single cluster, only ONE of the
#   ## urls will be written to each interval.
#   ##   ex: urls = ["https://us-west-2-1.aws.cloud2.influxdata.com"]
    urls = ["http://127.0.0.1:8086"]
#
#   ## Token for authentication.
   token = "$INFLUX_TOKEN"
#
#   ## Organization is the name of the organization you wish to write to.
   organization = "howtoforge"
#
#   ## Destination bucket to write into.
   bucket = "tigstack"

将之前保存的 InfluxDB token 值粘贴到上面代码中的 $INFLUX_TOKEN 变量位置。

搜索 INPUT PLUGINS(输入插件)这一行,你会看到默认启用的以下输入插件。

# Read metrics about cpu usage
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics
  collect_cpu_time = false
  ## If true, compute and report the sum of all non-idle CPU states
  report_active = false
  ## If true and the info is available then add core_id and physical_id tags
  core_tags = false


# Read metrics about disk usage by mount point
[[inputs.disk]]
  ## By default stats will be gathered for all mount points.
  ## Set mount_points will restrict the stats to only the specified mount points.
  # mount_points = ["/"]

  ## Ignore mount points by filesystem type.
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

  ## Ignore mount points by mount options.
  ## The 'mount' command reports options of all mounts in parathesis.
  ## Bind mounts can be ignored with the special 'bind' option.
  # ignore_mount_opts = []


# Read metrics about disk IO by device
[[inputs.diskio]]
....
....

# Get kernel statistics from /proc/stat
[[inputs.kernel]]
  # no configuration


# Read metrics about memory usage
[[inputs.mem]]
  # no configuration
  
# Get the number of processes and group them by status
[[inputs.processes]]
  # no configuration


# Read metrics about swap memory usage
[[inputs.swap]]
  # no configuration


# Read metrics about system load & uptime
[[inputs.system]]
  # no configuration

你可以根据需求配置额外的输入插件,包括 Apache Server、Docker 容器、Elasticsearch、iptables 防火墙、Kubernetes、Memcached、MongoDB、MySQL、Nginx、PHP-fpm、Postfix、RabbitMQ、Redis、Varnish、Wireguard、PostgreSQL 等。

完成后,按 Ctrl + X 并在提示时输入 Y 保存文件。

应用更改完成后,重启 Telegraf 服务。

$ sudo systemctl restart telegraf

步骤 5 - 验证 Telegraf 统计信息是否已存储到 InfluxDB

在继续之前,你需要验证 Telegraf 统计信息是否被正确采集并写入 InfluxDB。在浏览器中打开 InfluxDB UI,点击左侧边栏的第二个图标,然后选择 Buckets(存储桶)菜单。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 tigstack,你应该会看到如下页面。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击存储桶名称,然后点击 _measurement 过滤器中的某个值,并在其值出现时不断点击其他值。完成后,点击 Submit(提交)按钮。你应该在顶部看到一个图表。数据可能需要等待一段时间才会出现。我们将时间区间从 Past 1 h(过去 1 小时)调整为 Past 5m(过去 5 分钟),以便在更大范围内生成图表。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

这应能确认数据正在被正确传输。

步骤 6 - 安装 Grafana

我们将使用 Grafana 的官方仓库来安装它。导入 Grafana 的 GPG 密钥。

$ sudo mkdir -p /etc/apt/keyrings/
$ wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null

将该仓库添加到你的系统。

$ echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

如果你想安装 Grafana 测试版(beta),请改为添加以下仓库。

$ echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com beta main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

更新系统仓库列表。

$ sudo apt update

安装 Grafana。

$ sudo apt install grafana

启动并启用 Grafana 服务。

$ sudo systemctl enable grafana-server --now

检查服务状态。

$ sudo systemctl status grafana-server
? grafana-server.service - Grafana instance
     Loaded: loaded (/lib/systemd/system/grafana-server.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-02 03:48:01 UTC; 3s ago
       Docs: http://docs.grafana.org
   Main PID: 8769 (grafana)
      Tasks: 7 (limit: 2299)
     Memory: 42.6M
        CPU: 1.804s
     CGroup: /system.slice/grafana-server.service
             ??8769 /usr/share/grafana/bin/grafana server --config=/etc/grafana/grafana.ini --pidfile=/run/grafana/grafana-server.pid --packaging=deb cfg:default.paths.logs=/var/log/grafana cfg:default.paths...
.......

步骤 7 - 配置 Grafana 数据源

在浏览器中打开 http://:3000,你应该会看到如下 Grafana 登录页面。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

使用默认用户名 admin 和密码 admin 登录。接下来,你需要设置一个新的默认密码。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

你将看到如下 Grafana 主页。点击 Add your first data source(添加你的第一个数据源)按钮。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 InfluxDB 按钮。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

在下一页中,从下拉菜单中选择 Flux 作为查询语言。你也可以使用 InfluxQL 作为查询语言,但配置起来更复杂,因为它默认仅支持 InfluxDB v1.x。Flux 支持 InfluxDB v2.x,并且更易于设置和配置。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

输入以下数值。

URL: http://localhost:8086 Basic Auth Details User: navjot Password:

InfluxDB Details Organization: howtoforge Token: Default Bucket: tigstack

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Save and test(保存并测试)按钮,你应该会看到一条确认设置成功的提示信息。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

步骤 8 - 配置 Grafana 仪表盘

下一步是配置 Grafana 仪表盘。点击 Home 左侧的汉堡菜单,然后点击 Dashboards(仪表盘)以打开 Dashboard Create(创建仪表盘)界面。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Create Dashboard(创建仪表盘)按钮继续。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

在下一页中,点击 Add visualization(添加可视化)按钮以打开浮层,然后点击 influxdb-1 将其选为数据源。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

你将进入如下 Edit Panel(编辑面板)页面。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

在 Query Editor(查询编辑器)中粘贴以下代码。

from(bucket: "NAMEOFYOUBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "cpu")
  |> filter(fn: (r) => r["_field"] == "usage_idle")
  |> filter(fn: (r) => r["cpu"] == "cpu-total")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({ r with _value: r._value * -1.0 + 100.0 }))
  |> toFloat()
  |> yield(name: "mean")

使用我们上面用过的存储桶名称,以及主机名(你可以从 /etc/hostname 文件中获取)。

上述代码会计算 CPU 使用率并生成相应图表。为面板(Panel)设置一个标题。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Query inspector(查询检查器)按钮,然后点击 Refresh(刷新)按钮以验证查询是否正常工作。点击叉号图标关闭检查器。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

你也可以通过右侧 Axis(坐标轴)部分下的 Label(标签)字段为坐标轴命名。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Apply(应用)按钮保存面板。完成后点击 Save Dashboard(保存仪表盘)按钮。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

为仪表盘命名,然后点击 Save(保存)完成。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

它会打开该仪表盘,然后点击 Add Visualization(添加可视化)按钮以创建另一个面板。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

重复上述过程,为 RAM 使用率创建另一个面板。

from(bucket: "NAMEOFYOUBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "mem")
  |> filter(fn: (r) => r["_field"] == "used_percent")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "mean")

使用以下代码显示 HDD 使用率。

from(bucket: "NAMEOFYOURBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "disk")
  |> filter(fn: (r) => r["_field"] == "used")
  |> filter(fn: (r) => r["path"] == "/")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({ r with _value: r._value / 1000000.0 }))
  |> toFloat()  
  |> yield(name: "mean")

你可以创建不限数量的面板。

上述代码基于 Flux 脚本语言。幸运的是,你无需学习该语言即可编写查询。你可以从 InfluxDB 的 URL 生成查询。不过,学习该语言有助于优化查询。

你需要回到 InfluxDB 仪表盘并打开 Explore(探索)页面以获取查询。

点击存储桶名称,然后点击 _measurement 过滤器中的某个值,并在其值出现时不断点击其他值。完成后,点击 Script Editor(脚本编辑器)按钮,你应该会看到如下页面。图表也会随之更新。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

复制所显示的查询,现在你就可以在 Grafana 仪表盘中使用它来构建图表。

步骤 9 - 配置告警与通知

设置监控的主要目的是在数值超出某个阈值时及时收到告警。

第一步是设置你希望接收告警的目标位置。你可以通过 Email、Slack、Kafka、Google Hangouts Chat、Microsoft Teams、Telegram 等方式接收通知。

在本教程中,我们将启用邮件通知。要设置邮件通知,我们需要先配置 SMTP 服务。打开 /etc/grafana/grafana.ini 文件以配置 SMTP。

$ sudo nano /etc/grafana/grafana.ini

在其中找到 [smtp] 这一行。取消以下行的注释,并填入自定义 SMTP 服务器的相关数值。

[smtp]
enabled = true
host = email-smtp.us-west-2.amazonaws.com:587
user = YOURUSERNAME
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = YOURUSERPASSWORD
;cert_file =
;key_file =
;skip_verify = false
from_address = 
[email protected]

from_name = HowtoForge Grafana
# EHLO identity in SMTP dialog (defaults to instance_name)
;ehlo_identity = dashboard.example.com
# SMTP startTLS policy (defaults to 'OpportunisticStartTLS')
;startTLS_policy = NoStartTLS

按 Ctrl + X 并在提示时输入 Y 保存文件。

重启 Grafana 服务器以使设置生效。

$ sudo systemctl restart grafana-server

打开 Grafana 页面,点击 Alert(告警)图标,然后点击 Contact points(联系点)。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

Grafana 会自动创建并设置一个默认邮件联系点,需要为其配置正确的邮件地址。点击 grafana-default-email 联系点对应的编辑按钮。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

填写详细信息以设置邮件通知渠道。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

如果你想发送附加消息,请点击 Optional Email settings(可选邮件设置)链接并填写消息内容。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Test(测试)打开弹窗,然后点击 Send test notification(发送测试通知)按钮,以检查邮件设置是否正常工作。完成后点击 Save contact point(保存联系点)。

你应该会收到如下邮件,确认设置成功。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

既然我们已经设置好通知渠道,接下来需要设置何时接收这些邮件的告警。要设置告警,你需要回到仪表盘面板。

回到 Dashboards(仪表盘)界面。点击我们刚刚创建的仪表盘,你会看到包含不同面板的主页。要编辑面板,请点击面板名称,会弹出一个下拉菜单。点击 Edit(编辑)链接继续。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Alert Panel(告警面板),然后点击 New alert rule(新建告警规则)按钮以创建新的告警。我们这里为 CPU 使用率面板创建告警。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

现在你可以配置 Grafana 发送告警的条件。点击 Options(选项)链接下拉菜单,选择默认时间范围(now-6h 到 now),将时间范围更改为 Last 15 minutes(最近 15 分钟),这意味着它将检查从 15 分钟前到现在的时段。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

默认情况下,所选的告警类型是 Grafana 托管告警(Grafana managed alert)。默认会选中两个表达式。点击它们旁边的垃圾桶按钮将其删除。选择 Add expression(添加表达式)下拉菜单,并选择 Classic condition(经典条件)作为表达式类型。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

点击 Set as alert condition(设为告警条件)以选择用于发送告警的表达式。这样做会改变表达式框,如下图所示。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

条件

Grafana 通过以下格式的查询来决定何时触发告警。

avg() OF query(A) IS ABOVE 0.8
  • avg() 用于控制如何将每个序列的值缩减为可与阈值比较的值。你可以点击函数名称以选择不同的函数,例如 avg()、min()、max()、sum()、count() 等。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

  • query(A) 括号中的字母定义了要从 Metrics(指标)选项卡执行哪个查询。
  • IS BELOW 14 定义阈值的类型和阈值大小。你可以点击 IS BELOW 以选择不同的阈值类型。

query(A) 括号中的字母定义了要从 Metrics(指标)选项卡执行哪个查询。

IS BELOW 14 定义阈值的类型和阈值大小。你可以点击 IS BELOW 以选择不同的阈值类型。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

你可以通过点击第一个条件下方的 + 按钮在其下方添加第二个条件。目前,多个条件之间只能使用 AND 和 OR 运算符。

接下来,我们将设置评估行为。点击 New folder(新建文件夹)按钮创建一个用于存放规则的文件夹。点击 New evaluation group(新建评估组)按钮创建一个组,将规则归类在一起,这些规则会在相同的时间间隔后被评估。创建组时将时间间隔设置为 5m。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

完成后,页面应如下图所示。将“执行错误或超时的告警状态”设置为 Alerting(告警)。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

规则

  • Name(名称) - 为告警输入一个描述性名称
  • Folder(文件夹) - 创建或选择已有的文件夹来存储你的通知规则。
  • Group(组) - 为你的告警组输入名称。同一组内的告警会在相同的时间间隔后被评估。
  • Pending(等待) - 指定 Grafana 应多久评估一次告警。这也称为评估间隔。你可以在此处设置任意所需的值。

无数据及错误处理

你可以通过以下条件配置 Grafana 应如何处理返回无数据或仅包含空值(null)的查询:

  • No Data(无数据) - 将规则状态设置为 NoData
  • Alerting(告警) - 将规则状态设置为 Alerting
  • Ok(正常) - 将告警规则状态设置为 Ok,因为即使一切正常你也会收到告警。

你可以告诉 Grafana 如何处理执行错误或超时错误。

  • Alerting(告警) - 将规则状态设置为 Alerting
  • Ok(正常) - 将告警规则状态设置为 Ok,因为即使一切正常你也会收到告警。
  • Error(错误) - 将告警规则状态设置为 Error,以表明存在问题。

完成后,点击 Preview alerts(预览告警)按钮以查看一切是否正常。点击右上角的 Save rule and exit(保存规则并退出)按钮,完成告警添加。现在你应该会开始收到邮件告警。以下就是此类邮件的一个示例。

在 Debian 12 上安装 TIG 技术栈(Telegraf、InfluxDB 与 Grafana)

步骤 10 - 安装 Nginx

Debian 12 自带较旧版本的 Nginx。你需要下载 Nginx 官方仓库来安装最新版本。

导入 Nginx 的签名密钥。

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

添加 Nginx 主线(mainline)版本的仓库。

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

更新系统仓库。

$ sudo apt update

安装 Nginx。

$ sudo apt install nginx

验证安装。在 Debian 系统上,以下命令只有在加上 sudo 时才能正常工作。

$ sudo nginx -v
nginx version: nginx/1.25.3

启动 Nginx 服务器。

$ sudo systemctl start nginx

检查服务状态。

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-02 09:21:10 UTC; 5s ago
       Docs: https://nginx.org/en/docs/
    Process: 12964 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 12965 (nginx)
      Tasks: 3 (limit: 2299)
     Memory: 2.9M
        CPU: 86ms
     CGroup: /system.slice/nginx.service
             ??12965 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??12966 "nginx: worker process"
             ??12967 "nginx: worker process"

Jan 02 09:21:10 grafana systemd[1]: Starting nginx.service - nginx - high performance web server...
Jan 02 09:21:10 grafana systemd[1]: Started nginx.service - nginx - high performance web server.

步骤 11 - 安装 SSL

我们需要安装 Certbot 来生成 SSL 证书。你既可以使用 Debian 的仓库安装 Certbot,也可以通过 Snapd 工具获取最新版本。我们将使用 Snapd 版本。

Debian 12 默认未安装 Snapd。安装 Snapd 软件包。

$ sudo apt install snapd

运行以下命令以确保你的 Snapd 版本是最新的。

$ sudo snap install core && sudo snap refresh core

安装 Certbot。

$ sudo snap install --classic certbot

使用以下命令,通过创建指向 /usr/bin 目录的符号链接,确保 Certbot 命令可以运行。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

验证 Certbot 是否正常工作。

$ certbot --version
certbot 2.8.0

运行以下命令以生成 SSL 证书。

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m 
[email protected]
 -d grafana.example.com

上述命令会将证书下载到你服务器上的 /etc/letsencrypt/live/grafana.example.com 目录。

生成 Diffie-Hellman 组证书。

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

检查 Certbot 续期调度服务。

$ systemctl list-timers

你会发现 snap.certbot.renew.service 是计划运行的服务之一。

NEXT                        LEFT        LAST                        PASSED    UNIT                         ACTIVATES
-----------------------------------------------------------------------------------------------------------------------------------------
Tue 2024-01-02 15:24:52 UTC 6h left     Mon 2024-01-01 15:24:52 UTC 17h ago   systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Tue 2024-01-02 20:05:29 UTC 10h left    Tue 2024-01-02 09:02:47 UTC 21min ago apt-daily.timer              apt-daily.service
Tue 2024-01-02 20:35:00 UTC 11h left    -                           -         snap.certbot.renew.timer     snap.certbot.renew.service

对该过程进行一次试运行(dry run),以检查 SSL 续期是否正常工作。

$ sudo certbot renew --dry-run

如果没有看到错误,说明一切就绪。你的证书将自动续期。

步骤 12 - 为 Grafana 和 InfluxDB 配置 Nginx

打开 /etc/nginx/nginx.conf 文件进行编辑。

$ sudo nano /etc/nginx/nginx.conf

在 include /etc/nginx/conf.d/*.conf; 这一行之前添加以下行。

server_names_hash_bucket_size 64;

按 Ctrl + X 并在提示时输入 Y 保存文件。

创建并打开 /etc/nginx/conf.d/grafana.conf 文件进行编辑。

$ sudo nano /etc/nginx/conf.d/grafana.conf

在其中粘贴以下代码。将 grafana.example.com 替换为你的域名。

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

server {

    listen 443 ssl reuseport;
    listen [::]:443 ssl reuseport;

    http2 on;

    server_name grafana.example.com;

    access_log  /var/log/nginx/grafana.access.log;
    error_log   /var/log/nginx/grafana.error.log;

    ssl_certificate      /etc/letsencrypt/live/grafana.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/grafana.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/grafana.example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] valid=60s;
    resolver_timeout 2s;

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:3000;
    }

    location /api/live {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:3000;
	}

    location /influxdb/ {
     	access_log /var/log/nginx/influx.access.log;
        error_log /var/log/nginx/influx.error.log;
        rewrite ^/influxdb$ /influxdb/ permanent;
        rewrite ^/influxdb/(.*)$ /$1 break;
        proxy_cookie_path ~*^/api /influxdb/api;
        proxy_connect_timeout 600s;
        proxy_http_version 1.1;
        proxy_pass http://localhost:8086;
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
        proxy_set_header Authorization $http_authorization;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        sub_filter '<base href="/">' '<base href="/influxdb/">';
        sub_filter 'src="/' 'src="/influxdb/';
        sub_filter 'href="/' 'href="/influxdb/';
        sub_filter 'data-basepath="' 'data-basepath="/influxdb/';
        sub_filter 'n.p="/"' 'n.p="/influxdb/"';
        sub_filter 'o.p="/"' 'o.p="/influxdb/"';
        sub_filter '/api/' '/influxdb/api/';
        sub_filter 'api/v2/query' 'influxdb/api/v2/query';
        sub_filter '/health`' '/influxdb/health`';
        sub_filter_types text/css text/javascript application/javascript application/json;
        sub_filter_once off;
	}
}
# enforce HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name grafana.example.com;
    return 301 https://$host$request_uri;
}

按 Ctrl + X 并在提示时输入 Y 保存文件。

验证你的 Nginx 配置。

$ sudo nginx -t

重启 Nginx 服务器。

$ sudo systemctl restart nginx

为 HTTPS 配置 Telegraf

打开 /etc/telegraf/telegraf.conf 文件进行编辑。

$ sudo nano /etc/telegraf/telegraf.conf

搜索 [[outputs.influxdb_v2]] 部分,将 URL 的值更改为 https://grafana.nspeaks.com/influxdb,以确保 InfluxDB 与 Telegraf 之间的数据安全。

urls = ["https://grafana.example.com/influxdb"]

按 Ctrl + X 并在提示时输入 Y 保存文件。

重启 Telegraf 服务。

$ sudo systemctl restart telegraf

为 HTTPS 配置 Grafana

接下来,我们需要为 Grafana 配置 HTTPS 访问。打开 /etc/grafana/grafana.ini 文件进行编辑。

$ sudo nano /etc/grafana/grafana.ini

找到 [server] 部分,并按如下方式修改 domain 变量和 root_url。

# The public facing domain name used to access grafana from a browser
;domain = localhost
domain = grafana.example.com

# Redirect to correct domain if host header does not match domain
# Prevents DNS rebinding attacks
;enforce_domain = true

# The full public facing url you use in browser, used for redirects and emails
# If you use reverse proxy and sub path specify full url (with sub path)
;root_url = %(protocol)s://%(domain)s:%(http_port)s/
root_url = %(protocol)s://%(domain)s

按 Ctrl + X 并在提示时输入 Y 保存文件。

重启 Grafana 服务器。

$ sudo systemctl restart grafana-server

关闭 InfluxDB 与 Grafana 的防火墙端口

你还应该关闭 InfluxDB 和 Grafana 的端口。

$ sudo ufw delete allow 8086
$ sudo ufw delete allow 3000

Grafana 应该可以通过 https://grafana.example.com 访问,而 InfluxDB 的 UI 和 API 都应该可以通过 https://grafana.example.com/influxdb 访问。

结论

至此,关于在 Debian 12 服务器上安装并配置 TIG 技术栈的教程就结束了。如果你有任何问题,请在下方评论区留言。