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

  • Debian 12(Bookworm)
  • Debian 11(Bullseye)
  • Debian 10(Buster)
  • Debian 9(Stretch)

本页内容

  • 前提条件
  • 步骤 1 - 配置防火墙
  • 步骤 2 - 安装 NetData
  • 步骤 3 - 安装 Nginx
  • 步骤 4 - 安装 SSL
  • 步骤 5 - 配置 Nginx
  • 步骤 6 - 访问并使用 Netdata 仪表盘
  • 步骤 7 - 配置 NetData(配置 NetData 内存使用量 / 关闭遥测 / 长期存储 / 降低采集频率)
  • 步骤 8 - 配置 Slack 通知
  • 步骤 9 - 配置邮件通知
  • 步骤 10 - 测试通知渠道
  • 步骤 11 - 配置系统监控
  • 步骤 12 - 配置 Nginx 监控(监控 Nginx 日志)
  • 步骤 13 - 配置 MySQL/MariaDB 监控
  • 步骤 14 - 配置 PHP-FPM 监控(配置 PHP / 将 PHP 设置添加到 Nginx)
  • 步骤 15 - 配置 Docker 引擎与容器监控
  • 小结
  • 配置 NetData 内存使用量
  • 关闭遥测
  • 长期存储
  • 降低采集频率
  • 监控 Nginx 日志
  • 配置 PHP
  • 将 PHP 设置添加到 Nginx

Netdata 是一款面向 Linux 操作系统的开源监控系统。它通过精美且详细的仪表盘提供实时的性能监控。它提供数百种工具来监控服务器、CPU、内存使用率、系统进程、磁盘使用率、IPv4 和 IPv6 网络、系统防火墙,以及 Nginx、MySQL、MongoDB、Redis、ElasticSearch、PostgreSQL、PHP-FPM 等应用程序。它还可以与其他监控工具集成,例如 Prometheus、Graphite、Kafka、Grafana 等。

本教程将介绍如何在 Debian 12 服务器上使用 Netdata 安装并监控各项服务。你还将使用它来跟踪 LEMP 技术栈和 Docker 引擎的各项指标。

前提条件

  • 一台运行 Debian 12 的服务器。
  • 一个具有 sudo 权限的非 root 用户。
  • 一个指向你服务器的完全限定域名(FQDN),例如 netdata.example.com。
  • 一个电子邮件服务商(如 Amazon SES 或 Mailgun)的 SMTP 账户。
  • 确保所有软件包都是最新的。 $ sudo apt update $ sudo apt upgrade
  • 系统所需的部分软件包。$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y 其中部分软件包可能已在你的系统上安装。

一台运行 Debian 12 的服务器。

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

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

一个电子邮件服务商(如 Amazon SES 或 Mailgun)的 SMTP 账户。

确保所有软件包都是最新的。

$ sudo apt update
$ sudo apt upgrade

系统所需的部分软件包。

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

其中部分软件包可能已在你的系统上安装。

步骤 1 - 配置防火墙

第一步是配置防火墙。Debian 默认自带 ufw(Uncomplicated Firewall,简易防火墙)。

检查防火墙是否正在运行。

$ sudo ufw status

你将看到如下输出。

Status: inactive

放行 SSH 端口,以免启用防火墙时中断当前连接。

$ sudo ufw allow OpenSSH

同时放行 HTTP 和 HTTPS 端口。

$ sudo ufw allow http
$ sudo ufw allow https

启用防火墙

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

再次检查防火墙的状态。

$ sudo ufw status

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

Status: active

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

步骤 2 - 安装 NetData

Netdata 自带一个可在任意 Linux 发行版上运行的安装脚本。运行以下命令下载安装脚本。

$ wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh

使用以下命令运行安装脚本。

$ sudo sh /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry

--stable-channel 标志用于安装 Netdata 的稳定版本。--disable-telemetry 标志可阻止 Netdata 向他们的服务器提交匿名统计数据。你还可以使用其他标志来自定义安装程序。

输入 Y 以确认添加 Netdata 仓库并将其安装到你的服务器上。安装成功后,你应该会看到如下输出。

Successfully installed the Netdata Agent.

Official documentation can be found online at https://learn.netdata.cloud/docs/.

Looking to monitor all of your infrastructure with Netdata? Check out Netdata Cloud at https://app.netdata.cloud.

Join our community and connect with us on:
  - GitHub: https://github.com/netdata/netdata/discussions
  - Discord: https://discord.gg/5ygS846fR6
  - Our community forums: https://community.netdata.cloud/
[/root]# rm -rf /tmp/netdata-kickstart-wH4pebXveT
 OK

Netdata 安装程序会自动启用并启动该服务。检查服务的状态。

$ sudo systemctl status netdata
? netdata.service - Real time performance monitoring
     Loaded: loaded (/lib/systemd/system/netdata.service; enabled; preset: enabled)
     Active: active (running) since Thu 2023-08-24 10:26:56 UTC; 42s ago
   Main PID: 2811 (netdata)
      Tasks: 82 (limit: 1107)
     Memory: 108.2M
        CPU: 4.271s
     CGroup: /system.slice/netdata.service
             ??2811 /usr/sbin/netdata -D -P /var/run/netdata/netdata.pid
             ??2822 /usr/sbin/netdata --special-spawn-server
             ??3127 bash /usr/libexec/netdata/plugins.d/tc-qos-helper.sh 1
             ??3137 /usr/libexec/netdata/plugins.d/go.d.plugin 1
             ??3142 /usr/libexec/netdata/plugins.d/ebpf.plugin 1
             ??3145 /usr/libexec/netdata/plugins.d/nfacct.plugin 1
             ??3149 /usr/libexec/netdata/plugins.d/systemd-journal.plugin 1
             ??3155 /usr/libexec/netdata/plugins.d/debugfs.plugin 1
             ??3159 /usr/libexec/netdata/plugins.d/apps.plugin 1

Aug 24 10:26:58 netdata ebpf.plugin[3142]: set name of thread 3188 to EBPF SOFTIRQ
.......

如果你的服务未启动或未启用,可以使用以下命令完成。

$ sudo systemctl enable netdata --now

运行以下命令检查已开放的端口以及使用这些端口的进程。

$ sudo ss -plnt | grep netdata

你应该会看到类似的输出。如以下输出所示,Netdata 使用端口 19999 提供仪表盘。Netdata 使用端口 8125 接收来自其他应用程序的统计数据。

State  Recv-Q Send-Q      Local Address:Port  Peer Address:Port    Process
LISTEN 0      4096         0.0.0.0:19999      0.0.0.0:*            users:(("netdata",pid=2811,fd=8))
LISTEN 0      4096       127.0.0.1:8125       0.0.0.0:*            users:(("netdata",pid=2811,fd=47))
LISTEN 0      4096           [::1]:8125          [::]:*            users:(("netdata",pid=2811,fd=46))
LISTEN 0      4096            [::]:19999         [::]:*            users:(("netdata",pid=2811,fd=9))

步骤 3 - 安装 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 稳定版的仓库。

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

更新系统软件源。

$ sudo apt update

安装 Nginx 和 Apache 工具包。htpasswd 工具需要 Apache 工具包。

$ sudo apt install nginx apache2-utils

验证安装。在 Debian 系统上,以下命令需要配合 sudo 才能运行。

$ sudo nginx -v
nginx version: nginx/1.24.0

启动 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 Thu 2023-08-24 11:36:34 UTC; 4s ago
       Docs: https://nginx.org/en/docs/
    Process: 3657 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 3658 (nginx)
      Tasks: 2 (limit: 1107)
     Memory: 1.8M
        CPU: 12ms
     CGroup: /system.slice/nginx.service
             ??3658 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??3659 "nginx: worker process"

步骤 4 - 安装 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.6.0

生成 SSL 证书。

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

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

生成 Diffie-Hellman 组证书。

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

检查 Certbot 续期调度服务。

$ sudo systemctl list-timers

你会发现 snap.certbot.renew.service 是被安排运行的服务之一。

NEXT                        LEFT          LAST                        PASSED      UNIT                         ACTIVATES
.....
Thu 2023-08-24 13:40:00 UTC 1h 59min left -                           -           snap.certbot.renew.timer     snap.certbot.renew.service
Thu 2023-08-24 18:47:23 UTC 7h left       Thu 2023-08-24 09:30:41 UTC 2h 9min ago apt-daily.timer              apt-daily.service
Fri 2023-08-25 00:00:00 UTC 12h left      -                           -           dpkg-db-backup.timer         dpkg-db-backup.service

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

$ sudo certbot renew --dry-run

如果未出现错误,说明配置完成。你的证书将自动续期。

步骤 5 - 配置 Nginx

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

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

在其中粘贴以下代码。

# Define netdata upstream
upstream netdata {
    server 127.0.0.1:19999;
    keepalive 64;
}

# Redirect all non-encrypted to encrypted
server {
    listen 80;
    listen [::]:80;
    server_name netdata.example.com;
    return 301 https://netdata.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    
    server_name netdata.example.com;

    ssl_certificate     /etc/letsencrypt/live/netdata.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/netdata.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/netdata.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers off;
    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] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    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;

    access_log /var/log/nginx/netdata.example.com.access.log main;
    error_log  /var/log/nginx/netdata.example.com.error.log;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
    	proxy_pass http://netdata;
    	proxy_http_version 1.1;
        proxy_pass_request_headers on;
        proxy_set_header Connection "keep-alive";
        proxy_store off;
        auth_basic "NetData Private Area";
	    auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

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

打开文件 /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 保存文件。

运行以下命令生成密码文件,以启用 HTTP 认证。

$ sudo htpasswd -c /etc/nginx/.htpasswd netadmin
New password: 
Re-type new password: 
Adding password for user netadmin

验证 Nginx 配置文件语法。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启 Nginx 服务以使新配置生效。

$ sudo systemctl restart nginx

步骤 6 - 访问并使用 Netdata 仪表盘

你应该可以通过 URL https://netdata.example.com 访问 Netdata。首次访问时,系统会提示你输入 HTTP 认证信息。

在 Debian 12 上用 Netdata 监控服务器与服务

你将看到如下仪表盘。

在 Debian 12 上用 Netdata 监控服务器与服务

你可以随时使用仪表盘上的播放按钮暂停、停止和启动监控。

在 Debian 12 上用 Netdata 监控服务器与服务

你可以点击右侧边栏中的选项来访问各种仪表盘。

默认情况下,Netdata 可以正确跟踪你的时区。如果不正确,请点击计时器,并在弹出的窗口中选择正确的时区进行更改。

在 Debian 12 上用 Netdata 监控服务器与服务

步骤 7 - 配置 NetData

Netdata 将其主配置存储在 /etc/netdata/netdata.conf 文件中。你可以在浏览器中访问 URL https://netdata.example.com/netdata.conf 来查看这些设置。

在 Debian 12 上用 Netdata 监控服务器与服务

该文件分为多个部分,例如 [global]、[db]、[web]、[registry] 等。默认配置已足以让我们开始使用。Netdata 使用两类插件来收集数据:

  • internal 插件使用 C 语言编写,并作为线程在 netdata 守护进程内部运行。
  • external 插件使用多种语言编写,包括 Python、Go 等,并由 netdata 守护进程作为长时间运行的独立进程启动。它们通过管道(pipes)与 Netdata 守护进程通信。

配置 NetData 内存使用量

NetData 的 RAM 使用量取决于你希望将记录的图表数据保留多久才丢失。

  • 保留 3600 秒(即 1 小时)的图表数据会使用 15 MB 的 RAM。
  • 保留 7200 秒(即 2 小时)的图表数据会使用 30 MB 的 RAM。
  • 保留 14400 秒(即 4 小时)的图表数据会使用 60 MB 的 RAM。

每当你将图表数据保留时间加倍,RAM 需求也会加倍。这些 RAM 需求基于默认仪表盘所使用的图表数量。添加更多图表和应用程序会改变这些估算值。

打开 Netdata 配置文件。

$ sudo nano /etc/netdata/netdata.conf

在 [global] 部分下添加一行 history = 14400。

[global]
    run as user = netdata

    # default storage size - increase for longer data retention
    page cache size = 32
    dbengine multihost disk space = 256
    history = 14400

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

关闭遥测

默认情况下,Netdata 会使用产品分析平台 Posthog 收集匿名使用信息。每次启动或停止 Netdata 守护进程时,Netdata 都会使用匿名统计脚本收集以下系统信息并发送给自身。

  • Netdata 版本
  • 操作系统名称、版本、id、id_like
  • 内核名称、版本、架构
  • 虚拟化技术
  • 容器化技术
  • 关于 Netdata 客户端故障的附加信息。

我们在安装过程中已关闭遥测,但如果你没有关闭,现在可以操作。在 Netdata 目录中创建一个名为 .opt-out-from-anonymous-statistics 的空文件。

$ sudo touch /etc/netdata/.opt-out-from-anonymous-statistics

重启 Netdata 以使更改生效。

$ sudo systemctl restart netdata

长期存储

默认情况下,Netdata 使用系统的 RAM 和磁盘来存储历史数据。默认的 Netdata 进程每秒收集约 2000 个指标,这意味着默认配置会在 RAM 和磁盘上存储约两天量的指标。

要存储更多指标,你有以下两个选择:

  • 配置 Netdata 使用更多 RAM 和磁盘空间
  • 将指标归档到外部数据库

本教程只讨论第一种方案。关于第二种方案,你应该参考 Netdata 的官方文档。

配置 Netdata 使用更多 RAM 和磁盘空间

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

$ sudo nano /etc/netdata/netdata.conf

在 [global] 部分下配置以下行。

[global]
...
    page cache size = 32
    dbengine multihost disk space = 256

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

page cache size 决定所使用的 RAM 大小,dbengine multihost disk space 变量决定磁盘使用量。默认情况下,Netdata 使用 32 MB 的 RAM 和 256 MB 的磁盘空间。你可以根据需要修改这两个值中的任意一个。

你可以使用 Netdata 的存储指标计算器来决定需要多少 RAM 和磁盘空间。

降低采集频率

你可以通过增大指标采集间隔来优化 Netdata 的性能。默认情况下,Netdata 每秒采集一次指标。

要更改这一设置,打开 Netdata 配置文件进行编辑。

$ sudo nano /etc/netdata/netdata.conf

在 [global] 部分下添加以下行。这会将采集频率提高到 5 秒。

[global]
...
    update every = 5

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

步骤 8 - 配置 Slack 通知

第一步是创建一个 Slack 应用,并将其连接到工作区中的特定频道,以配置 Slack 通知。

访问 Slack API 页面,点击 Create App(创建应用)按钮开始创建应用。

在 Debian 12 上用 Netdata 监控服务器与服务

点击 From Scratch(从零开始)链接创建应用。

在 Debian 12 上用 Netdata 监控服务器与服务

为你的应用选择一个名称,并选择希望应用出现的工作区。如果你不想将应用关联到现有工作区,可以另外创建一个,然后回到此步骤。

在 Debian 12 上用 Netdata 监控服务器与服务

从左侧边栏的 Features 菜单中选择对应选项,打开 Incoming Webhook(入站 Webhook)页面,然后激活该 webhook。

在 Debian 12 上用 Netdata 监控服务器与服务

点击页面底部的 Add New Webhook to Workspace(为工作区添加新 Webhook)按钮,选择你的工作区和接收通知的目标频道。

在 Debian 12 上用 Netdata 监控服务器与服务

点击 Allow(允许)按钮继续。返回 Incoming Webhooks 页面,复制 Webhook URL。

在 Debian 12 上用 Netdata 监控服务器与服务

返回终端,切换到 /etc/netdata 目录。

$ cd /etc/netdata

Netdata 提供了 edit-config 脚本用于编辑和创建 Netdata 配置文件。运行以下文件,使用系统默认编辑器创建并打开 health_alarm_notify.conf 文件。

$ sudo ./edit-config health_alarm_notify.conf

向下滚动到以下部分。

# Enable slack notification
SEND_SLACK="YES"

# Select the slack webhook
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxxxxxx/xxxxxx/xxxxxxxxxxxxx"

# Default channel for notification
DEFAULT_RECIPIENT_SLACK="notifications"

确保变量 SEND_SLACK 设置为 yes。将复制的 webhook URL 粘贴到 SLACK_WEBHOOK_URL 变量。为 DEFAULT_RECIPIENT_SLACK 变量输入你的频道名称。

如果你使用的是 Vim 编辑器,按 Escape 键退出编辑,输入 :x 并按 Enter 键保存文件并退出编辑器。

如果你使用的是 Nano 编辑器,按 Ctrl + X 并在提示时输入 Y 保存文件。

重启 Netdata 以使更改生效。

$ sudo systemctl restart netdata

步骤 9 - 配置邮件通知

Netdata 默认使用 sendmail 发送邮件通知,但管理邮件服务器并非易事。Netdata 不支持 SMTP,但你可以安装一个名为 msmtp 的软件包,它允许你向 SMTP 服务器发送邮件。

安装 msmtp。

$ sudo apt install msmtp

创建并打开 msmtp 的配置文件。

$ sudo nano /etc/msmtprc

在其中粘贴以下代码。

# Set default values for all following accounts.
defaults

# Use the mail submission port 587 instead of the SMTP port 25.
port 587

# Always use TLS.
tls on

# The SMTP server of your ISP
account ses
host email-smtp.<location>.amazonaws.com
from 
[email protected]

auth on
user <yoursesusername>
password <yoursespassword>

# Set default account to isp
account default: ses

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

Netdata 提供了 edit-config 脚本用于编辑和创建 Netdata 配置文件。运行以下文件,使用系统默认编辑器创建并打开 health_alarm_notify.conf 文件。

$ sudo /etc/netdata/edit-config health_alarm_notify.conf

向下滚动到以下部分,并输入 msmtp 的路径。

# external commands

# The full path to the sendmail command.
# If empty, the system $PATH will be searched for it.
# If not found, email notifications will be disabled (silently).
sendmail="/usr/bin/msmtp"

找到以下部分,输入发送方和接收方的详细信息,并确保已启用邮件发送。

# email global notification options

# multiple recipients can be given like this:
#              "
[email protected]
 
[email protected]
 ..."

# the email address sending email notifications
# the default is the system user netdata runs as (usually: netdata)
# The following formats are supported:
# EMAIL_SENDER="user@domain"
# EMAIL_SENDER="User Name <user@domain>"
# EMAIL_SENDER="'User Name' <user@domain>"
# EMAIL_SENDER="\"User Name\" <user@domain>"
EMAIL_SENDER="Server Admin <
[email protected]
>"

# enable/disable sending emails
SEND_EMAIL="YES"

# if a role recipient is not configured, an email will be send to:
DEFAULT_RECIPIENT_EMAIL="
[email protected]
"
# to receive only critical alarms, set it to "root|critical"

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

重启 Netdata 以使更改生效。

$ sudo systemctl restart netdata

步骤 10 - 测试通知渠道

我们来测试邮件通知是否生效。以安装过程中创建的 netdata 系统用户身份登录。

$ sudo su -s /bin/bash netdata

运行 Alarm 通知脚本发送一条测试通知。

$ /usr/libexec/netdata/plugins.d/alarm-notify.sh test

你将收到如下输出。

# SENDING TEST WARNING ALARM TO ROLE: sysadmin
2023-08-24 12:56:00: alarm-notify.sh: INFO: sent email notification for: netdata test.chart.test_alarm is WARNING to '
[email protected]
'
# OK

# SENDING TEST CRITICAL ALARM TO ROLE: sysadmin
2023-08-24 12:56:03: alarm-notify.sh: INFO: sent email notification for: netdata test.chart.test_alarm is CRITICAL to '
[email protected]
'
# OK

# SENDING TEST CLEAR ALARM TO ROLE: sysadmin
2023-08-24 12:56:06: alarm-notify.sh: INFO: sent email notification for: netdata test.chart.test_alarm is CLEAR to '
[email protected]
'
# OK

退出该用户。

$ exit.

打开你的 Slack 应用,你应该已经收到了如下提醒。

在 Debian 12 上用 Netdata 监控服务器与服务

你还应该收到三封关于测试警告的邮件。

在 Debian 12 上用 Netdata 监控服务器与服务

步骤 11 - 配置系统监控

既然我们已经配置并测试了通知,接下来为系统(例如 CPU 使用率)配置并测试通知。

运行以下命令创建并打开 CPU 配置文件。

$ sudo /etc/netdata/edit-config health.d/cpu.conf

如下图所示,修改 10min_cpu_usage 下的 warn 和 crit 选项的值。

warn: $this > (($status >= $WARNING)  ? (60) : (70))
crit: $this > (($status == $CRITICAL) ? (75) : (85))

将行中的 to:silent 改为 to:sysadmin,如下图所示。

 template: 10min_cpu_usage
       on: system.cpu
    class: Utilization
     type: System
component: CPU
       os: linux
    hosts: *
   lookup: average -10m unaligned of user,system,softirq,irq,guest
    units: %
    every: 1m
     warn: $this > (($status >= $WARNING)  ? (60) : (70))
     crit: $this > (($status == $CRITICAL) ? (75) : (85))
    delay: down 15m multiplier 1.5 max 1h
     info: average CPU utilization over the last 10 minutes (excluding iowait, nice and steal)
       to: sysadmin

保存文件并退出编辑器。

to:silent 设置会使通知静音,因此要接收通知,你需要将这些监控项的 monitor 值改为 to:sysadmin。

上述设置将在 CPU 使用率处于 60% 到 70% 之间时发送警告,在 CPU 使用率处于 75% 到 85% 之间时发送严重警告。

重启 Netdata 服务。

$ sudo systemctl restart netdata

我们通过安装 Stress 应用来测试该设置。

$ sudo apt install stress

运行以下命令使服务器的 CPU 使用率飙升。

$ stress --cpu 2

让该命令运行 5-10 分钟,你将收到 CPU 使用率过高的消息。收到这些消息后,返回终端并按 Ctrl + Z 退出该命令。

停止服务后,你会在 Slack 上收到一条 CPU 恢复通知。

在 Debian 12 上用 Netdata 监控服务器与服务

你还会收到如下的相同邮件消息。

在 Debian 12 上用 Netdata 监控服务器与服务

步骤 12 - 配置 Nginx 监控

使用 Netdata 监控的最常见应用之一是服务器和 SQL 软件包。我们使用 Netdata 来监控 Nginx 服务器。

要启用对 Nginx 服务器的监控,我们需要使用 ngx_http_stub_status_module 模块。它通常随 Nginx 预装。你可以检查该模块是否存在。在 Debian 系统上,该命令需要 sudo。

$ sudo nginx -V 2>&1 | grep -o with-http_stub_status_module
with-http_stub_status_module

如果没有任何输出,说明你的 Nginx 安装不支持该功能。这种情况下你需要重新编译 Nginx。

打开 Nginx 的默认配置文件 /etc/nginx/conf.d/default.conf 进行编辑。由于我们是从 Nginx 官方仓库安装的,文件位置有所不同。如果你是从操作系统仓库安装的 Nginx,则该文件的位置为 /etc/nginx/nginx.conf。

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

在 server 块中最后一个右花括号之前插入以下代码。

# Enable module stub_status
location /stub_status {
	stub_status;
    allow 127.0.0.1;        #only allow requests from localhost
    deny all;               #deny all other hosts
}

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

验证 Nginx 配置。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启 Nginx 服务器。

$ sudo systemctl restart nginx

重启 Netdata 服务。

$ sudo systemctl restart netdata

你应该会在 Netdata 仪表盘中看到 Nginx 连接详情。

在 Debian 12 上用 Netdata 监控服务器与服务

监控 Nginx 日志

Netdata 还可以监控 Nginx 访问日志。为此,请切换到 Netdata 目录。

$ cd /etc/netdata

运行以下命令生成用于监控访问日志的配置文件。

$ sudo ./edit-config go.d/web_log.conf

滚动到文件底部,找到以下部分。

# -------------------------------------------
# nginx log on various distros

# debian, arch
nginx_log:
  name: 'nginx'
  path: '/var/log/nginx/access.log'

# gentoo
nginx_log2:
  name: 'nginx_site'
  path: '/var/log/nginx/localhost.access_log'

修改路径以监控相应的日志文件。你可以添加任意多个部分来监控多个主机及其访问日志文件。我们的配置文件如下所示。

# -------------------------------------------
# nginx log on various distros

# debian, arch
nginx_log:
  name: 'nginx'
  path: '/var/log/nginx/access.log'

nginx_log2:
  name: 'nginx_site1'
  path: '/var/log/nginx/site1.access_log'

nginx_log3:
  name: 'nginx_site2'
  path: '/var/log/nginx/site2.access_log'

nginx_log4:
  name: 'nginx_site3'
  path: '/var/log/nginx/site3.access_log'

保存并退出编辑器。

要访问日志文件,Netdata 需要访问该目录的权限。默认情况下,adm 系统组有权访问日志文件。要让 Netdata 获得访问权限,我们需要将 netdata 用户添加到 adm 组。

$ sudo usermod -aG adm netdata

重启 Nginx 和 Netdata 服务。

$ sudo systemctl restart nginx netdata

重新加载 Netdata 仪表盘以查看你的日志文件数据。

在 Debian 12 上用 Netdata 监控服务器与服务

步骤 13 - 配置 MySQL/MariaDB 监控

本教程将安装 MariaDB。我们将为此使用 MariaDB 仓库。

导入 MariaDB GPG 密钥。

$ sudo curl -o /usr/share/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'

创建并打开 MariaDB 仓库文件。

$ sudo nano /etc/apt/sources.list.d/mariadb.sources

在其中粘贴以下代码。

# MariaDB 10.11 repository list - created 2023-09-05 11:18 UTC
# https://mariadb.org/download/
X-Repolib-Name: MariaDB
Types: deb
# deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# URIs: https://deb.mariadb.org/10.11/debian
URIs: https://mirrors.aliyun.com/mariadb/repo/10.11/debian
Suites: bookworm
Components: main
Signed-By: /usr/share/keyrings/mariadb-keyring.pgp

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

更新系统软件源列表。

$ sudo apt update

安装 MariaDB 服务器。

$ sudo apt install mariadb-server

MariaDB 已启用并正在运行。检查服务状态。

$ sudo systemctl status mariadb
? mariadb.service - MariaDB 10.11.5 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/mariadb.service.d
             ??migrated-from-my.cnf-settings.conf
     Active: active (running) since Tue 2023-09-05 11:44:17 UTC; 20s ago
       Docs: man:mariadbd(8)
             https://mariadb.com/kb/en/library/systemd/
    Process: 9396 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
    Process: 9397 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
    Process: 9399 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR >
    Process: 9440 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
    Process: 9442 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
   Main PID: 9428 (mariadbd)
     Status: "Taking your SQL requests now..."
      Tasks: 13 (limit: 1107)
     Memory: 111.8M
        CPU: 663ms
     CGroup: /system.slice/mariadb.service
             ??9428 /usr/sbin/mariadbd

启动 MySQL 安全安装脚本。在 MariaDB 中,文件名有所不同。

$ sudo mariadb-secure-installation
....
Enter current password for root (enter for none): (Press Enter)
....
Switch to unix_socket authentication [Y/n] Y (Type Y and Press Enter)
....
Change the root password? [Y/n] Y (Type Y and Press Enter)
New password: 
Re-enter new password: 
Password updated successfully!
....
Remove anonymous users? [Y/n] Y (Type Y and Press Enter)
....
Disallow root login remotely? [Y/n] Y (Type Y and Press Enter)
....
Remove test database and access to it? [Y/n] Y (Type Y and Press Enter)
....
Reload privilege tables now? [Y/n] Y (Type Y and Press Enter)
....
All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

打开 /etc/mysql/mariadb.conf.d/50-server.cnf 文件进行编辑。

$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

在文件中找到 [mariadb] 部分,并按如下所示粘贴以下行以启用 Userstats 插件。该设置仅在 MariaDB 上有效,在 MySQL 服务器上无效。

[mariadb]
userstat = 1

登录到 MySQL shell。

$ sudo mysql

运行以下命令创建一个 Netdata SQL 用户,并授予其跟踪 MySQL 统计信息的权限。

MariaDB> create user 'netdata'@'localhost';
MariaDB> GRANT USAGE, REPLICATION CLIENT, PROCESS ON *.* TO 'netdata'@'localhost';
MariaDB> FLUSH PRIVILEGES;
MariaDB> exit

为 Netdata 创建 MySQL 配置文件。

$ sudo /etc/netdata/edit-config go.d/mysql.conf

将打开一个文件,显示所有可能的选项。如果确认无误,按 Ctrl + X 并在提示时输入 Y 保存并关闭文件。

重启 MariaDB 服务器。

$ sudo systemctl restart mariadb

重启 Netdata 服务。

$ sudo systemctl restart netdata

MariaDB/MySQL 仪表盘应该会开始出现在 Netdata 仪表盘中。

在 Debian 12 上用 Netdata 监控服务器与服务

步骤 14 - 配置 PHP-FPM 监控

你可以使用 Netdata 监控一个或多个 PHP-FPM 实例。本教程将安装 PHP 8.2,然后启用其监控。

Debian 12 默认自带 PHP 8.2。但为了始终使用最新版本的 PHP,我们将使用 Ondrej 的 PHP 仓库。

首先,导入 Sury 仓库的 PHP GPG 密钥。

$ sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg

添加 Ondrej Sury 的 PHP 仓库。

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

更新系统软件源列表。

$ sudo apt update	

现在,你可以安装任意版本的 PHP。

$ sudo apt install php8.2-fpm php8.2-cli php8.2-mbstring

验证安装。

$ php --version
PHP 8.2.10 (cli) (built: Sep  4 2023 08:12:29) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.10, Copyright (c), by Zend Technologies

配置 PHP

打开文件 /etc/php/8.2/fpm/pool.d/www.conf。

$ sudo nano /etc/php/8.2/fpm/pool.d/www.conf

我们需要将 PHP 进程的 Unix 用户/组设置为 nginx。在文件中找到 user=www-data 和 group=www-data 行,并将其改为 nginx。

....
; Unix user/group of the child processes. This can be used only if the master
; process running user is root. It is set after the child process is created.
; The user and group can be specified either by their name or by their numeric
; IDs.
; Note: If the user is root, the executable needs to be started with
;       --allow-to-run-as-root option to work.
; Default Values: The user is set to master process running user by default.
;                 If the group is not set, the user's group is used.
user = nginx
group = nginx
....

此外,在文件中找到 listen.owner=www-data 和 listen.group=www-data 行,并将其改为 nginx。

listen.owner = nginx
listen.group = nginx

向下滚动文件,找到 ;pm.status_path = /status 选项。如下所示,删除其前面的分号来取消注释该行。

....
; Note: There is a real-time FPM status monitoring sample web page available
;       It's available in: /usr/share/php/8.2/fpm/status.html
;
; Note: The value must start with a leading slash (/). The value can be
;       anything, but it may not be a good idea to use the .php extension or it
;       may conflict with a real PHP file.
; Default Value: not set
pm.status_path = /status
....

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

重启 PHP-fpm 进程。

$ sudo systemctl restart php8.2-fpm

将 PHP 设置添加到 Nginx

打开 Nginx 的默认配置文件 /etc/nginx/conf.d/default.conf 进行编辑。

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

在 server 块中最后一个右花括号之前插入以下代码。

# define PHP-FPM monitoring
location ~ ^/(status|ping)$ {
    allow 127.0.0.1;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock; # Depends on the PHP Version and OS Distro
}

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

验证 Nginx 配置。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启 Nginx 服务器。

$ sudo systemctl restart nginx

重启 Netdata 服务。

$ sudo systemctl restart netdata

重新加载 Netdata 仪表盘,你应该能看到 PHP-FPM 的统计信息。

在 Debian 12 上用 Netdata 监控服务器与服务

步骤 15 - 配置 Docker 引擎与容器监控

Netdata 可以同时监控 Docker 引擎和 Docker 容器。它还能监控这些容器内运行的应用,但本教程不会涉及这部分内容。

我们先安装 Docker。

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
$ sudo usermod -aG docker ${USER}
$ su - ${USER}

Docker 服务已启用并启动。你可以检查服务的状态。

$ sudo systemctl status docker

要监控 Docker 引擎,你需要启用 Docker 的 metrics 功能。

创建并打开文件 /etc/docker/daemon.json 进行编辑。

$ sudo nano /etc/docker/daemon.json

在其中粘贴以下代码。

{
  "metrics-addr" : "127.0.0.1:9323",
  "experimental" : true
}

按 Ctrl + X,并在提示时输入 Y 保存文件。该 URL 供 Prometheus 用于跟踪 Docker 引擎的统计信息。

为 Docker 收集器创建一个配置文件。

$ sudo /etc/netdata/edit-config go.d/docker.conf

为 Prometheus 的 Docker 引擎再创建一个配置文件。

$ sudo /etc/netdata/edit-config go.d/docker_engine.conf

重启 Netdata 和 Docker 服务。

$ sudo systemctl restart docker netdata

再次加载 Netdata 仪表盘,你就可以看到 Docker 的统计信息。

在 Debian 12 上用 Netdata 监控服务器与服务

你会在仪表盘上看到另一个名为 Prometheus Metrics 的条目,因为 metrics 选项是为 Prometheus 仪表盘设计的。

在 Debian 12 上用 Netdata 监控服务器与服务

下一步是监控 Docker 容器。Netdata 使用称为 cgroups(控制组)的控制组来监控 Docker 容器。控制组是 Linux 的一项功能,用于限制和跟踪一组进程(此处为容器)的资源使用情况。如果在安装 Netdata 时已有 Docker 容器在运行,它们会被自动跟踪。但是,如果你在安装 Netdata 之后运行容器,则需要重启容器。

运行一个测试容器。

$ docker container run -d nginx

检查容器的状态。

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
9d6cde479224   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   80/tcp    zealous_knuth

如图所示,容器名称为 zealous_knuth。由于该容器是在安装 Netdata 之后启动的,请重启服务。

$ sudo systemctl restart netdata

加载仪表盘,你应该能看到容器统计信息。你可以在统计信息中看到容器 ID。

在 Debian 12 上用 Netdata 监控服务器与服务

小结

至此,本教程关于在 Debian 12 服务器上安装并使用 Netdata 监控系统,来监控 Nginx、MySQL、PHP-FPM 和 Docker 等各类应用的内容就全部结束了。如果你有任何疑问,请在下方评论区留言。