Windows Server に Cacti をインストールする

Windows Server に Cacti をインストールする手順を紹介します。

インストール手順

IISのインストール

IISをインストールします。インストール手順はこちらの記事を参照してください。

Active Perlのインストール

Active Perlをインストールします。インストール手順はこちらの記事を参照してください。

PHPのインストール

PHPをインストールします。(2017年時点では)バージョンは5系のものを利用します。最新のVersion Release 1.2.2xを利用する場合は、PHP 7をインストールします。
インストール手順はこちらの記事を参照してください。
補足:Visual Studio 2015 の Visual C++ 再頒布可能パッケージ のインストール
必要に応じて、「Visual Studio 2015 の Visual C++ 再頒布可能パッケージ」をインストールします。
補足:x64 x86どちらをインストールするか
PHP,net-snmp は32ビット(x86), 64ビット(x64) どちらでも動作しますが、PHP5系は64ビットが実験用途になっていることや、RRDTool は32ビット版のバイナリのため、PHP, net-snmp も32ビット版をインストールするほうが良いかもしれません。

MariaDB のインストール

MariaDBをインストールします。インストール手順はこちらの記事を参照してください。

RRDTool のインストール

RRDtoolをインストールします。インストール手順はこちらの記事を参照してください。

net-snmp のインストール

net-snmpをインストールします。インストール手順はこちらの記事を参照して下さい。

Cactiのダウンロードとインストール

CactiのWebサイト(https://www.cacti.net/)にアクセスします。左側のメニューの[Downloads]セクションの[Cacti]リンクをクリックします。


ダウンロードページが表示されます。[Windows in ZIP format]のリンクをクリックすると、Windows版のCactiをダウンロードできます。


Windows版のCactiをダウンロードできました。


ZIPファイルを展開します。


展開したファイルを"C:\inetpub\wwwroot\cacti" ディレクトリに配置します。

Spineのダウンロードとインストール

Spineをダウンロードしてインストールします。手順の詳細はこちらの記事を確認してください。

各種設定

IISのデフォルトドキュメントの設定

PHPのファイル名(index.php)をデフォルトドキュメントに設定します。設定手順の詳細はこちらの記事を参照してください。

PHP snmpモジュールの有効化

こちらの記事の手順を参照して、PHPのsnmpモジュールを有効化します。

php.ini の設定

php.iniファイルを編集して、モジュール等を読み込む設定にします。php.iniファイルが存在しない場合は、php.exe ファイルがあるディレクトリと同じ位置にphp.iniファイルを作成して配置します。

バージョン1.2以降はgettextを有効にする必要があります。
php.ini 変更後(Cacti version 1.2 以降)
[PHP]
extension_dir = "ext"

extension=php_pdo_mysql.dll
extension=php_com_dotnet.dll
extension=php_sockets.dll
extension=php_ldap.dll
extension=php_mbstring.dll
extension=php_openssl.dll
extension=php_gd2.dll
extension=php_snmp.dll
extension=php_gmp.dll
extension=php_gettext.dll

max_execution_time = 60

file_uploads = On
;fastcgi.impersonate = 1
cgi.fix_pathinfo = 1
cgi.force_redirect = 0

;session.save_path = c:\php\Session
error_log = C:\inetpub\wwwroot\log\php_errors.txt
;opcache.enable = On
;opcache.cli_enable = On

memory_limit=1000M

[Date]
date.timezone = "Asia/Tokyo"
php.ini 変更後(Cacti version 1.1 以前)
[PHP]
extension_dir = "ext"

extension=php_pdo_mysql.dll
extension=php_com_dotnet.dll
extension=php_sockets.dll
extension=php_ldap.dll
extension=php_mbstring.dll
extension=php_openssl.dll
extension=php_gd2.dll
extension=php_snmp.dll
extension=php_gmp.dll

max_execution_time = 30

file_uploads = On
cgi.fix_pathinfo = 1
cgi.force_redirect = 0
error_log = C:\inetpub\wwwroot\log\php_errors.txt

[Date]
date.timezone = "Asia/Tokyo"

MariaDB(MySQL) タイムゾーンの設定

MariaDBのタイムゾーンの設定をします。手順の詳細はこちらの記事を確認してください。

MySQLのサイトからタイムゾーンのファイルをダウンロードします。ダウンロード後、MySQLのコマンドプロンプトから、
  mysql --user=root --password mysql < c:\timezone_posix.sql
コマンドを実行します。
続いてSQLのプロンプトから
  show variables like '%time_zone%';
コマンドを実行します。下記の結果が返ります。
+------------------+---------------+
| Variable_name    | Value         |
+------------------+---------------+
| system_time_zone | ???? (?W????) |
| time_zone        | Asia/Tokyo    |
+------------------+---------------+
2 rows in set (0.01 sec)
time_zone の値が "Asia/Tokyo" に設定されていればOKです。

my.ini (my.cnf) の設定

my.ini ファイルを変更します。"default-time-zone"を追記し、タイムゾーンの設定をします。また、Cactiに適したデータベースのパラメーターをmy.iniファイルに記述します。デフォルトでは"C:\Proguram Files\MariaDB XX.X\data" ディレクトリにあります。
my.ini 変更前
[mysqld]
datadir=C:/Program Files/MariaDB 10.2/data
port=3306
innodb_buffer_pool_size=255M
character-set-server=utf8
[client]
port=3306
plugin-dir=C:/Program Files/MariaDB 10.2/lib/plugin
my.ini 変更後
[mysqld]
datadir=C:/Program Files/MariaDB 10.2/data
port=3306
default-time-zone='Asia/Tokyo' #データベースのタイムゾーン設定を入れ終わるまで有効化しない (DBが起動できなくなる。)
collation-server=utf8mb4_unicode_ci
character-set-server=utf8mb4
character-set-client=utf8mb4

max_heap_table_size=98M
tmp_table_size=64M
join_buffer_size=64M
innodb_buffer_pool_size=489M
innodb_doublewrite=OFF
innodb_flush_log_at_timeout=3
innodb_read_io_threads=32
innodb_write_io_threads=16
innodb_buffer_pool_instances=5

[client]
port=3306
plugin-dir=C:/Program Files/MariaDB 10.2/lib/plugin

データベースの作成

SQLのコマンドプロンプトで下記のコマンドを実行します。
create database cacti;

補足:操作方法

スタートメニューの[MariaDB]またはMySQLのプログラムメニューの"MySQL Client"をクリックします。


パスワード入力プロンプトが表示されます。インストール時に設定した、Rootのパスワードを入力します。


認証が通ると、SQLの入力プロンプトが表示されます。


"create database cacti;"SQLコマンドを入力します。


[Enter]キーを押してSQLを実行します。Query OK のメッセージが表示されます。

テーブル等の作成

MySQL/MariaDB のコマンドプロンプトで下記のコマンドを実行します。
mysql --user=root --password cacti < C:\Inetpub\wwwroot\cacti\cacti.sql

補足:操作方法

スタートメニューの[MariaDB]またはMySQLのプログラムメニューの"Command Prompt"をクリックします。


MariaDB用のコマンドプロンプトのウィンドウが表示されます。


"mysql --user=root --password cacti < C:\Inetpub\wwwroot\cacti\cacti.sql"コマンドを実行します。

"Enter password:"のパスワード入力プロンプトが表示されます。MariaDBのrootのパスワードを入力します。


処理には若干の時間がかかります。処理が完了するとコマンド入力待ちの状態になります。

データベース ユーザーの作成

SQLのコマンドプロンプトで下記のコマンドを実行します。
GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY '(cactiuserのパスワード)';
FLUSH privileges;
(cactiuserのパスワード)の部分に任意のパスワードを設定します。

補足:操作方法

"MySQL Client"を起動し、SQLコマンドプロンプトに、"GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY '(cactiユーザーのパスワード)'"のコマンドを入力します。


SQLを実行します。正常に実行できると"Query OK" のメッセージが表示されます。


"FLUSH privileges;" のコマンドを続けて実行します。


データベースユーザーの権限設定

作成した cactiuser のアカウントが TimeZoneテーブルにアクセスできるよう下記のコマンドを実行します。
  grant select on mysql.time_zone_name to 'cactiuser'@'localhost' identified by '(cactiuser のパスワード)';

config.php の修正

C:\InetPub\wwwroot\cacti\include\config.php ファイルを修正します。
config.php 変更前
<?php
/*
 +-------------------------------------------------------------------------+
 | Copyright (C) 2004-2017 The Cacti Group                                 |
 |                                                                         |
 | This program is free software; you can redistribute it and/or           |
 | modify it under the terms of the GNU General Public License             |
 | as published by the Free Software Foundation; either version 2          |
 | of the License, or (at your option) any later version.                  |
 |                                                                         |
 | This program is distributed in the hope that it will be useful,         |
 | but WITHOUT ANY WARRANTY; without even the implied warranty of          |
 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           |
 | GNU General Public License for more details.                            |
 +-------------------------------------------------------------------------+
 | Cacti: The Complete RRDTool-based Graphing Solution                     |
 +-------------------------------------------------------------------------+
 | This code is designed, written, and maintained by the Cacti Group. See  |
 | about.php and/or the AUTHORS file for specific developer information.   |
 +-------------------------------------------------------------------------+
 | http://www.cacti.net/                                                   |
 +-------------------------------------------------------------------------+
*/

/* make sure these values reflect your actual database/host/user/password */

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

/* when the cacti server is a remote poller, then these entries point to
 * the main cacti server.  otherwise, these variables have no use. 
 * and must remain commented out. */

#$rdatabase_type     = 'mysql';
#$rdatabase_default  = 'cacti';
#$rdatabase_hostname = 'localhost';
#$rdatabase_username = 'cactiuser';
#$rdatabase_password = 'cactiuser';
#$rdatabase_port     = '3306';
#$rdatabase_ssl      = false;

/* the poller_id of this system.  set to '1' for the main cacti
 * web server.  otherwise, you this value should be the poller_id
 * for the remote poller. */

$poller_id = 1;

/* set the $url_path to point to the default URL of your cacti 
 * install ex: if your cacti install as at 
 * http://serverip/cacti/ this would be set to /cacti/.
*/

$url_path = '/cacti/';

/* default session name - session name must contain alpha characters */

$cacti_session_name = 'Cacti';

/* save sessions to a database for load balancing */

$cacti_db_session = false;

/* optional parameters to define scripts and resource paths.  these
 * variables become important when using remote poller installs
 * when the scripts and resource files are not in the main cacti
 * web server path. */

//$scripts_path = '/var/www/html/cacti/scripts';
//$resource_path = '/var/www/html/cacti/resource/';

今回変更する場所は "$database_password"のパスワード部分を変更します。
$database_password = '(データベースユーザー作成時に設定したパスワードを指定する)';

ログファイルの設置

C:/inetpub/wwwroot/cacti/log/cacti.log
に空のログファイルを作成します。

ディレクトリのアクセス権の設定

ディレクトリのアクセス権を設定します。wwwroot(c:\Inetpub\wwwroot)に設置したcactiのディレクトリの"resource"ディレクトリをクリックして選択します。


右クリックしてポップアップメニューを表示します。メニューの[プロパティ]をクリックします。


ディレクトリのプロパティダイアログが表示されます。


[セキュリティ]のタブをクリックします。下図の画面が表示されます。[編集]ボタンをクリックします。アクセス許可ダイアログが表示されます。


上部の[グループまたはユーザー名]のリストボックスから"IIS_IUSRS"のユーザーをクリックして選択します。下部の[アクセス許可]の項目で[フル コントロール]または、[変更]にチェックを入れます。


同様の手順でアクセス権を変更し
  • c:\Inetpub\wwwroot\cacti\resource
  • c:\Inetpub\wwwroot\cacti\scripts
  • c:\Inetpub\wwwroot\cacti\log
  • c:\Inetpub\wwwroot\cacti\rra
  • c:\Inetpub\wwwroot\cacti\plugins
のディレクトリに対して書き込み権限を追加します。

Cactiのセットアップ

WebブラウザでCactiのディレクトリ(http://(ホスト名)/cacti/)にアクセスします。下図の[License Agreement]の画面が表示されます。


画面下部の[Accept GPL License Agreement]のチェックボックスにチェックをします。チェック後、画面の下部の[Next]ボタンをクリックします。


[Pre-Installation Checks]画面が表示されます。設定が正しくできていれば、下図の画面が表示され、次の画面に進めます。画面の最下部の[Next]ボタンをクリックします。


タイムゾーンの設定ができていない場合、下図のエラーが表示され、次に進むことはできません。
MySQL TimeZone Support

ERROR: Your Cacti database login account does not have access to the MySQL TimeZone database. Please provide the Cacti database account "select" access to the "time_zone_name" table in the "mysql" database, and populate MySQL's TimeZone information before proceeding.




[Installation Type]の画面が表示されます。


コンボボックスには"New Primary Server" と "New Remote Poller" の選択肢があります。今回は最初のサーバーですので、"New Primary Server" を選択します。選択後[次に]のボタンをクリックします。


[Critical Binary Locations and Versions]の画面が表示されます。必要なバイナリがインストールされていればグリーンのチェックのマークが表示されます。赤のアイコンが表示されている場合は、インストールされているかの確認、またはインストールパスを設定します。設定後[Next]ボタンをクリックします。


[Directory Permission Checks]の画面が表示されます。書き込み権限が付与されているかのチェックが実行されます。書き込み権限がついていない場合は、ディレクトリのアクセス権を変更します。設定後[Next]ボタンをクリックします。


[Template Setup]の画面が表示されます。


インストールするテンプレートにチェックをつけます。チェック後[Finish]ボタンをクリックします。

補足

Windows版のCactiの場合、PHPの実行時間タイムアウト("Fatal error: Maximum execution time of 50 seconds exceeded.")や、500エラーが発生する可能性があります。その場合は、インストールするテンプレートにチェックをせず、設定完了後にテンプレートをインストールします。

設定が完了すると、下図のログイン画面が表示されます。初期ID"Admin" 初期パスワード"Admin" を入力してログインボタンをクリックします。


[Change Password]のダイアログが表示されます。新しいパスワードを設定します。


変更後、下図のCactiの画面が表示されます。

補足:グラフが表示されない場合

グラフを表示した場合に、グラフが表示されない場合の対処法です。

グラフの画像は表示されるが rrdファイルにアクセスできない

グラフの表示時に画像が表示され Error: opening '(rrd ファイルのパス)': Bad file descriptor のメッセージが表示される場合は、RRDToolは実行できていますが、 rrdファイルが開けないことが原因です。



[ディレクトリのアクセス権の設定]を参照してc:\Inetpub\wwwroot\cacti\rra のフォルダにアクセス権を追加します。

グラフの画像が表示されない

グラフの画像が表示されない場合は、RRDToolが実行できない可能性が高いです。
グラフの設定画面を表示します。画面右上の[Turn On Graph Debug Mode]のリンクをクリックします。~

[Turn On Graph Debug Mode]のリンクをクリックするとデバッグモードになり、画面にグラフの画像を生成するためのRRDToolのコマンドが表示されます。
コマンドのパスにRRDToolのファイルが配置されているか確認します。また、表示されたコマンドを実行し、エラーが発生しないことを確認します。

Pollerの定期実行

Pollerを定期実行するための設定をします。

タスクスケジューラーでの設定

タスクスケジューラーを利用して、5分ごとに
c:\php\php.exe C:\inetpub\wwwroot\cacti\poller.php
のコマンドを実行します。一見問題なさそうですが、この方法ではタスクが停止し、うまく実行できない場合がありました。

タスクスケジューラー+プログラムでの設定

1分間隔でPollerを実行する下記のプログラムを作成します。

コード

C#でコンソールアプリケーションを作成し、下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;


namespace CactiPollerExec
{
  class Program
  {
    static void Main(string[] args)
    {
      while (true) {
        FileStream fs = new FileStream("log.txt", FileMode.Append);
        StreamWriter sw = new StreamWriter(fs);
        try {
          string dt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
          sw.WriteLine("{0} - Exec Cacti Poller", dt);
          Process.Start("c:\\php\\php.exe", @"C:\inetpub\wwwroot\cacti\poller.php");
          sw.Flush();
        }
        finally {
          sw.Close();
          fs.Close();
        }
        System.Threading.Thread.Sleep(1000 * 60);
      }
    }
  }
}

上記のプログラムをタスクスケジューラーでWindowsの開始時に実行する設定にします。


以上でインストールは完了です。

著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
掲載日: 2017-07-23
改訂日: 2021-04-27
iPentec all rights reserverd.