Степанов Евгений
QA Engineer
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
- Создаем виртуалхост, с нужным для cacti доменом
- Создаем директорию в которой будет располагаться cacti
- Устанавливаем cerbot для работы с Let’s Encrypt
- Получаем сертификат для нашего домена где будет 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/
Далее надо немного подождать и графики появятся.