Cacti – мониторинг серверов, сети и оборудования

Почему Cacti, когда есть Zabbix, Prometheus, Grafana?

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

Имеется домашний сервер, стоящий на шкафу в коридоре с ESXi и парой виртуалок, на которых хостятся мои сайты, установлен медиа сервер Plex, настроена Samba для удобного закидывания фильмов с компа и редактирования различных своих проектов, прямо на сервере, с компьютера в саблайм тексте.

Также дома есть управляемый коммутатор с SNMP, роутер MikroTik, плюс три VDS сервера в других странах, которые используются в основном для VPN.

За основу написание этого мануала была взята официальная документация, которая очень устарела и местами не полная, поэтому была переработана и актуализирована:
https://docs.cacti.net/Installing-Under-Ubuntu-Debian.md
https://docs.cacti.net/Install-Under-CentOS_LEMP.md

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

Установка необходимого ПО

По мануалу https://www.linuxcapable.com/how-to-install-php-on-debian-linux/, подключаю репозитории для последней версии php.

#обновляю репозитории
apt update

#обновляю пакеты  
apt upgrade  

#устанавливаю необходимое ПО  
apt install php-fpm  
apt install nginx  
apt install rrdtool  
apt install mariadb-server  
apt install snmp  
apt install snmpd  
apt install sendmail

Установка модулей PHP

apt install php-mysql  
apt install php-gd  
apt install php-gmp  
apt install php-intl  
apt install php-ldap  
apt install php-mbstring  
apt install php-xml  
apt install php-snmp

Посмотреть установлен ли модуль можно так:

php -m | grep -i snmp

Но можно и сразу устанавливать, если пакет поставлен то ничего не произойдет, а будет такое сообщение, например:
”Уже установлен пакет php-snmp самой новой версии”

Установка Spine

Можно обойтись и без него, но я установлю, он работает быстрее, чем пулер cmd.php

Установите необходимые пакеты для компиляции и установки:

apt install automake  
apt install build-essential  
apt install libtool  
apt install libmysql++-dev  
apt install libsnmp-dev  
apt install help2man

Качем с сайта https://www.cacti.net/info/downloads разархивируем, переходим в директорию и запускаем:

./bootstrap  
./configure  
make  
make install

Затем убедитесь, что двоичный файл spine принадлежит учетной записи root, и установите бит suid для утилиты, выполнив следующие команды.

chown root:root /usr/local/spine/bin/spine  
chmod +s /usr/local/spine/bin/spine

Теперь отредактируйте файл конфигурации Cacti Spine и добавьте имя базы данных cacti, пользователя и пароль в файл конфигурации Spine, как показано в приведенном ниже примере.

cp /usr/local/spine/etc/spine.conf.dist /usr/local/spine/etc/spine.conf  
nano /usr/local/spine/etc/spine.conf

Добавьте следующую конфигурацию в файл spine.conf.

DB_Host localhost  
DB_Database your_cacti_database  
DB_User your_cacti_username  
DB_Pass your_cacti_password  
DB_Port 3306  
#DB_UseSSL 0  
#RDB_SSL_Key  
#RDB_SSL_Cert  
#RDB_SSL_CA

Ну и не забыть прописать пути в вебе к конфигу и бинарнику (во время веб установки)

Настройка PHP

Установите часовой пояс для вашей конфигурации PHP.INI

Отредактируйте php.ini, обычно расположенный в /etc/php/8.2/fpm/php.ini

date.timezone = Asia/Yekaterinburg

Отключить небезопасный cgi.fix_pathinfo

cgi.fix_pathinfo=0
#max_execution_time = 30  
max_execution_time = 60  

#memory_limit = 128M  
memory_limit = 400M
systemctl restart php8.2-fpm

www.conf

Отредактируйте файл /etc/php/8.2/fpm/pool.d/www.conf

Найдите listen = 127.0.0.1:9000 и добавьте следующую строку ниже

listen = /var/run/php-fpm/php-fpm.sock  
#уже стоит в конфиге listen = /run/php/php8.2-fpm.sock

Менять не нужно, уже стоит правильно.

Найдите listen.owner и listen.group и установите для них nginx (по офф. доке)

По факту там уже прописано так, как и должно быть:

listen.owner = www-data  
listen.group = www-data

То же самое тут, так и должно быть:

user = www-data  
group = www-data

Перезапускаем:

systemctl restart php-fpm

Настройка Nginx

  1. Создаем виртуалхост, с нужным для cacti доменом
  2. Создаем директорию в которой будет располагаться cacti
  3. Устанавливаем cerbot для работы с Let’s Encrypt
  4. Получаем сертификат для нашего домена где будет cacti

Конфиг nginx сам изменится и пропишет пути до сертификатов, лучше этот конфиг отдельно сохранить, чтобы потом взять оттуда эти пути.

Потом все в конфиге удаляем и вставляем конфиг из:

https://docs.cacti.net/Install-Under-CentOS_LEMP.md

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

Мой конфиг

В gzip_types убрана text/html, так как в логе был варнинг:
”duplicate MIME type "text/html" in /etc/nginx/sites-enabled/cacti.s3e.ru:25”

А в документации по nginx написано
"Ответы с типом “text/html” сжимаются всегда."
Поэтому явное указание этого типа, воспринимается как дубль, так как оно включено по умолчанию.

Блок location /cacti закомментирован, так как у меня cacti расположен в корне сайта, а не в отдельной директории site.ru/cacti.

В конфиге необходимо проверить пути до директории, до сертификатов, домен и прочие параметры.

# Advanced config for NGINX  
#server_tokens off;  
add_header X-XSS-Protection "1; mode=block";  
add_header X-Content-Type-Options nosniff;  

# Redirect all HTTP traffic to HTTPS  
server {  
 listen 80;  
 #server_name cacti.yourdomain.com; #No one likes unencrypted web servers  
 server_name cacti.s3e.ru;  
 #return 301 https://$host$request_uri; # some nginx do not support 'return';  
}  

# SSL configuration  
server {  
 #listen 443 ssl default deferred;  
 listen 443 ssl deferred;  
 #server_name cacti.yourdomain.com;  
 server_name cacti.s3e.ru;  
 #root /usr/share/nginx/html/cacti;  
 root /home/s3e/www/cacti.s3e.ru;  
 index index.php index.html index.htm;  

 # Compression increases performance0  
 gzip on;  
 #gzip_types  text/plain text/html text/xml text/css application/xml application/javascript application/x-javascript application/rss+xml application/xhtml+xml;  
 gzip_types  text/plain text/xml text/css application/xml application/javascript application/x-javascript application/rss+xml application/xhtml+xml;  
 gzip_proxied  no-cache no-store private expired auth;  
 gzip_min_length 1000;  

 location / {  
  try_files $uri $uri/ /index.php$query_string;  
 }  

 error_page 404 /404.html;  
 error_page 500 502 503 504 /50x.html;  
 location = /50x.html {  
  #root /usr/share/nginx/html/;  
  root /home/s3e/www/cacti.s3e.ru/;  
 }  

 location ~ \.php$ {  
  #alias /usr/share/nginx/html/cacti;  
  alias /home/s3e/www/cacti.s3e.ru;  
  index index.php  
  try_files $uri $uri/ =404;  
  fastcgi_split_path_info ^(.+\.php)(/.+)$;  

  # you may have to change the path here for your OS  
  #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;  
  fastcgi_pass unix:/var/run/php/php-fpm.sock;  
  fastcgi_index index.php;  
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
  include /etc/nginx/fastcgi_params;  
 }  

# location /cacti {  
#  root /usr/share/nginx/html/;  
#  index index.php index.html index.htm;  
#  location ~ ^/cacti/(.+\.php)$ {  
#   try_files $uri =404;  
#   root /usr/share/nginx/html;  
#  
#   # you may have to change the path here for your OS  
#   fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;  
#   fastcgi_index index.php;  
#   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
#   include /etc/nginx/fastcgi_params;  
#  }  
#  
#  location ~* ^/cacti/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {  
#   expires max;  
#   log_not_found off;  
#  }  
# }  

 location /doc/ {  
  #alias /usr/share/nginx/html/cacti/doc/;  
  alias /home/s3e/www/cacti.s3e.ru/doc/;  
  location ~* ^/docs/(.+\.(html|md|txt))$ {  
   #root /usr/share/nginx/html/cacti/;  
   root /home/s3e/www/cacti.s3e.ru/;  
   autoindex on;  
   allow 127.0.0.1; # Change this to allow your local networks  
   allow ::1;  
   deny all;  
  }  
 }  

 #location /cacti/rra/ {  
 location /rra/ {  
  deny all;  
 }  

 ## Access and error logs.  
 #access_log /var/log/nginx/cacti_access.log;  
 #error_log /var/log/nginx/cacti_error.log info;  
 access_log /var/log/nginx/cacti.s3e.ru_access.log;  
 error_log /var/log/nginx/cacti.s3e.ru_error.log info;  

 #ssl_certificate  /etc/ssl/certs/YourOwnCertFile.crt;  
 #ssl_certificate_key /etc/ssl/private/YourOwnCertKey.key;  
 ssl_certificate  /etc/letsencrypt/live/cacti.s3e.ru/fullchain.pem;  
 ssl_certificate_key /etc/letsencrypt/live/cacti.s3e.ru/privkey.pem;  

 # Improve HTTPS performance with session resumption  
 ssl_session_cache shared:SSL:10m;  
 ssl_session_timeout 5m;  

 # Enable server-side protection against BEAST attacks  
 #ssl_prefer_server_ciphers on;  
 ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;  

 # Disable SSLv3  
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  

 # Diffie-Hellman parameter for DHE cipher suites  
 # $ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096  
 #ssl_dhparam /etc/ssl/certs/dhparam.pem;  
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;  

 # Enable HSTS (https://developer.mozilla.org/en-US/docs/Security/HTTP_Strict_Transport_Security)  
 add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";  
}

Настройка MySQL

Защитите свою установку MySQL, прежде чем вносить какие-либо изменения.

/usr/bin/mysql_secure_installation

При запуске скрипта предложит удалить тестового юзера, тестовые базы, проверит доступ рута и прочее…

Заполнить таблицу часовых поясов

Заполнить таблицу часовых поясов доступными часовыми поясами

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

В табличках time_zone_name и time_zone в базе mysql было пусто, после выполнения комманды там появились записи.

Отредактируйте файл server.cnf

В моем случае конфиг лежит тут: /etc/mysql/mariadb.conf.d/50-server.cnf

Установщик предоставит рекомендации, основанные на фактической системе, которые будут более адаптированы к вашей среде.

Поэтому я вставляю закомментированные параметры сейчас, чтобы во время веб установки можно было вернуться и изменить параметры на те, которые порекомендует система.

Все находится в блоке mysqld

Находим блок:

#  
# * Fine Tuning  
#

Добавляем в конец:

#max_heap_table_size=64M  
#tmp_table_size=64M

Находим блок:

#  
# * Character sets  
#

Параметр collation-server уже есть, коментим его и добавляем:

#collation-server = utf8mb4_general_ci (это закомментили)  
collation-server = utf8mb4_unicode_ci

Находим блок:

#  
# * InnoDB  
#

Добавляем в конец:

#innodb_file_format=Barracuda  
#innodb_large_prefix=1  
#innodb_buffer_pool_size=1024M #этот параметр уже есть в конфиге, но он закомменчен  
#innodb_doublewrite=OFF  
#innodb_flush_log_at_timeout=3  
#innodb_read_io_threads=32  
#innodb_write_io_threads=16  
#innodb_io_capacity=5000  
#innodb_io_capacity_max=10000

Ну и перезапускаем:

systemctl restart mysql

Во время установки в браузере, отобразятся рекомендуемые параметры, нужно будет разкоментить эти строки и подставить рекомендуемые значения.

Создание и наполнение базы

Создание базы данных:

mysql -u root -p  
#можно без -p так как авторизация по умолчанию по unix_socket  
CREATE DATABASE cacti DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;  
GRANT ALL PRIVILEGES ON cacti.* TO 'cacti'@'localhost' IDENTIFIED BY 'your_cacti_password';  
GRANT SELECT ON mysql.time_zone_name TO cacti@localhost;  
ALTER DATABASE cacti CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  
FLUSH PRIVILEGES;

Заполнение базы

Скачиваем дистриб https://www.cacti.net/info/downloads и разархивируем в директорию, которую создали на этапе настройки nginx.

Теперь вам нужно предварительно заполнить базу данных, используемую cacti.

mysql -u root cacti < /home/s3e/www/cacti.s3e.ru/cacti.sql

Конфиг cacti

Далее вам нужно будет создать файл config.php

cd /home/s3e/www/cacti.s3e.ru/include/  
cp config.php.dist config.php

Теперь отредактируйте файл config.php и обязательно измените настройки базы данных, чтобы они соответствовали вашим данным:

$database_type = 'mysql';  
$database_default = 'cacti';  
$database_hostname = 'localhost';  
$database_username = 'cactiuser';  
$database_password = 'cactipass';  
$database_port = '3306';  
$database_retries = 5;  
$database_ssl = false;  
$database_ssl_key = '';

Также надо изменить параметр $url_path = '/cacti/'; на

$url_path = '/';

В моем случае cacti будет расположен в корне, а не директории /cacti/

Веб установка

Если при заходе браузером ругается:
System log file is not available for writing, please enable write access Log: /home/s3e/www/cacti.s3e.ru/log/cacti.log

То делаю так:

chown www-data:www-data log/

Имя admin и пароль admin

Далее будут отображены проверки и предупреждения какие параметры в php или mysql необходимо исправить

Тут же можно и развернуть списки и посмотреть какие php модули обязательные. Если будет не хватать, то этот список не будет свернут и отобразится предупреждение.

Далее выбираю "New Primary Server”

Далее идет проверка на доступ к каталогам.

ПРИМЕЧАНИЕ. Если вы устанавливаете пакеты, после их установки вам следует изменить каталог scripts обратно на только для чтения, так как это создает некоторый доступ к веб-сайту.

Тут же, в окне будут команды для изменения прав, можно копировать и вставлять в консоль.

chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/resource/snmp_queries/  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/resource/script_server/  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/resource/script_queries/  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/scripts/  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/include/vendor/csrf/csrf-secret.php  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/cache/boost/  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/cache/mibcache/  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/cache/realtime/  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/cache/spikekill/

Если ругается что нет файла /home/s3e/www/cacti.s3e.ru/include/vendor/csrf/csrf-secret.php то делаем:

cd /home/s3e/www/cacti.s3e.ru/include/vendor/csrf/  
touch csrf-secret.php  
chown -R www-data.www-data /home/s3e/www/cacti.s3e.ru/include/vendor/csrf/csrf-secret.php

Проверки путей к ПО

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

Запустив в консоли команду rrdtool покажет версию
RRDtool 1.7.2 Copyright by Tobias Oetiker tobi@oetiker.ch

Настройка пуллера

Начиная с Cacti 1.2.16, у вас есть возможность использовать либо устаревшую запись Crontab, либо дополнительный файл cactid и сервер для запуска опросников Cacti.

Crontab (не использую)

Создайте и отредактируйте файл /etc/cron.d/cacti. Убедитесь, что вы указали правильный путь к poller.php

*/5 * * * * apache php /var/www/html/cacti/poller.php &>/dev/null

Модуль cactid

Для установки файла модуля systemd вам нужно будет изменить файл модулей, чтобы он соответствовал вашему местоположению установки, а также желаемому пользователю и группе для запуска опросника Cacti.

Чтобы выполнить задание, выполните следующую процедуру:

mcedit /home/s3e/www/cacti.s3e.ru/service/cactid.service

Тут надо изменить:

User=apache  
Group=apache  
# на  
User=www-data  
Group=www-data
ExecStart=/var/www/html/cacti/cactid.php  
# на  
ExecStart=/home/s3e/www/cacti.s3e.ru/cactid.php

Потом сделать:

mkdir /etc/sysconfig  
touch /etc/sysconfig/cactid  
cp -p /home/s3e/www/cacti.s3e.ru/service/cactid.service /etc/systemd/system  
systemctl enable cactid  
systemctl start cactid  
systemctl status cactid

Файл модулей systemd делает управление Cacti немного более удобным.

Настройка пулера и графиков

В настройках, на вкладке Регистратор надо переключить Poller Type на spine.

Если на графиках появилась ошибка, что нет файла в директории rra

chown www-data:www-data rra/

Далее надо немного подождать и графики появятся.