UMGUM.COM 

Инсталляция сервера Zabbix ( Инсталляция сервера системы мониторинга Zabbix. )

24 марта 2013  (обновлено 30 марта 2021)

OS: "Linux Debian 8/9", "Linux Ubuntu Server 16/18 LTS".
Apps: "Zabbix Server v3/4 LTS", "MySQL", "Nginx", "PHP-FPM", LDAP.

Задача: развернуть и преднастроить систему мониторинга "Zabbix".

Последовательность дальнейших действий такова:

1. Подготовка системного окружения (отдельная инструкция);
2. Установка сервера СУБД "MySQL" и создание "базы данных";
3. Инсталляция и настройка интерпретатора PHP;
4. Установка и настройка фронтального web-сервера "Nginx";
5. Развёртывание и преднастройка "Zabbix Server";
6. Настройка аутентификации через внешний сервис LDAP/AD;
7. Настройка почтовых оповещений в "Zabbix".


Установка сервера СУБД "MySQL" и создание "базы данных".

Система мониторинга "Zabbix" одинаково хорошо работает с "PostgreSQL" и "MySQL". Я развёртывал несколько схем в обеих вариантах, и они успешно работали годами. Не могу сказать, чтобы какая-то была лучше. На этот раз воспользуемся "MySQL":

# apt-get install --no-install-recommends mysql-server

Предварительно создадим или обновим параметры прав доступа директории хранения временных файлов - она будет затронута при оптимизации работы СУБД:

# mkdir -p -m 750 /var/lib/mysql/tmp
# chown -R mysql:mysql /var/lib/mysql/tmp

Основное требование, предъявляемое "Zabbix" к "MySQL" - поддержка формата хранения данных в "InnoDB":

# vi /etc/mysql/mysql.conf.d/mysql.cnf

....
[mysqld]
....
bind-address = 127.0.0.1
....
tmpdir = /var/lib/mysql/tmp
innodb_tmpdir = /var/lib/mysql/tmp
....
tmp_table_size = 512M
....
max_heap_table_size = 512M
....
innodb_buffer_pool_size = 2G # (default: 128MB; optimal: 60% RAM)
innodb_log_file_size = 512M # (default: 5MB)
innodb_log_buffer_size = 256M # (default: 8MB)
....
innodb_flush_log_at_trx_commit = 2
....
innodb_file_format = barracuda
innodb_large_prefix = 1
innodb_file_per_table = 1
....

Проверяем корректность синтаксиса конфигурационных файлов MySQL-сервера и перезапускаем таковой:

# mysqld --verbose --help 1>/dev/null
# /etc/init.d/mysql restart

Заранее создадим БД для последующего применения её при настройке сервера "Zabbix":

# mysql
mysql> DROP DATABASE zabbix;
mysql> CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;
mysql> CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'strongPassword';
mysql> GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> QUIT;

Оптимизация работы MySQL с дисковой подсистемой.

Для СУБД, активно создающей и уничтожающей файлы для временных таблиц, выгодно вынести (параметрами "tmpdir") эту работу в файловую систему, смонтированную в область памяти ОЗУ:

# vi /etc/fstab

....
# Tuning the location of MySQL temporary files
tmpfs /var/lib/mysql/tmp tmpfs rw,nosuid,nodev,size=2G,uid=mysql,gid=mysql,mode=0750 0 0
....

# mount /var/lib/mysql/tmp

Я бы выделил под эту файловую систему до 25% от всей ОЗУ (она не заблокирует всё заявленное место, а будет выбирать блоки памяти по мере появления необходимости).

Инсталляция и настройка интерпретатора PHP.

Устанавливаем интерпретатор PHP и необходимые для работы "Zabbix" модули расширения:

# apt-get install php7.2-fpm php7.2-cgi php7.2-cli php7.2-opcache php7.2-bcmath php7.2-gd php7.2-ldap php7.2-mbstring php7.2-mysql php7.2-xml

Предварительно создадим или обновим параметры прав доступа директории хранения файлов web-сессий - в дальнейшем мы слегка это оптимизируем:

# mkdir -p /var/lib/php/sessions
# chmod go-r /var/lib/php/sessions
# chmod +t /var/lib/php/sessions

Рассматривать здесь полную настройку PHP-интерпретатора не вижу смысла и обращу внимание лишь на особенности, необходимые для работы "Zabbix":

# vi /etc/php/7.2/fpm/php.ini

....
date.timezone = Asia/Novosibirsk
....
cgi.fix_pathinfo = 0
session.auto_start = 0
mbstring.func_overload = 0
....

Обязательно проверяем корректность конфигурации, простейшим тестированием:

# php -e -c /etc/php/7.2/fpm/php.ini -r 'echo "OK\n";';

Опишем выделенный для "Zabbix" FPM-пул, для чистоты схемы и достижения лучшей производительности:

# vi /etc/php/7.2/fpm/pool.d/zabbix.conf

; Блок описания отдельного инстанса PHP-FPM
[zabbix]

; Unix user/group of processes
user = www-data
group = www-data

; The address on which to accept FastCGI requests
; Явно переключаемся на работу через локальный файловый "сокет", снижая задержки при вызовах
; (открытие файла всегда быстрее сетевой операции)
; listen = 127.0.0.1:9000
listen = /var/run/php/zabbix-php-fpm.sock

; Set permissions for Unix socket
listen.owner = www-data
listen.group = www-data
listen.mode = 0600

; Режим запуска инстанса
pm = dynamic
; Количество процессов, запускаемых при старте PHP-FPM
pm.start_servers = 20
; Максимальное количество процессов, которые могут быть запущены для обработки запросов
pm.max_children = 512
; Параметры количества запущенных неактивных процессов (находящихся в ожидании запросов)
pm.min_spare_servers = 5
pm.max_spare_servers = 20
; Количество запросов, после которого процесс будет перезапущен (для компенсации "утечек памяти" в скриптах)
pm.max_requests = 4096

php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/sessions/
php_value[max_execution_time] = 300
php_value[memory_limit] = 128M
php_value[post_max_size] = 16M
php_value[upload_max_filesize] = 2M
php_value[max_input_time] = 300
php_value[max_input_vars] = 10000

Удаляем ненужный файл конфигурации "по умолчанию", проверяем корректность новой и перезапускаем FPM-сервис:

# rm /etc/php/7.2/fpm/pool.d/www.conf
# /etc/init.d/php7.2-fpm restart

Оптимизация работы PHP с дисковой подсистемой.

Для ускорения операций создания и поддерживания PHP-интерпретатором web-сессий удобно вынести директорию файлов хранения таковых в специально созданную директорию, смонтированную в область ОЗУ.

Место сохранения сессий в PHP определяется параметром "session.save_path" и по умолчанию оно располагается в директории "/var/lib/php/sessions". Точнее всего это выявляется через вывод функции "php_info()". Мне представляется самым простым смонтировать поверх этой директории кусочек "tmpfs":

# vi /etc/fstab

....
# Tuning PHP-sessions`s place
tmpfs  /var/lib/php/sessions  tmpfs  rw,nosuid,nodev,size=1024M,uid=www-data,gid=www-data,mode=0750  0  0
....

# mount /var/lib/php/sessions

Сразу настраиваем простейший "сборщик мусора", удаляющий устаревшие файлы сессий:

# vi /etc/crontab

....
# Garbage collection for old files sessions of PHP (lifetime 31 days; in minutes)
03 */3  * * *  root [ -d /var/lib/php/sessions ] && nice find /var/lib/php/sessions -type f -cmin +44640 -exec rm -f {} \; 1>/dev/null &
....

Установка и настройка фронтального web-сервера "Nginx".

Разработчики "Zabbix" рекомендуют к применению web-сервер "Apache2", но мы воспользуемся существенно более легковесным "Nginx" - это работает:

# apt-get install nginx-light

Для последующего включения в "Nginx" современного SSL/TLS и HTTPv2 генерируем DH-файл:

# mkdir -p /etc/ssl/nginx && chown -R root:root /etc/ssl/nginx
# openssl dhparam -out /etc/ssl/nginx/dhparam.2048.pem 2048

Слегка корректируем глобальную конфигурацию web-сервиса:

# vi /etc/nginx/nginx.conf

user www-data www-data;
....
worker_processes 8;
....
events {
  worker_connections 1024;
  ....
}

http {
  ....
  tcp_nodelay on;
  tcp_nopush on;

  # Запрещаем web-серверу сообщать о себе подробные данные
  server_tokens off;

  # Запрещаем просмотр содержимого директории, если не указан целевой файл
  autoindex off;

  # Отключаем проверку размера тела передаваемого PHP-FPM запроса
  client_max_body_size 0;

  client_body_buffer_size 4M;
....

Описываем типовую конфигурацию для web-сайта "Zabbix":

# vi /etc/nginx/sites-available/zabbix.example.net.conf

server {
  listen 80;
  server_name zabbix.example.net;
  location / { rewrite ^(.+)$ https://$host$1 permanent; }
  #include /etc/nginx/snippets/letsencrypt.conf;
}

server {
  listen 443 ssl http2;
  server_name zabbix.example.net;

  access_log /var/log/nginx/zabbix.example.net_access.log;
  error_log /var/log/nginx/zabbix.example.net_error.log;

  ssl_dhparam /etc/ssl/nginx/dhparam.2048.pem;
  ssl_certificate /etc/ssl/nginx/wildcard.example.net.crt;
  ssl_certificate_key /etc/ssl/nginx/wildcard.example.net.key.decrypt;
  ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;

  # Выключаем невостребованную обычно перекодировку контента
  charset off;

  # Явно указываем корень файловой структуры сайта, выше которой web-сервер не должен выходить
  root /var/www/zabbix.example.net/www;
  index index.php;

  # Глобальный обработчик событий отсутствия запрашиваемого файла
  location / {
    try_files $uri $uri/ =404;
  }

  # Блокируем доступ к типовым "закрытым" ресурсам
  location ~* (/\.ht|/\.hg|/\.config) {
    deny all;
    log_not_found off;
    access_log off;
  }

  # Блокируем доступ извне к внутренностям "Zabbix"
  location ~ /(api\/|conf[^\.]|include|locate) {
    deny all;
    log_not_found off;
    access_log off;
    return 404;
  }

  # Обработчик прямых обращений к PHP-скриптам
  location ~* \.php$ {
    include       /etc/nginx/fastcgi_params;
    fastcgi_pass  unix:/var/run/php/zabbix-php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_intercept_errors     on;
    fastcgi_ignore_client_abort  off;
    fastcgi_connect_timeout      60;
    fastcgi_send_timeout         180;
    fastcgi_read_timeout         180;
    fastcgi_buffer_size          128k;
    fastcgi_buffers              4 256k;
    fastcgi_busy_buffers_size    256k;
    fastcgi_temp_file_write_size 256k;
  }

  # Напрямую отдаём "статические" данные
  location /assets {
    expires    10d;
    access_log off;
  }
}

Удаляем файл конфигурации "по умолчанию", подключаем новую, проверяем синтаксическую корректность и применяем:

# rm /etc/nginx/sites-enabled/default
# ln -s /etc/nginx/sites-available/zabbix.example.net.conf /etc/nginx/sites-enabled/zabbix.example.net.conf
# nginx -t && nginx -s reload

Развёртывание и преднастройка "Zabbix Server".

Интерфейс только что вышедшего "Zabbix 5.0 LTS" сыроват и мне лично очень неудобны нововведения вроде безальтернативного навязывания бокового меню, замены шаблонов параметров мониторинга и вообще откровенная нелепость попытки обвязать широкопанельный формат отображения "фенечками", свойственными лишь мелким экранам мобильных телефонов. Останусь пока с "Zabbix 4.0 LTS", официально поддерживаемом до 31 Октября 2023.

Наконец-то "Zabbix" как продукт созрел до того, что его можно инсталлировать как DEB/RPM-пакет, без сборки из исходных кодов, как это было ранее. Из официальной документации узнаём, что по состоянию на 2020-й года разработчики поддерживают пакеты для "Linux Debian 8/9" и "Linux Ubuntu 16/18 LTS", загрузить которые можно с подключаемых репозиториев.

Установим утилиты, необходимые для ручного подключения дополнительных APT-репозиториев:

# apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

Перед подключением нового APT-репозитория скачаем и применим PGP-ключ, которым подписано содержимое репозитория:

# curl -fsSL https://repo.zabbix.com/zabbix-official-repo.key | sudo apt-key add -

Создаём выделенный конфигурационный файл с описанием подключаемого APT-репозитория:

# echo -e "# Official APT-repository Zabbix\ndeb [arch=amd64] http://repo.zabbix.com/zabbix/4.0/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) main\ndeb-src [arch=amd64] http://repo.zabbix.com/zabbix/4.0/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) main" > /etc/apt/sources.list.d/zabbix.list

Обновляем сведения о доступном программном обеспечении и устанавливаем "Zabbix Server" с дополнительными утилитами, нужными для мониторинга:

# apt-get update
# apt-get install zabbix-server-mysql fping traceroute nmap

Подготовим более удобное месторасположение для PHP-кода сайта "Zabbix":

# mkdir -p /var/www/zabbix.example.net/www
# setfacl --no-mask --set default:user::rwX,default:group::rwX,default:other:--X /var/www/zabbix.example.net/www

Разместим PHP-код "Zabbix" в выделенном для этого месте:

# cp -a /usr/share/zabbix/* /var/www/zabbix.example.net/www/

Ограничим несанкционированный доступ к PHP-коду:

# chown -R www-data:www-data /var/www/zabbix.example.net/www
# chmod -R ug+rw /var/www/zabbix.example.net/www
# chmod -R o-rw /var/www/zabbix.example.net/www

Введём пользователя, в контексте которого по умолчанию (пользователь "zabbix" автоматически создаётся при инсталляции "Zabbix Server" из DEB-пакета) работает сервер мониторинга, в группу web-сервера, чтобы zabbix-сервер мог воздействовать на файлы конфигурации сайта:

# usermod --append --groups www-data zabbix

Разрешаем пользователю, в контексте которого работает "Zabbix Server", запускать утилиту сканирования сети с правами суперпользователя (в противном случае часть функций "nmap" будет урезана):

# echo "zabbix ALL=(ALL) NOPASSWD: /usr/bin/nmap -O *" > /etc/sudoers.d/zabbix
# visudo -cf /etc/sudoers.d/zabbix

Передадим в СУБД "MySQL" заготовленную разработчиками серию команд, создающую необходимые таблицы:

# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -u zabbix -p zabbix

Остаётся лишь задать пароль к БД в конфигурации "Zabbix Server":

# vi /etc/zabbix/zabbix_server.conf

....
DBPassword=striongPassword
....

Перезапускаем сервис системы мониторинга и включаем его автозапуск:

# systemctl start zabbix-server && systemctl enable zabbix-server

Настройка аутентификации через внешний сервис LDAP/AD.

Практически наверняка корпоративный LDAP/AD работает с "самоподписанным" или сложно проверяемым SSL-сертификатом. Сервисам, пользующимся таким LDAP/AD, нужно явно разрешить допускать работу с любым SSL-сертификатом:

# vi /etc/environment

....
LDAPTLS_REQCERT="allow"

Внутрь PHP-FPM "пула" системные переменные окружения не передаются без явного на то указания:

# vi /etc/php/7.2/fpm/pool.d/zabbix.conf

[zabbix]
....
clear_env = No
env[LDAPTLS_REQCERT] = "allow"
....

Укажем PHP-FPM принять обновлённую конфигурацию:

# /etc/init.d/php7.2-fpm reload

В web-интерфейсе "Zabbix" настройки подключения к LDAP-сервису достаточно просты и очевидны, чтобы не требовалось их комментировать:

Administration -> Authentication -> LDAP settings:
  Enable: on
  LDAP host: ldaps://ldap0.example.net
  Port: 636
  Base DN: ou=People,dc=example,dc=net
  Search attribute: uid
  Bind DN: uid=zabbix,ou=Accounts,ou=Services,dc=example,dc=net
  Case sensitive login: off
  Bind password: ***

При этом есть нюанс - в web-интерфейсе отсутствует возможность указания крайне важного параметра фильтра пользователей, которым разрешена аутентификация. Пока эта функциональность не добавлена в web-интерфейс, на сайте разработчиков рекомендуют задать фильтр прямо в PHP-коде сайта:

# vi ./include/classes/ldap/CLdap.php

class CLdap {
  ....
  public function __construct($arg = []) {
    ....
    $this->cnf = [
      ....
//      'userfilter' => '(%{attr}=%{user})',
      'userfilter' => '(&(%{attr}=%{user})(objectclass=person)(memberOf=cn=zabbixusers,ou=groups,dc=example,dc=net))',
      ....
    ];
    ....
  }  
  ....
}

С последующим использованием LDAP-аутентификации в "Zabbix" тоже пока не всё гладко, хотя вполне работоспособно. Прежде всего указать тип аутентификации для произвольного пользователя нельзя - это делается только для группы таковых. То есть, вначале надо создать выделенную группу (группы, на практике) пользователей, в параметрах которой указать, что аутентификация её членов должна производиться через LDAP:

Administration -> User groups -> Create user group:
  Group name: Example users (LDAP)
  Frontend access: LDAP
  ....

Пользователя, который должен аутентифицироваться через LDAP, нужно предварительно создать в web-интерфейсе "Zabbix", после чего ввести в заготовленную ранее группу, членам которой предписано аутентифицироваться только через LDAP:

Administration -> Users -> Create user:
  Alias: user
  Groups: Example users (LDAP)
  Password: (not mandatory for non internal authentication type)
  Media:
    Type: Email
    Send to: user@example.net
  Permissions:
    User type: Zabbix Admin
    Permissions: All groups Read-write

Настройка почтовых оповещений в "Zabbix".

Прежде всего нужно обеспечить отправку почтовых сообщений через какой-то сервер:

Administration -> Media types -> Email:
  Type: Email
  SMTP server: mail.example.net
  SMTP server port: 25
  ....
  Enabled: on

Отключаем неиспользуемые типы информирования:

Administration -> Media types -> Jabber, SMS:
  Disable.

По умолчанию оповещения через почту или другие сервисы в "Zabbix" отключены. Чтобы рассылка уведомлений работала в соответствии со спецификой объектов мониторинга, желательно завести разные группы таковых и связать группы объектов мониторинга с группами пользователей или конкретными пользователями, которым будут высылаться уведомления.

Создаём несколько групп пользователей, с говорящими о назначении названиями:

Configuration -> Host groups -> Create host group:
  Development services
  Hypervisors
  Infrastructure objects
  Linux servers
  Network access
  Power devices
  Public services
  Windows servers

Описываем логику рассылки уведомлений в зависимости от групп пользователей:

Configuration -> Actions -> Create action:
  Action:
    Name: Report problems to infrastructure administrators
    Conditions:
      Host group equals Development services
      ....
      Host group equals Windows servers
  Operations:
    ....
    Operations:
      Send message to user groups: Example infrastructure administrators via all media


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )