Zabbix - cgi 和 mysql

来自 Alpine Linux

Zabbix 是开源世界中最流行的监控管理器,只有像 catci 这样的监控工具,但重点是Zabbix 也是管理器,支持 ipv6!完全支持,还具有用于隐藏和防火墙网络的代理服务器。 它就像 Nagios 一样,但规模更大,更前沿且更专业。

维基中有两种使用方法专业方法(用于服务器和部署)以及快速简单的用法(用于开发人员和/或爱好者)。 要了解更多相关信息(当然重点是 Alpine),请查看 关于 zabbix 课程的完整 Alpine 英文文档

本文档分为两大部分……先决条件和 zabbix 最小基础设施的安装。 第一部分与当前的 Alpine 维基页面 生产页面 同步。

注意:此页面可能已被复杂化/混淆。 请参阅讨论页或查看较早的编辑版本:https://wiki.alpinelinux.cn/w/index.php?title=Zabbix&oldid=17984

Zabbix 和 Alpine 的适用场景

由于 Zabbix 专注于主机:因此是监控分布式网络的正确选择(最初是为监控服务器而开发的)。

在无法安装代理的情况下,Zabbix 提供基本的无代理监控。 通过它,您可以检查网络服务的可用性,以及执行远程命令

Zabbix 基础设施

Zabbix 分为 两个主要部分:服务器和代理,是的,“服务器”是因为由于“代理”半服务器,可以是集中式或分散式。

  • 服务器:代表所有收集的数据具有管理功能。 如果有多个服务器,则每个服务器都会收集和存储统计数据。
  • 代理:代表每个主机,客户端,即从中收集数据的机器或设备。 这些支持被动(轮询)和主动检查(捕获)。
  • 代理:代表可以用作分布式负载的中间人的服务器,适用于隐藏网络或防火墙网络的情况,当然具有管理功能,因为充当这些代理/主机的服务器

被动检查意味着 Zabbix 服务器从 Zabbix 代理请求一个值,代理处理该请求并将该值返回给 Zabbix 服务器。

主动检查意味着 Zabbix 代理从 Zabbix 服务器请求主动检查列表,然后定期发送结果。

第一部分:先决条件:php、web 服务器和数据库

在生产 Web 中,LAMP 表示 Linux + Apache + Mysql + Php 已安装并集成,但如今,Apache 越来越多地被 NginxLighttpd 取代,而 MySQLMariaDB 取代。 LAMP 文档是

1. Web 服务器:Lighttpd

lighttpd 是一个简单、符合标准、安全且灵活的 Web 服务器,Nginx 是最常用的,因为它可以通过 ISP 面板的软件进行管理,但 lighttpd 性能更好。 Nginx 无法处理 fast-cgi 程序。 有关更多 lighttpd 信息,请查阅 生产 Web 服务器:Lighttpd 维基页面。

Lighttpd 安装

生产环境将仅处理所需的软件包。 因此不允许文档或管理器

  1. 运行 apk 以获取所需的软件包
apk add lighttpd gamin

Lighttpd php 预配置

  1. 创建 htdos 公共 Web 根目录
  2. 将默认端口更改为生产端口,http 使用端口 80
  3. 使用 FAM 样式 (gamin) 文件更改监视器,提高性能,仅在 3.4 到 3.8 版本中!!!
  4. 使用 linux 事件处理程序,提高性能,因为 Alpine 仅限 Linux
  5. 将服务添加到默认运行级别,而不是启动,因为网络需要先激活
  6. 启动 Web 服务器服务
  7. 在配置文件中启用 mod_status
  8. 更改配置文件中的路径,我们使用混淆来提高安全性
  9. 重启服务以在浏览器中查看更改
mkdir -p /var/www/localhost/htdocs/stats /var/log/lighttpd /var/lib/lighttpd

sed -i -r 's#\#.*server.port.*=.*#server.port          = 80#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#\#.*server.event-handler = "linux-sysepoll".*#server.event-handler = "linux-sysepoll"#g' /etc/lighttpd/lighttpd.conf

chown -R lighttpd:lighttpd /var/www/localhost/

chown -R lighttpd:lighttpd /var/lib/lighttpd

chown -R lighttpd:lighttpd /var/log/lighttpd

rc-update add lighttpd default

rc-service lighttpd restart

echo "it works" > /var/www/localhost/htdocs/index.html

sed -i -r 's#\#.*mod_status.*,.*#    "mod_status",#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*status.status-url.*=.*#status.status-url  = "/stats/server-status"#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*status.config-url.*=.*#status.config-url  = "/stats/server-config"#g' /etc/lighttpd/lighttpd.conf

rc-service lighttpd restart

为了测试,打开浏览器并转到 http://<webserveripaddres>。 您将看到“it works”。 “webserveripaddres”是您的设置/服务器机器的 IP 地址。

Alpine linux 中存在一个问题,FAM (gamin) 仅作为 lighttpd 服务激活,这在 docker 中是有意义的,但在服务器上,如果 FAM (gamin) 同时也是其他服务所需要的,则可能会出现问题。

可选: alpine 打包器很混乱,最近删除了 FAM,因此较旧版本的 alpine 可以使用编译后的 FAM 软件包,命令为 sed -i -r 's#.*server.stat-cache-engine.*=.*# server.stat-cache-engine = "fam"#g' /etc/lighttpd/lighttpd.conf

2. php 脚本:PHP fpm

在 Alpine 中,有两种主要的动态网页编程语言:PHP 和 LUA。 Alpine 是极简主义的,因此在大多数情况下不需要所有 PHP 软件包。 必须启用两个存储库(main 和 community)。 在这里,我们解释生产中最常见的用法。

PHP 安装

此材料已过时...

更新到较新或通用的 php 版本 (讨论)

apk add php7 php7-bcmath php7-bz2 php7-ctype php7-curl php7-dom php7-enchant php7-exif php7-fpm php7-gd php7-gettext php7-gmp php7-iconv php7-imap php7-intl php7-json php7-mbstring php7-opcache php7-openssl php7-phar php7-posix php7-pspell php7-recode php7-session php7-simplexml php7-sockets php7-sysvmsg php7-sysvsem php7-sysvshm php7-tidy php7-xml php7-xmlreader php7-xmlrpc php7-xmlwriter php7-xsl php7-zip php7-sqlite3
注意: 以下软件包仅适用于特定情况。 仅在需要时安装它们(尤其是 php-pear),例如,cacticacti-php7 依赖于 php7,但您必须安装 cacti 软件包,所有依赖项必须预先从 stable 安装。
apk add php7-pgsql php7-mysqli php7-mysqlnd php7-snmp php7-soap php7-ldap php7-pcntl php7-pear php7-shmop php7-wddx php7-cgi php7-pdo php7-snmp php7-tokenizer 
注意: 以下软件包仅适用于以特定方式使用 php 进行数据库访问的情况。 仅在需要时安装它们(尤其是 php--pdo 软件包)。 例如,cacticacti-php7 依赖于 php7-mysqli,但您必须仅安装 cacti 软件包,所有依赖项(如 php7php7-mysqli)必须预先从 stable 安装。
apk add php7-dba php7-sqlite3 php7-mysqli php7-mysqlnd php7-pgsql php7-pdo_dblib php7-pdo_odbc php7-pdo_pgsql php7-pdo_sqlite 

一个特殊情况是 php7-odbc。 与其他只能让 php 连接到特定数据库的软件包不同,unixodbc 是一种通用的连接方式。 最重要的区别在于,例如,php7-mysqli 软件包具有更好的函数来通过 php 管理数据。

PHP 全局配置

  1. 使用 fix.pathinfo
  2. 关闭安全模式
  3. 如果发生错误,请勿暴露 php 代码
  4. 将执行的内存限制设置为 536Mb(大多数服务器的 RAM 至少为 1 GB)
  5. 将上传大小设置为最大 128Mb。
  6. 根据最大上传大小限制,将 POST 最大大小设置为 256Mb。
  7. 启用 URL 打开方法
  8. 将默认字符集设置为 UTF-8 以提高兼容性
  9. 增加执行时间和输入时间。
sed -i -r 's|.*cgi.fix_pathinfo=.*|cgi.fix_pathinfo=1|g' /etc/php*/php.ini
sed -i -r 's#.*safe_mode =.*#safe_mode = Off#g' /etc/php*/php.ini
sed -i -r 's#.*expose_php =.*#expose_php = Off#g' /etc/php*/php.ini
sed -i -r 's#memory_limit =.*#memory_limit = 536M#g' /etc/php*/php.ini
sed -i -r 's#upload_max_filesize =.*#upload_max_filesize = 128M#g' /etc/php*/php.ini
sed -i -r 's#post_max_size =.*#post_max_size = 256M#g' /etc/php*/php.ini
sed -i -r 's#^file_uploads =.*#file_uploads = On#g' /etc/php*/php.ini
sed -i -r 's#^max_file_uploads =.*#max_file_uploads = 12#g' /etc/php*/php.ini
sed -i -r 's#^allow_url_fopen = .*#allow_url_fopen = On#g' /etc/php*/php.ini
sed -i -r 's#^.default_charset =.*#default_charset = "UTF-8"#g' /etc/php*/php.ini
sed -i -r 's#^.max_execution_time =.*#max_execution_time = 150#g' /etc/php*/php.ini
sed -i -r 's#^max_input_time =.*#max_input_time = 90#g' /etc/php*/php.ini

PHP-FPM 配置

  1. 为 php 套接字和 pid 文件创建目录,必须与 openrc 定义的目录相同!
  2. 在配置文件中设置套接字路径,必须与 openrc 定义的路径相同!
  3. 在配置文件中设置 pid 文件路径,必须与 openrc 定义的路径相同!
mkdir -p /var/run/php-fpm7/

chown lighttpd:root /var/run/php-fpm7

sed -i -r 's|^.*listen =.*|listen = /run/php-fpm7/php7-fpm.sock|g' /etc/php*/php-fpm.d/www.conf

sed -i -r 's|^pid =.*|pid = /run/php-fpm7/php7-fpm.pid|g' /etc/php*/php-fpm.conf

sed -i -r 's|^.*listen.mode =.*|listen.mode = 0640|g' /etc/php*/php-fpm.d/www.conf

rc-update add php-fpm7 default

service php-fpm7 restart


PHP-FPM 定义了一个主进程,每个服务请求都有一个进程池。 默认情况下,只有一个进程池,www。

默认值对于启动来说是好的,但稍后需要进行调整。 最好是静态的,但需要进行测试才能获得正确的配置。

Lighttpd + PHP-FPM

Web 服务器附带一个最小的配置文件,因此我们必须处理所有必需的设置

  1. 在配置文件中启用 mod_alias,cgi 文件安全性需要特定的路径
  2. 确保仅通过 cgi 禁用 fastcgi-php 模块
  3. 然后启用 fastcgi-php-fpm 特定模块
  4. 使用套接字在本地服务器中编写更好的 php 处理程序方法
  5. 配置 php 也使用套接字进行本地直接连接
  6. 重启服务以在浏览器中查看更改
mkdir -p /var/www/localhost/cgi-bin

sed -i -r 's#\#.*mod_alias.*,.*#    "mod_alias",#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*include "mod_cgi.conf".*#   include "mod_cgi.conf"#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*include "mod_fastcgi.conf".*#\#   include "mod_fastcgi.conf"#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*include "mod_fastcgi_fpm.conf".*#   include "mod_fastcgi_fpm.conf"#g' /etc/lighttpd/lighttpd.conf

sed -e '/index-file.names/ s/^#*/#/' -i /etc/lighttpd/lighttpd.conf

cat > /etc/lighttpd/mod_fastcgi_fpm.conf << EOF
server.modules += ( "mod_fastcgi" )
index-file.names += ( "index.php" )
fastcgi.server = (
    ".php" => (
      "localhost" => (
        "socket"                => "/var/run/php-fpm7/php7-fpm.sock",
        "broken-scriptfilename" => "enable"
      ))
)
EOF

sed -i -r 's|^.*listen =.*|listen = /var/run/php-fpm7/php7-fpm.sock|g' /etc/php*/php-fpm.d/www.conf

sed -i -r 's|^.*listen.owner = .*|listen.owner = lighttpd|g' /etc/php*/php-fpm.d/www.conf

sed -i -r 's|^.*listen.group = .*|listen.group = lighttpd|g' /etc/php*/php-fpm.d/www.conf

sed -i -r 's|^.*listen.mode = .*|listen.mode = 0660|g' /etc/php*/php-fpm.d/www.conf

rc-service php-fpm7 restart

rc-service lighttpd restart

echo "<?php echo phpinfo(); ?>" > /var/www/localhost/htdocs/info.php

为了测试,打开浏览器并转到 http://<webserveripaddres>/info.php。 您将看到在生产中使用的信息。 向黑客提供太多信息是没有意义的。 “webserveripaddres”是您的设置/服务器机器的 IP 地址。

之后,所有 php 文件都将比使用基于主机的处理速度更快。 在 /var/www/localhost/cgi-bin 目录下,将显示为 http://localhost/cgi-bin/ 路径。

多 PHP-FPM 集群

正如我们所说,FPM 由进程池管理,但连接可以通过网络或直接 n 套接字进行。 对于可以处理平均请求数的典型服务器的配置是使用套接字和 localhost。 为了实现高可用性,需要 1000Mbps 的 CAT6 有线网络连接和以轮询模式通过网络连接的 php-fpm。

PHP FPM 池将在特定的机器上,而 Web 服务器将简单地连接到这些装有 PHP 的机器来服务 PHP 页面。 结果是 lighttpd Web 服务器集群对抗其他 PHP-FPM 进程集群。 PHP 代码在所有 Web 服务器上都可以相同,并且可以连接到单个数据库。

在 Linux 控制台中,更改例如是,两台机器 10.10.1.10 和 10.10.2.10 都安装了 php 和 lighttpd,因此每台机器都将设置另一台机器的 php

mkdir -p /var/www/localhost/cgi-bin

sed -i -r 's#\#.*mod_alias.*,.*#    "mod_alias",#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*include "mod_cgi.conf".*#   include "mod_cgi.conf"#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*include "mod_fastcgi.conf".*#\#   include "mod_fastcgi.conf"#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*include "mod_fastcgi_fpm.conf".*#   include "mod_fastcgi_fpm.conf"#g' /etc/lighttpd/lighttpd.conf

cat > /etc/lighttpd/mod_fastcgi_fpm.conf << EOF
server.modules += ( "mod_fastcgi" )
index-file.names += ( "index.php" )
fastcgi.server = ( ".php" => 
  (
    ( "host" => "10.10.1.10",
      "port" => 9000
    ),
    ( "host" => "10.10.2.10",
      "port" => 9000 )
    )
  )
EOF

sed -i -r 's|^.*listen =.*|listen = 9000|g' /etc/php*/php-fpm.d/www.conf

sed -i -r 's|^.*listen.owner = .*|listen.owner = lighttpd|g' /etc/php*/php-fpm.d/www.conf

sed -i -r 's|^.*listen.group = .*|listen.group = lighttpd|g' /etc/php*/php-fpm.d/www.conf

sed -i -r 's|^.*listen.mode = .*|listen.mode = 0660|g' /etc/php*/php-fpm.d/www.conf

rc-service php-fpm7 restart

rc-service lighttpd restart

echo "<?php echo phpinfo(); ?>" > /var/www/localhost/htdocs/info.php

3. DBMS 部分:mysql/mariadb

Alpine Linux 具有虚拟的对应软件包,适用于那些未从 mysql 更改为 mariadb 的软件包。

安装

请考虑在软件包安装期间创建的用户 mysql。 在初始化部分,将在数据库初始化中创建两个用户:rootmysql,只有当它们在各自的系统帐户中时,才能连接到数据库服务。

apk add mysql mysql-client

初始化

位于 /var/lib/mysqldatadir 必须归 mysql 用户和组所有。 您可以修改此行为,但必须编辑 /etc/init.d 目录下的服务文件。 此外,您需要在配置文件中的 [mysqld] 部分下设置 datadir=<YOUR_DATADIR>

  1. 初始化主 mysql 数据库,并将数据目录标准化为 rc 脚本的 /var/lib/mysql
  2. 然后初始化服务,此时 root 帐户和套接字连接在没有密码的情况下启用
  3. 通过分配适当的密码来设置 root 帐户。 这纯粹是偏执狂。 下一步就是这样!
  4. 通过运行 mysql_secure_installation 来设置和初始化安装
  5. 设置管理其他用户和数据库的权限
  6. 运行 mysql_secure_installation 脚本并回答问题(请参阅下面的部分)
mysql_install_db --user=mysql --datadir=/var/lib/mysql

rc-service mariadb start

mysqladmin -u root password toor

mysql_secure_installation

  1. 输入 root 用户当前密码(无密码则按 Enter 键): 必须提供,因为我们之前设置过。 正确的响应是 OK, successfully used password, moving on...
  2. 切换到 unix_socket 身份验证 [Y/n] 必须禁用此项,因此回答 NO,响应将是 ... skipping.
  3. 更改 root 密码? [Y/n] 仅当您提供了好的密码时才按“n”,否则请更改密码!
  4. 删除匿名用户? [Y/n] 在任何情况下,生产系统都必须删除它,因此回答 Y,正确的响应应该是 ... Success!
  5. 禁止 root 用户远程登录? [Y/n] 务必回答 Y,正确的响应应该是 ... Success!
  6. 删除测试数据库并禁止访问? [Y/n] 应该删除,因此回答 Y,正确的响应应该是 ... Success!
  7. 立即重新加载权限表? [Y/n] 回答 Y,正确的响应应该是 ... Success!

在响应所有问题后,使用 rc-service mariadb restart 重启服务

配置

较新的 Alpine 系统软件包可以在独立文件中进行设置。 在任何情况下,这些命令始终有效,并且在不适用的情况下,它们会忽略输出。 有关更多信息,请参阅 MariaDB 维基页面的 MariaDB 配置文件 部分。

  • 在较旧的 Alpine 系统上,您必须将 MAX ALLOWED PACKETS 的配置文件设置为最小的适当值
  • 仅在只有一个服务器或没有来自其他服务器的预期连接时才允许本地连接
  • 将默认字符集设置为 UTF8MB4(MariaDB 11.8 和 MySQL 8 的默认值)
  • 添加启动服务进程,但不要将其设置为启动进程,因为网络需要已经运行。
  • 重启服务以应用更改。
sed -i "s|.*max_allowed_packet\s*=.*|max_allowed_packet = 100M|g" /etc/mysql/my.cnf
sed -i "s|.*max_allowed_packet\s*=.*|max_allowed_packet = 100M|g" /etc/my.cnf.d/mariadb-server.cnf

sed -i "s|.*bind-address\s*=.*|bind-address=127.0.0.1|g" /etc/mysql/my.cnf
sed -i "s|.*bind-address\s*=.*|bind-address=127.0.0.1|g" /etc/my.cnf.d/mariadb-server.cnf

cat > /etc/my.cnf.d/mariadb-server-default-charset.cnf << EOF
[client]
default-character-set = utf8mb4

[mysqld]
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4

[mysql]
default-character-set = utf8mb4
EOF

rc-service mariadb restart

rc-update add mariadb default

升级: 如果在升级后无法运行任何 mysql 命令,那是因为 MySQL 无法启动。 尝试使用 mysqld_safe --datadir=/var/lib/mysql/ 命令在安全模式下运行 MySQL,然后运行 mysql_upgrade -u root -p 脚本。 有关更多信息,请参阅 MariaDB 维基页面的 MariaDB 升级部分

adminer:Web 前端管理

Adminer 是一个简单的独立工具,比 PhpMysqladmin 快很多倍,PhpMysqladmin 很棒,但存在太多安全问题和许多复杂的设置。 我们需要一个更简单、更独立的解决方案。 一个易于管理和升级的解决方案。

请考虑这需要先决条件,即先前配置并运行的 Web 服务器、php 脚本和 mysql/mariadb 引擎


mkdir -p /var/www/webapps/adminer

wget https://github.com/vrana/adminer/releases/download/v4.7.6/adminer-4.7.6.php -O /var/www/webapps/adminer/adminer-4.7.6.php

ln -s adminer-4.7.6.php /var/www/webapps/adminer/index.php

cat > /etc/lighttpd/mod_adminer.conf << EOF
# NOTE: this requires mod_alias
alias.url += (
     "/adminer/"	    =>	    "/var/www/webapps/adminer/"
)
$HTTP["url"] =~ "^/adminer/" {
    # disable directory listings
    dir-listing.activate = "disable"
}
EOF

sed -i -r 's#\#.*mod_alias.*,.*#    "mod_alias",#g' /etc/lighttpd/lighttpd.conf

sed -i -r 's#.*include "mod_cgi.conf".*#   include "mod_cgi.conf"#g' /etc/lighttpd/lighttpd.conf

checkssl="";checkssl=$(grep 'include "mod_adminer.conf' /etc/lighttpd/lighttpd.conf);[[ "$checkssl" != "" ]] && echo listo || sed -i -r 's#.*include "mod_cgi.conf".*#include "mod_cgi.conf"\ninclude "mod_adminer.conf"#g' /etc/lighttpd/lighttpd.conf

rc-service lighttpd restart

管理员必须使用确切的 URL http://<ipaddress>/adminer/index.php。 有两个原因:没有目录列表,Web 服务器上也没有直接的 PHP 索引引用,所有这些都是由于偏执的安全设置。

第二部分:zabbix

Zabbix 取决于您将使用的数据库类型,在这里我们将向您展示如何使用 mysql 进行操作,因为它更易于使用,对于生产环境,建议使用 posrgresql,如

1. 安装 zabbix 软件包

请记住,Zabbix 有 3 个组件,服务器是主要的组件

  • 表示数据的中央服务器(可以是一个 zabbix 服务器,或与更多 zabbix 代理组合的 zabbix 服务器)
  • 要监控的客户端主机(通过代理、SNMP 或仅 ICMP 实现)
  • 分布式代理服务器(仅适用于防火墙或封闭网络后面的主机)

在服务器中,我们至少需要中央基础服务,当然还需要一个用于监控该服务器的代理

cat > /etc/apk/repositories << EOF
https://dl-4.alpinelinux.org/alpine/v$(cat /etc/alpine-release | cut -d'.' -f1,2)/main
https://dl-4.alpinelinux.org/alpine/v$(cat /etc/alpine-release | cut -d'.' -f1,2)/community
EOF

apk update

apk add zabbix zabbix-mysql zabbix-webif zabbix-setup zabbix-utils zabbix-agentd

现在让我们在该服务器中配置服务器和 UI 前端

2. 配置基础服务

Zabbix 服务器或代理服务器始终需要一个主数据库,监控服务与其一起运行,UI 和代理始终将数据发送到 zabbix 服务器或 zabbix 代理(并从代理发送到服务器)。

警告: zabbix 服务 DB 用户是 zabbixdb 而不是 zabbix,无论您使用 postgresql 还是 mysql,用户 zabbixdb 都不会使用密码进行代理监控,因为在 postgresql 中将使用 ident 方式身份验证,而在 mysql 中将使用 socket 方式身份验证:这是有意义的,因为用户代理是 zabbix 并且没有主目录。 这是正确且最安全的方式。


mysql -u root -e "CREATE USER 'zabbix'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('clavezabix');"
mysql -u root -e "CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;"
mysql -u root -e "GRANT ALL PRIVILEGES ON zabbixdb.* TO 'zabbixdb'@'localhost' WITH GRANT OPTION;"

mysql -u zabbixdb --password=clavezabix zabbixdb < /usr/share/zabbix/database/mysql/schema.sql
mysql -u zabbixdb --password=clavezabix zabbixdb < /usr/share/zabbix/database/mysql/images.sql
mysql -u zabbixdb --password=clavezabix zabbixdb < /usr/share/zabbix/database/mysql/data.sql

sed -i 's|.*DBHost.*=.*|DBHost=localhost|g' /etc/zabbix/zabbix_server.conf
sed -i 's|DBName.*=.*|DBName=zabbixdb|g' /etc/zabbix/zabbix_server.conf
sed -i 's|.*DBPassword.*=.*|DBPassword=zabbixdb.db.1.com.1|g' /etc/zabbix/zabbix_server.conf
sed -i 's|.*DBUser.*=.*|DBUser=zabbixdb|g' /etc/zabbix/zabbix_server.conf
sed -i 's|.*DBSocket.*=.*|DBSocket=/run/mysqld/mysqld.sock|g' /etc/zabbix/zabbix_server.conf
sed -i 's|.*Fping6Location.*=.*|Fping6Location=|g' /etc/zabbix/zabbix_server.conf
sed -i 's|.*FpingLocation.*=.*|FpingLocation=/usr/sbin/fping|g' /etc/zabbix/zabbix_server.conf
sed -i 's|Nostname=.*|Nostname=monitor.zabbixnetwork|g' /etc/zabbix/zabbix_server.conf
sed -i 's|.*SourceIP.*=.*|SourceIP=0.0.0.0|g' /etc/zabbix/zabbix_server.conf

chown root:zabbix /usr/sbin/fping

rc-update add zabbix-server default

rc-service zabbix-server restart

注意: 请记住,服务器的主机名是 monitor.zabbixnetwork,您也可以使用 IP 地址,但此名称必须与活动或被动服务器的配置文件、Web UI 配置的主机名服务器和/或 zabbix 配置的主机名代理服务器中的名称相同。

3. 设置和配置 Web 前端

主服务器可以使用 zabbix-frontend 进行管理

cp /usr/share/webapps/zabbix/conf/zabbix.conf.php.example /usr/share/webapps/zabbix/conf/zabbix.conf.php

sed -i "s|.*DB\['TYPE'\].*=.*|\$DB\['TYPE'\] = 'MYSQL';|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php
sed -i "s|.*DB\['SERVER'\].*=.*|\$DB\['SERVER'\] = 'localhost';|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php
sed -i "s|.*DB\['DATABASE'\].*=.*|\$DB\['DATABASE'\] = 'zabbixdb';|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php
sed -i "s|.*DB\['USER'\].*=.*|\$DB\['USER'\] = 'zabbixdb';|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php
sed -i "s|.*DB\['PASSWORD'\].*=.*|\$DB\['PASSWORD'\] = 'zabbixdb.db.1.com.1';|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php
sed -i "s|.*ZBX_SERVER_PORT.*=.*|\$ZBX_SERVER_PORT = '10051';|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php
sed -i "s|.*ZBX_SERVER_NAME.*=.*|\$ZBX_SERVER_NAME = 'monitor.ruices';|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php
sed -i "s|.*IMAGE_FORMAT_DEFAULT.*=.*|\$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_GIF;|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php
sed -i "s|.*ZBX_SERVER.*=.*'localhost';|\$ZBX_SERVER = 'localhost';|g" /usr/share/webapps/zabbix/conf/zabbix.conf.php

cat > /usr/share/webapps/zabbix/.user.ini << EOF
date.timezone = "America/Caracas"
display_errors  =  Off
log_errors  =  On
upload_max_filesize  =  16M
post_max_size  =  24M
memory_limit  =  512M
register_globals  =  Off
magic_quotes_gpc  =  Off
magic_quotes_runtime  =  Off
session.auto_start  = 0
mbstring.func_overload = 0
max_execution_time = 600
max_input_time = 600
EOF

我们不使用直接放在 htdocs 上的愚蠢链接,我们是专业的,我们使用别名,现在让我们配置 Web 服务器以通过 Web 提供前端

cat > /etc/lighttpd/mod_zabbix.conf << EOF
alias.url += (
     "/zabbix/"    =>    "/usr/share/webapps/zabbix/"
)
\$HTTP["url"] =~ "^/zabbix/" {
    dir-listing.activate = "disable"
}
EOF

sed -i 's#\#.*mod_rewrite.*,.*#    "mod_rewrite",#g' /etc/lighttpd/lighttpd.conf
sed -i 's#\#.*mod_alias.*,.*#    "mod_alias",#g' /etc/lighttpd/lighttpd.conf
sed -i 's#\#.*mod_accesslog.*,.*#    "mod_accesslog",#g' /etc/lighttpd/lighttpd.conf
sed -i 's#\#.*mod_setenv.*,.*#    "mod_setenv",#g' /etc/lighttpd/lighttpd.conf
sed -i 's#\#.*mod_redirect.*,.*#    "mod_redirect",#g' /etc/lighttpd/lighttpd.conf

sed -i 's#.*include "mod_cgi.conf".*#   include "mod_cgi.conf"#g' /etc/lighttpd/lighttpd.conf

check="";check=$(grep 'include "mod_zabbix.conf' /etc/lighttpd/lighttpd.conf);[[ "$check" != "" ]] && echo listo || sed -i 's#.*include "mod_fastcgi_fpm.conf".*#include "mod_fastcgi_fpm.conf"\ninclude "mod_zabbix.conf"#g' /etc/lighttpd/lighttpd.conf

chown -R lighttpd:www-data /usr/share/webapps/zabbix/

rc-service lighttpd restart


您现在应该能够浏览到 Zabbix 前端:http://yourservername/zabbix/ 或 http://localhost/zabbix。

使用以下信息登录:登录名:Admin 密码:zabbix。 (如 https://www.zabbix.com/documentation/4.0/manual/installation 中所述)

无需进行 Web 设置,因为我们已在 cli 中完成了所有操作,就像最好的黑客管理员一样。

Zabbix 用于项目地图或脚本的工具

Busybox 中没有完整的功能,因此需要更多工具,此外,Zabbix 需要特殊权限才能使用工具

apk add bash fping tcptraceroute coreutils net-snmp-tools nmap perl rrdtool font-dejavu net-snmp-libs

chown root:zabbix /usr/sbin/fping

chmod u+s /usr/bin/ping

chmod u+s /bin/ping

chmod u+s /usr/bin/nmap 

警告: 最好使用 set ui bit,这在安全漏洞方面问题较少,因此设置 ui 位是一种安全隐患,但比使用“sudo”的糟糕方式要好,因为这些工具需要以 root 身份运行才能正确使用


Zabbix 和被监控主机

Zabbix 可以监控几乎任何设备系统,包括 Alpine Linux 主机、家用计算机、手机、网络设备等。

监控类型

zabbix 代理是在计算机上运行的 zabbix 服务,功能齐全,SNMP(简单网络管理协议)是一种常见的标准协议,是第二大支持的协议,ICMP(互联网控制消息协议)是最常用且最简单的方式,但功能最有限,请查看功能

功能 通过代理 通过 SNMP 通过 ICMP
Ping 以检查是否存活(直接 IP) 是,但如果存在防火墙,则需要 zabbix 代理 仅在直接 IP 上,无防火墙
从程序中检索数据(直接 ping) 是,但如果存在防火墙,则需要 zabbix 代理
发送命令进行管理 是,但如果存在防火墙,则需要使用 zabbix 代理
在任何设备上运行 否,仅限计算机 大多数网络设备
在任何操作系统上运行 是,在安卓和大型机中受到限制
需要特权 对于大多数功能,不是必需的 取决于情况
注意: 自 linux-grsec-2.6.35.9-r2 起,已添加对允许 zabbix-agentd 查看 Alpine Linux 上运行的进程的支持。 请确保您已安装该内核,然后再尝试运行 zabbix-agentd。

确保 readproc 组存在(自 alpine-baselayout-2.0_rc1-r1 起添加了支持),方法是将以下行添加到 /etc/group

readproc:x:30:zabbix

通过 Zabbix 代理监控

代理监控方式是功能最全的,但仅适用于计算机主机,因为 zabbiz-agent 软件仅适用于这些设备,对于网络设备,您必须使用 ICMP 或 SNMP(查看下一小节)。

因此,在每个要监控/管理的主机(服务器也包括在内)上安装代理软件包并进行配置

注意: 请记住,服务器的主机名是 monitor.zabbixnetwork,您也可以使用 IP 地址,但此名称必须与活动或被动服务器的配置文件、Web UI 配置的主机名服务器和/或 zabbix 配置的主机名代理服务器中的名称相同。
cat > /etc/apk/repositories << EOF
https://dl-4.alpinelinux.org/alpine/v$(cat /etc/alpine-release | cut -d'.' -f1,2)/main
https://dl-4.alpinelinux.org/alpine/v$(cat /etc/alpine-release | cut -d'.' -f1,2)/community
EOF

apk update

apk add zabbix-agent net-snmp-libs net-snmp-agent-libs

sed -i 's|.*ListenPort.*=.*|ListenPort=10050|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|.*Hostname=.*|Hostname=monitordhost1|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|Server =.*|Server=localhost,monitor.zabbixnetwork|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|ServerActive.*=.*|ServerActive=localhost,monitor.zabbixnetwork |g' /etc/zabbix/zabbix_agentd.conf|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|.*EnableRemoteCommands.*=.*|EnableRemoteCommands=1|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|.*LogRemoteCommands.*=.*|LogRemoteCommands=1|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|# Include=.*|Include=/etc/zabbix/zabbix_agentd.d/*.conf|' /etc/zabbix/zabbix_agentd.conf

rc-update add zabbix-agentd default

rc-service zabbix-agentd restart

注意: 此处代理中配置的主机名是 monitordhost1,您也可以使用 IP 地址,但如果将使用代理方式,则此名称必须与 Web UI 中配置的活动或被动主机的配置文件中的主机名相同。
警告: zabbix 服务 DB 用户是 zabbixdb 而不是 zabbix,无论您使用 postgresql 还是 mysql,用户 zabbixdb 都不会使用密码进行代理监控,因为在 postgresql 中将使用 ident 方式身份验证,而在 mysql 中将使用 socket 方式身份验证:这是有意义的,因为用户代理是 zabbix 并且没有主目录。 这是正确且最安全的方式。


通过 SNMP 协议监控

然后在每个监控系统中,您应该定义一个 community 词,因为 ISP 总是会惩罚您使用 public 并向世界开放 SNMP,包括您也应该在您的专用网络内部进行保护,因此在每个要监控的主机上,您应该使用 执行这些命令来配置 SNMP(包括 zabbix 服务器)

apk add net-snmp net-snmp-perl net-snmp-tools

cat > /etc/snmp/snmpd.conf << EOF
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
rocommunity  monitor
rocommunity  public localhost
rocommunity  public default -V systemonly
sysLocation    client host at monitor.zabbixnetwork
sysContact     infoadmin <venenux@venenux.net>
sysServices    72
EOF

rc-update add snmpd default

rc-service snmpd restart 

这将允许任何主机使用单词“monitor”咨询 SNMP v2c,但如果您有分布式网络,最好使用经过身份验证的 SNMP v3。

警告: 因此,在 zabbix Web UI 中,您必须在 community 词中使用“monitor”。


数据库监控

由于限制,任何将拥有数据库的主机服务器都必须拥有代理,无论其是否直接连接到 zabbix 服务器/代理。

在本例中,我们以 Mysql 为例

在被监控端:要监控的 DBMS 服务器

apk add zabbix-agent

sed -i 's|.*ListenPort.*=.*|ListenPort=10050|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|.*Hostname=.*|Hostname=theDBserver|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|Server =.*|Server=monitor.zabbixnetwork|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|ServerActive.*=.*|ServerActive=monitor.zabbixnetwork|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|.*EnableRemoteCommands.*=.*|EnableRemoteCommands=1|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|.*LogRemoteCommands.*=.*|LogRemoteCommands=1|g' /etc/zabbix/zabbix_agentd.conf
sed -i 's|# Include=|Include=/etc/zabbix/zabbix_agentd.d/*.conf|g' /etc/zabbix/zabbix_agentd.conf

rc-update add zabbix-agentd default

rc-service zabbix-agentd restart

apk add mariadb-client 

wget -O /etc/zabbix/zabbix-agent/userparameter_mysql.conf "https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/conf/zabbix_agentd/userparameter_mysql.conf?at=release/5.0"

mysql -u root -e "CREATE USER 'zabbix'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('zabbix.db.1.com.1');"
mysql -u root -e "GRANT USAGE,REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zabbix'@'localhost';"

注意: 此处代理中配置的主机名是 theDBserver,您也可以使用 IP 地址,但如果将使用代理方式来监控此服务器主机,则此名称必须与 Web UI 中配置的活动或被动主机的配置文件中的主机名相同。
警告: alpine zabbix 软件包中出现了一个新的文件丢失问题,因此请阅读 https://gitlab.alpinelinux.org/alpine/aports/-/issues/12791,以获取您可以手动下载的文件


在 zabbix 服务器端:配置被监控主机

在配置的主机上使用模板 DB mysqlDB postgresql,并记住,配置的主机中的主机名必须与被监控主机的代理配置文件中配置的主机名相同。

有关更多详细信息,请查看下一节速成课程

可选:添加主机、检查和通知的速成课程

注意: 这是可选的,因为它不是 Alpine Linux 特有的,但我想添加一些关于如何在未安装代理的服务器上执行简单检查并在状态更改时收到通知的注释。

管理 -> 媒介类型 -> 电子邮件

  • 设置服务器、helo、电子邮件发件人地址

管理 -> 用户

  • 设置每个将收到通知的用户,确保他们添加了媒介类型“电子邮件”及其地址

配置 -> 主机 -> 创建主机

  • 在 Linux 服务器主机组中
  • 定义 DNS 名称、IP、通过 IP 连接
  • 如果机器是仅使用 SNMP 监控的简单网络设备,请将其添加到 Template_SNMPv2_Device,就完成了。

配置 -> 模板 -> 创建模板

  • 为其命名(Template_Alpine_Linux_Infra_HTTP)
  • 在模板组中

配置 -> 模板 -> Template_Alpine_Linux_Infra_HTTP -> 项目

  • 创建项目
  • 主机:Template_Alpine_Linux_Infra_HTTP
  • 描述:HTTP 基本检查
  • 类型:简单检查
  • 键:http,80

配置 -> 模板 -> Template_Alpine_Linux_Infra_HTTP -> 触发器

  • 创建触发器
  • 名称:“HTTP 触发器”
  • 表达式:{Template_Alpine_Linux_Infra_HTTP:http,80.last(0)}#1
  • 严重程度:高

配置 -> 动作 ->

  • 创建动作
  • 名称:电子邮件通知
  • 事件源:触发器
  • 默认主题:在开头添加“{HOST.DNS}:”
  • 默认消息:在开头添加“{HOST.DNS}:”
  • 条件:使主机必须来自“Linux 服务器”主机组,并且 Template_Alpine_Linux_Infra_HTTP:HTTP 触发器”不为 1
  • 通过电子邮件通知受影响的用户

另请参阅

外部资源和完整指南