cactiのインストール

以前にsnmpのインストールの記事を書きましたが本格的にsnmpを使ってシステム管理をしようとしてcactiのインストールに躓いたのでまとめることにしました。

TVBOX(Amlogic S905x)にarmbian(Armbian_5.91_Aml-s905_Debian_buster_default_5.1.0_20190708.img)をインストールしたものを使っています。 またそのarmbianにlxcでホストを分割して複数台サーバーを起動しています。今回の場合、mysqlとcactiを個別にインストールしています。(すべて一つにまとめるときはデータベースのアドレスをlocalhostとします。またデータベースはIPよりもソケットを使ったほうが速くなります、すなわちlocalhostのほうが速くなります。)

snmpのインストール

apt-get install snmp snmpd snmp-mibs-downloader

インストール時に設定画面がでますがここでは設定を行いません

Web server: None

DConfigure database for cacti with dbconfig-common? : [select No]

snmpの設定ファイルを編集します

/etc/snmp/snmp.conf

# mibs :

/etc/snmp/snmpd.conf

agentAddress udp:161,udp6:[::1]:161
sysDescr HOST NAME  (e.g. A2 hosting VPS)
sysObjectID .1.3.6.1.4.1.4526.100.16.1
group MyROGroup v1 readonly
group MyROGroup v2c readonly
group MyROGroup usm readonly
view all included .1 80
access MyROGroup "" any noauth exact all none none
dontLogTCPWrappersConnects 1
com2sec readonly default public
trapcommunity public
master agentx
agentXTimeout 8
agentXRetries 2

IPv6を使わない場合は次のように置き換えてください。

agentAddress udp:161

テスト

snmpwalk -v 2c -c public ${IP}

cactiのインストール

apt-get -y install rrdtool cacti cacti-spine wget patch unzip zip bash-completion

phpのインストール

apt-get -y install php php-common php-curl php-fpm php-gd php-gettext php-gmp php-imap php-intl php-json php-ldap php-mbstring php-memcache php-mysql php-net-socket php-pear php-php-gettext php-phpseclib php-pspell php-recode php-snmp php-tidy php-twig php-xml php-xmlrpc

設定の編集(php ver7.3の場合)
/etc/php/7.3/fpm/php.ini

file_uploads = On
date.timezone = Asia/Tokyo

/etc/php/7.3/cli/php.ini

date.timezone = Asia/Tokyo

確認用

echo '<?php phpinfo(); ?>' | tee /var/www/html/info.php

Nginxのインストールと設定

apt install nginx-full
ln -s /usr/share/cacti/site /var/www/cacti

/etc/nginx/sites-available/cacti

server {
    listen 80 default_server;
    #root /var/www/html;
    #index index.html;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
        return 301    http://<HOST IP>/cacti$request_uri;
    }
    location /cacti {
        alias /var/www/cacti;
        index index.php;
        #try_files $uri /index.php =404;
        location ~ ^/cacti(/.*\.php)$ {
            fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            include fastcgi_params;
        }
    }
}
ln -s /etc/nginx/sites-available/cacti /etc/nginx/sites-enabled/cacti

データーベースのインストールと設定(ネットワークからアクセス)

apt-get install mariadb-server mariadb-common

Timezoneデータベースを更新します

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Enter password:
Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.

/etc/mysql/mariadb.conf.d/50-server.cnf

[mysqld]
#bind-address = 127.0.0.1
bind-address = 0.0.0.0
max_heap_table_size=128M
tmp_table_size=128M
join_buffer_size=64M
innodb_buffer_pool_size=512M
innodb_doublewrite=OFF
innodb_flush_log_at_timeout=3
innodb_read_io_threads=32
innodb_write_io_threads=16
default-time-zone = 'Asia/Tokyo'
# mysql -u root -p
Welcome to the MariaDB monitor. Commands end with ; or \g.
...

MariaDB [(none)]> create database cactidb;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> grant all privileges on cactidb.* to 'cactiuser'@'<cacti ip="">' identified by '<password>';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye</cacti>

cactiのデータベースファイルを読み込みます

mysql -u cactiuser -h <MYSQL IP> -p cactidb < /usr/share/cacti/conf_templates/cacti.sql
systemctl restart mariadb

テスト

mysql -u cactiuser -h <IP> -p
Enter password:
...
MariaDB [(none)]> show databases;
MariaDB [(none)]> select @@tmp_table_size;
MariaDB [(none)]> show variables like 'join_buffer_size';
MariaDB [(none)]> quit
Bye

/etc/cacti/debian.php

$database_type     = 'mysql';
$database_default  = 'cactidb';
$database_hostname = '<MYSQL HOST IP>';
$database_username = 'cactiuser';
$database_password = '<password>';
$database_port     = '3306';
$database_ssl      = false;
$database_ssl_key  = '';
$database_ssl_cert = '';
$database_ssl_ca   = '';

/etc/cacti/spine.conf

DB_Host <MYSQL HOST IP>
DB_Database cactidb
DB_User cactiuser
DB_Pass <password>
DB_Port 3306

RDB_Host <MYSQL HOST IP>
RDB_Database cactidb
RDB_User cactiuser
RDB_Pass <password>
RDB_Port 3306

ポーラーを5分ごとにセットします

crontab -u www-data -e
*/5 * * * * /usr/bin/php /var/www/cacti/poller.php >> /var/log/cacti/cron.log 2>&1

あるいは、cactiでもログを取っているので省略する場合、

*/5 * * * * /usr/bin/php /var/www/cacti/poller.php > /dev/null 2>&1

タイムゾーンのアクセス権を設定します

mysql -u root -p 
MariaDB [(none)]> show variables like '%time_zone%';
MariaDB [(none)]> grant select on mysql.time_zone_name to 'cactiuser'@'<cacti IP>' identified by '<password for cactiuser>';
MariaDB [(none)]> flush privileges;

サーバのタイムゾーンを変更します

rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

テスト

MariaDB [cactidb]> use cactidb;
MariaDB [cactidb]> select * from poller_output;

パーミッションの変更

cd /usr/share/cacti
chown -R www-data.www-data site
chown -R www-data.www-data resource

サーバを再起動します。

systemctl start php7.3-fpm
systemctl start nginx

ログインします。

username: admin
Password: admin

Screenshot

Ablenet vs. A2 Hosting

Ablenet
A2 Hosting

Ablenet VPSはHDDタイプなのでかなり遅めです。A2 Hostingは負荷かけてもそれほど影響が出ません。抜群の性能です。WPの表示速度がこのLoad Aver.数値そのまま反映されます。

追記1:

phpのバージョンによってメール機能がエラーになることがあります。

$sPattern = '/([\w\s'"+]+[\s]+)?(<)?(([\w-.+]+)@((?:[\w-]+.)+)([a-zA-Z]{2,4}))?(>)?/';

with

$sPattern = '/([\w\s\'\"+]+[\s]+)?(<)?(([\w-.+]+)@((?:[\w-]+.)+)([a-zA-Z]{2,4}))?(>)?/';

it works on Debian/Sid php7.3

追記2:macOSの設定

設定ファイルを編集します。

/etc/snmp/snmpd.conf

変更前:

com2sec local localhost COMMUNITY 
com2sec mynetwork NETWORK/24 COMMUNITY
...
rocommunity public default .1.3.6.1.2.1.1.4
...
#rwcommunity private

変更後:
com2sec local localhost private 
com2sec mynetwork NETWORK/24 public
...
rocommunity public default .1
...
rwcommunity private

サービスを起動します。

launchctl load -w /System/Library/LaunchDaemons/<a rel="noreferrer noopener" target="_blank" href="http://org.net/">org.net</a>-snmp.snmpd.plist

ファイヤーウォールを使う場合、設定をします。

sudo pfctl -e
出力:
pfctl: Use of -f option, could result in flushing of rules
present in the main ruleset added by the system at startup.
See /etc/pf.conf for further details.
No ALTQ support in kernel
ALTQ related functions disabled
bash-3.2# sudo pfctl -e
No ALTQ support in kernel
ALTQ related functions disabled
pf enabled

/etc/pf.conf

追加:
pass in proto udp from ${network}/${prefix} to any port = 161

テスト

pfctl -nf /etc/pf.conf

出力:
pfctl: Use of -f option, could result in flushing of rules
present in the main ruleset added by the system at startup.
See /etc/pf.conf for further details.

有効にします。

pfctl -f /etc/pf.conf