Установка, настройка агентов Zabbix для PHP-FPM, Docker и других служб

Zabbix агенты разворачиваются на наблюдаемых целях для активного мониторинга локальных ресурсов и приложений (статистика жестких дисков, памяти, процессоров и т.д.).

Агент локально собирает оперативную информацию и отправляет данные Zabbix серверу для дальнейшей обработки. В случае проблем (таких как отсутствие свободного места на жестком диске или аварийного завершения процесса сервиса), Zabbix сервер может быстро уведомить администраторов конкретного сервера, сообщившего об ошибке.

Мониторинг сервисов позволяет не только узнать о проблемах, но и даёт возможность оптимизировать конфигурацию и нагрузку.

Zabbix агент 2 - новое поколение Zabbix агента, его можно использовать в качестве замены Zabbix агента. Агент 2 написан на Golang (Go).

  • Официальная документация как скачать и установить Zabbix Агента.
  • Zabbix SIA поставляет официальные RPM и DEB пакеты для Red Hat Enterprise Linux, Debian и Ubuntu LTS. Файлы пакетов доступны по адресу http://repo.zabbix.com. Репозитории yum и apt также доступны на сервере.

Установка:

apt install zabbix-agent2

Уберем все лишние из конфига агента Заббикс:

sed -i.bak '/ *#/d; /^$/d' zabbix_agent2.conf

После подставляем 3 параметра в zabbix_agent2.conf и агент настроен

Server=zabbix.example.net
ServerActive=zabbix.example.net
Hostname=cz394

где:

  1. Server=zabbix.example.net # IP addresses (or hostnames) of Zabbix servers
  2. !!! Hostname=cz394 # Должно совпадать с Host name указанном на Zabbix servers. Используйте Visible name (на Zabbix server) для написания удобочитаемых названий ваших серверов.
  3. ServerActive=zabbix.example.net # IP:port (or hostname:port) pairs of Zabbix servers for active checks

Перезагрузим агента для применения настроек

systemctl restart zabbix-agent2

В первую очередь разберитесь как Заббикс агент находит запущенные процессы используя функцию proc.num. Казалось бы все просто, например выбрать количество процессов по имени и пользователю получим 6:

zabbix_get -s localhost -k 'proc.num[zabbix_agentd,zabbix]'
6

Можем даже упростить и оставить только имя процесса, то же получим 6 и команда ps тоже утверждает что 6.

zabbix_get -s localhost -k 'proc.num[zabbix_agentd]'
6
 
ps -ef | grep zabbix_agentd
zabbix       951       1  0  2023 ?        00:00:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix       952     951  0  2023 ?        00:09:04 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
zabbix       953     951  0  2023 ?        00:08:02 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
zabbix       954     951  0  2023 ?        00:07:58 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
zabbix       955     951  0  2023 ?        00:08:00 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
zabbix       956     951  0  2023 ?        00:06:36 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]

Возьмем другую службу например php-fpm И команда ps нам скажет что процессов 48

ps -ef | grep php-fpm | wc -l
48
ps -ef | grep php-fpm
...
www-data 3103692 3103690  0 Jan08 ?        00:02:16 php-fpm: pool sock-1-81
www-data 3103693 3103690  0 Jan08 ?        00:02:17 php-fpm: pool sock-1-81
www-data 3103694 3103690  0 Jan08 ?        00:02:16 php-fpm: pool sock-2-81
...

Но Заббикс напишет что процессов 0

zabbix_get -s localhost -k 'proc.num["php-fpm"]'
0

Это связано с тем, что Zabbix agent начинает с проверки имени процесса. Открывает файл /proc/<pid>/status и проверяет строку Name. В нашем случае строки Name это:

grep Name /proc/{3103692,3103693,3103694}/status
 
/proc/3103692/status:Name:      php-fpm8.1
/proc/3103693/status:Name:      php-fpm8.1
/proc/3103694/status:Name:      php-fpm8.1

Поэтому в proc.num нужно указывать php-fpm8.1. Проверяем и получаем количество процессов 47:

zabbix_get -s localhost -k 'proc.num["php-fpm8.1"]'
47

Примеры использования параметров командной строки:

  • отображение всех встроенных элементов данных с их значениями
zabbix_agent2 --print
  • Тестирование пользовательского параметра с ключом "mysql.ping", заданном в указанном файле конфигурации
zabbix_agent2 -t "mysql.ping" -c /etc/zabbix/zabbix_agent2.conf
  • увеличение уровня журналирования агента
zabbix_agent2 -R log_level_increase
  • вывод опций управления работой
zabbix_agent2 -R help
  1. Откройте страницу Host в Web-интерфейсе Zabbix для узла, на котором нужно контролировать работу MariaDB. Затем добавьте к хосту шаблон MySQL by Zabbix agent 2.
  2. Чтобы этот шаблон заработал, нужно создать пользователя, например zbx_monitor, с правами которого будет выполняться мониторинг
    CREATE USER 'zbx_monitor'@localhost IDENTIFIED BY '********';
    GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@localhost;
  3. Настроим макросы шаблона MySQL by Zabbix agent 2: В макросе
    • {$MYSQL.DSN} задайте адрес и порт для подключения к MariaDB как
      tcp://localhost:3306
    • в макросах {$MYSQL.USER} и {$MYSQL.PASSWORD} задайте, соответственно, имя пользователя zbx_monitor и его пароль.

На скриншоте более наглядно

Добавляем нужному хосту шаблон Docker by Zabbix agent 2. Добавляем пользователя zabbix в группу docker.

usermod -aG docker zabbix
systemctl restart zabbix-agent2.service

Обязательно перезапускаем заббикс агента. Дополнительно протестировать с хоста Zabbix сервера, можно командой

zabbix_get -s docker-host -k docker.info
 
{"Id":"65231107-5ecb-4d85-87ab-6b81913e4420","Containers":1,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":1,"Images":1,"Driver":"overlay2","MemoryLimit":true,"SwapLimit":true,"KernelMemory":false,"KernelMemoryTCP":false,"CpuCfsPeriod":true,"CpuCfsQuota":true,"
...

На продакшене редко используется конфигурация PHP-FPM по умолчанию. В нашем случае проблема заключатся в пулах PHP-FPM созданных для upstream в Nginx оптимизация и использование, для наглядности привожу конфиг:

nano /etc/nginx/conf.d/upstream_php81.conf
 
upstream php-fpm81 {
        server unix:/var/run/sock81-1.sock;
        server unix:/var/run/sock81-2.sock;
        server unix:/var/run/sock81-3.sock;
        server unix:/var/run/sock81-4.sock;
}

Вторая проблема, которая может возникнуть, когда у вас установлено и используется несколько версий PHP-FPM, например сейчас часто запущены PHP 7.4 и PHP 8.1. В этом случае для каждой версии PHP мониторинг придется настраивать отдельно.

Чем эта инструкция отличается от официальной документации для Template App PHP-FPM by Zabbix agent:

  1. Для доступа используем директиву server, а не просто location, что позволяет упростить и обезопасить доступ к статистике.
  2. Мониторим конкретную версию PHP
  3. Мониторим только 1 пул sock81-4. Пулы настраиваются в моем случае в файле /etc/php/8.1/fpm/pool.d/www.conf.

PHP-FPM имеет встроенный инструмент для предоставления статистики. Для того что бы активировать необходимо задать соответствующий параметр в конфигурационном файле. Не забываем, у вас может быть установлено несколько версий PHP.

В моем случае в конфигурационный файл PHP для пула sock81-4 добавляем 3 параметра указанные после комментария "PM status enable":

nano /etc/php/8.1/fpm/pool.d/www.conf
 
[sock-4-81]
user = www-data
group = www-data
listen = /var/run/sock81-4.sock
listen.owner = www-data
listen.group = www-data
...
; PM status enable
pm.status_path = /status
ping.path = /ping
ping.response = pong
; PM status END
...

В Nginx создаем сервере на localhost порт 8181 в отдельном файле, которые будет автоматически загружаться

nano /etc/nginx/conf.d/001-php-fpm_status.conf
 
server {
listen       127.0.0.1:8181;
 
location ~ ^/(status|ping)$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass   unix:/var/run/sock81-4.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
access_log   off;
        }
}

После внесения изменений в конфигурации PHP-FPM и NGINX проверьте правильность синтаксиса их конфигурации следующим образом:

php-fpm8.1 -t
nginx -t

Если ошибок нет применяем изменеия

systemctl reload php8.1-fpm.service
systemctl reload nginx

Проверяем 2 командами, используй curl:

curl http://127.0.0.1:8181/ping
pong
curl http://127.0.0.1:8181/status
pool:                 sock-4-81
process manager:      dynamic
start time:           12/Jan/2024:18:32:46 +0200 # время запуска FPM (FastCGI Process Manager)
start since:          424 # время в секундах с момента запуска
accepted conn:        12 # количество обработанных пулом запросов
listen queue:         0 # количество запросов в очереди на обработку этим пулом, если количество > 0 – надо
подумать об увеличении количества процессов;
max listen queue:     0
listen queue len:     0
idle processes:       1
active processes:     1
total processes:      2
max active processes: 1
max children reached: 0 # максимальное количество дочерних потоков PHP-FPM с момента запуска, если количество >0 –
есть смысл подумать об увеличении pm.max_children
slow requests:        0

В настройках узла на Zabbix сервере добавляем шаблон "PHP-FPM by Zabbix agent", меняем порт на 8181. И теперь важно подставляем настоящее имя вашего процесса php-fpm в переменную {$PHP_FPM.PROCESS_NAME}, в моем случае это будет php-fpm8.1 (как найти настоящее имя процесса подробно описано Отладка Zabbix Агента).

Для измерения количества медленных запросов должен быть включён slowlog.

PQ VPS сервера в 28+ странах.