本教程适用于以下操作系统版本
- 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://

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

初始设置过程会创建一个默认 token,它对数据库中所有组织拥有完整的读写权限。出于安全考虑,你需要创建一个新的 token,使其仅连接到我们想要连接的组织和存储桶。
要创建新的 token,请点击左侧边栏的如下图标,然后点击 API Tokens 链接继续。

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

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

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

先将其保存好,因为我们稍后还会用到。
至此,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(存储桶)菜单。

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

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

这应能确认数据正在被正确传输。
步骤 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://

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

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

点击 InfluxDB 按钮。

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

输入以下数值。
URL: http://localhost:8086 Basic Auth Details User: navjot Password:
InfluxDB Details Organization: howtoforge Token:

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

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

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

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

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

在 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)设置一个标题。

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

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

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

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

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

重复上述过程,为 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(脚本编辑器)按钮,你应该会看到如下页面。图表也会随之更新。


复制所显示的查询,现在你就可以在 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(联系点)。

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

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

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

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

既然我们已经设置好通知渠道,接下来需要设置何时接收这些邮件的告警。要设置告警,你需要回到仪表盘面板。
回到 Dashboards(仪表盘)界面。点击我们刚刚创建的仪表盘,你会看到包含不同面板的主页。要编辑面板,请点击面板名称,会弹出一个下拉菜单。点击 Edit(编辑)链接继续。

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

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

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


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

条件
Grafana 通过以下格式的查询来决定何时触发告警。
avg() OF query(A) IS ABOVE 0.8
- avg() 用于控制如何将每个序列的值缩减为可与阈值比较的值。你可以点击函数名称以选择不同的函数,例如 avg()、min()、max()、sum()、count() 等。

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

你可以通过点击第一个条件下方的 + 按钮在其下方添加第二个条件。目前,多个条件之间只能使用 AND 和 OR 运算符。
接下来,我们将设置评估行为。点击 New folder(新建文件夹)按钮创建一个用于存放规则的文件夹。点击 New evaluation group(新建评估组)按钮创建一个组,将规则归类在一起,这些规则会在相同的时间间隔后被评估。创建组时将时间间隔设置为 5m。

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

规则
- 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(保存规则并退出)按钮,完成告警添加。现在你应该会开始收到邮件告警。以下就是此类邮件的一个示例。

步骤 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 技术栈的教程就结束了。如果你有任何问题,请在下方评论区留言。