work.log

エンジニアの備忘録的ブログ

Rocky Linux 9にNagiosとNagiosgraphをインストールするメモ

投稿:2023-01-08 00:24  更新:

Rocky Linux 9に監視ツールのNagiosをインストールするメモ書きです。

監視ツールはZabbixやCacti辺りが有名かと思いますが、GUIじゃなく設定ファイルで手軽に監視したい場合は、Nagiosの方が個人的に使いやすくて好みです。

NagiosはDockerを使ってもいいですが、公開されているイメージだとグラフツールのNagiosgraphがエラーを吐いてちゃんと動かない🤔

という事で、久しぶりにソースからNagiosを構築する事にしました。監視サーバは一度作ったら滅多に作り直す事は無いですが、今回ハマったポイントが多かったのでちゃんと残しておこうと思います。

スポンサーリンク

利用したOS・ソフトウェアのバージョン

今回は下記環境でNagiosサーバを構築しています。

  • Rocky Linux 9.1
  • Nninx 1.22.1
  • PHP 8.1.14
  • fcgiwrap 1.1.0-18
  • Nagios 4.4.9
  • nagios-plugins 2.4.2
  • NRPE 4.1.0

Nagiosは本体の他に最低限プラグインが必要です。NRPEは監視エージェントでリモートサーバを監視したい時に使います。リソースグラフも描画したい場合はNagiosgraphが必要で、これに依存してRRDtoolやPerlモジュール等も必要になってきます。

Nagiosは他に色々とインストールしないといけないのが面倒なので、インストールに関してはZabbixの方が楽です。Zabbixは高機能なだけあって使い方を覚えるまでの学習コストが気になる所ですが、インフラ専業だったり大規模ネットワークの監視をしたい場合はZabbixなのかなと思います。

じゃあNagiosはって言うと、20台未満の小規模なネットワークで最低限の監視をしたいなら便利って思っています。

Nagiosのインストール

Nagiosはソースからインストールするので、以降は全てroot権限で操作します。

まずは専用のnagiosユーザーを作成し、WebのGUI操作に必要な権限をnginxユーザーに付与します。

# groupadd nagios
# useradd -d /usr/local/nagios -s /sbin/nologin -g nagios nagios
# usermod -G nagios nginx

NagiosのバージョンはGithubにある最新のものを基本利用しますが、Nagios関連のファイルはバグでインストールがつまずく場合もあるので、その時はバージョンを変えて試すと良いです。

本体のリリース一覧はこちらです → Github Nagios

# wget https://github.com/NagiosEnterprises/nagioscore/releases/download/nagios-4.4.9/nagios-4.4.9.tar.gz
# tar xfz nagios-4.4.9.tar.gz ; cd nagios-4.4.9

configureのオプションはこのように。

# ./configure \
--with-nagios-user=nagios \
--with-nagios-group=nagios \
--with-command-user=nagios \
--with-command-group=nagios

*** Configuration summary for nagios 4.4.9 2022-11-16 ***:

 General Options:
 -------------------------
        Nagios executable:  nagios
        Nagios user/group:  nagios,nagios
       Command user/group:  nagios,nagios
             Event Broker:  yes
        Install ${prefix}:  /usr/local/nagios
    Install ${includedir}:  /usr/local/nagios/include/nagios
                Lock file:  /run/nagios.lock
   Check result directory:  /usr/local/nagios/var/spool/checkresults
           Init directory:  /lib/systemd/system
  Apache conf.d directory:  /etc/httpd/conf.d
             Mail program:  /usr/bin/mail
                  Host OS:  linux-gnu
          IOBroker Method:  epoll

 Web Interface Options:
 ------------------------
                 HTML URL:  http://localhost/nagios/
                  CGI URL:  http://localhost/nagios/cgi-bin/
 Traceroute (used by WAP):  


Review the options above for accuracy.  If they look okay,
type 'make all' to compile the main program and CGIs.

終わったらmakeです。

# make all

*** Compile finished ***

If the main program and CGIs compiled without any errors, you
can continue with testing or installing Nagios as follows (type
'make' without any arguments for a list of all possible options):

  make test
     - This runs the test suite

  make install
     - This installs the main program, CGIs, and HTML files

  make install-init
     - This installs the init script in /lib/systemd/system

  make install-daemoninit
     - This will initialize the init script
       in /lib/systemd/system

  make install-groups-users
     - This adds the users and groups if they do not exist

  make install-commandmode
     - This installs and configures permissions on the
       directory for holding the external command file

  make install-config
     - This installs *SAMPLE* config files in /usr/local/nagios/etc
       You'll have to modify these sample files before you can
       use Nagios.  Read the HTML documentation for more info
       on doing this.  Pay particular attention to the docs on
       object configuration files, as they determine what/how
       things get monitored!

  make install-webconf
     - This installs the Apache config file for the Nagios
       web interface

  make install-exfoliation
     - This installs the Exfoliation theme for the Nagios
       web interface

  make install-classicui
     - This installs the classic theme for the Nagios
       web interface

~ 省略 ~

Enjoy.

コンパイルが正常に終わると、インストールオプションが色々と表示されるので終わるまでメモしておきます。

必要なものをインストールしていきますが、今回は「本体、起動スクリプト、設定ファイル」をインストールします。commandmodeと言うのはNagiosのWeb GUIから操作するのに必要なオプションだったはず…

# make install
# make install-init
# make install-commandmode
# make install-config
# cd ..

起動スクリプト以外のファイルは “/usr/local/nagios” 以下に配置されます。

これで本体のインストールは完了です。

Nagiosプラグインのインストール

続いてNagiosプラグインをインストールします。

ソースはこちらで公開されています → Github Nagios Plugin

インストールの前に一部のプラグインで必要なものをdnfで入れておきます。

# dnf -y install net-snmp net-snmp-utils net-snmp-devel openssl-devel

終わったらソースをダウンロードしてプラグインをインストールします。

# wget https://github.com/nagios-plugins/nagios-plugins/releases/download/release-2.4.2/nagios-plugins-2.4.2.tar.gz
# tar xfz nagios-plugins-2.4.2.tar.gz ; cd nagios-plugins-2.4.2
# ./configure --with-nagios-user=nagios --with-nagios-group=nagios
# make all
# make install
# cd ..

makeまで終わるとpluginsというディレクトリ内に “check_XXX” という各種プラグインのファイルが出来ているので、インストール前に監視に利用したいプラグインが使える状態になっているかを確認しておくと良いでしょう。

最初にインストールしたSNMP関連はcheck_snmpというプラグインを使うのに必要で、これがないとインストールされません。SNMPは必須では無いものの、ネットワークトラフィックの計測に便利なのであった方が良いと思います。

Nagiosプラグインは “/usr/local/nagios/libexec” 以下に配置されます。

NRPE (check_nrpe) のインストール

Nagiosの監視エージェントにNRPEを使うので、Nagiosサーバに専用のプラグイン (check_nrpe) をインストールします。

NRPEもGithubから最新バージョンを取ってきてインストールします → Github NRPE

configureはこのようにしてmakeします。

# wget https://github.com/NagiosEnterprises/nrpe/releases/download/nrpe-4.1.0/nrpe-4.1.0.tar.gz
# tar xfz nrpe-4.1.0.tar.gz ; cd nrpe-4.1.0
# ./configure --enable-command-args

*** Configuration summary for nrpe 4.1.0 2022-07-18 ***:

 General Options:
 -------------------------
 NRPE port:    5666
 NRPE user:    nagios
 NRPE group:   nagios
 Nagios user:  nagios
 Nagios group: nagios

~ 省略 ~

# make all

終わったらcheck_nrpeのみをインストールします。

# make install-plugin

ファイルは “/usr/local/nagios/libexec/check_nrpe” に配置されます。

監視対象にNRPEをインストールする場合

Nagiosから監視したい対象サーバにインストールする場合はこのようにします。

# make install
# make install-init
# make install-config

起動スクリプト、本体、プラグイン、設定ファイルがインストールされます。

Nagiosインストール後の調整

ここまで完了したらインストール後の調整をします。

まずはWeb GUIへのアクセスにBasic認証を設定します。今回はIDにnagiosadminと任意のパスワードを設定します。

# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
New password: 
Re-type new password: 
Adding password for user nagiosadmin

次にディレクトリの権限を変更します。

# chmod 755 /usr/local/nagios
# chown -R nagios:nagios /usr/local/nagios

そしてNagiosを起動します。

# systemctl enable nagios
# systemctl start nagios
# systemctl status nagios

statusでactive (running)になっていれば正常に起動出来ています。これでNgiosのインストールは完了です。

Nagiosgraphのインストール

次はグラフツールのNagiosgraphをインストールします。

NagiosのグラフツールはNagiosgraph以外にもありますが、長い事メンテナンスがされておらず今の環境だと動かないものもあるので、現状はNagiosgraph位しか選択肢が無いかもしれません…

という事で、Nagiosgraphをセットアップしていきますが、まずは依存ファイルをdnfで入れます。

# dnf -y install perl-rrdtool perl-GD perl-CGI perl-English

NagiosgraphのソースはGitコマンドでコピーします。

# git clone https://github.com/JasonRivers/nagiosgraph.git
# cd nagiosgraph

インストールスクリプトを実行して対話式で設定していきます。

基本はエンターを押して進めて行きますが、Nagiosのパスが正しく検出されない場合は手動で調整していきます。

# perl install.pl --prefix=/usr/local/nagiosgraph

Destination directory (prefix)? [/usr/local/nagiosgraph]
Location of configuration files (etc-dir)? [/usr/local/nagiosgraph/etc]
Location of executables? [/usr/local/nagiosgraph/bin]
Location of CGI scripts? [/usr/local/nagiosgraph/cgi]
Location of documentation (doc-dir)? [/usr/local/nagiosgraph/doc]
Location of examples? [/usr/local/nagiosgraph/examples]
Location of CSS and JavaScript files? [/usr/local/nagiosgraph/share]
Location of utilities? [/usr/local/nagiosgraph/util]
Location of state files (var-dir)? [/usr/local/nagiosgraph/var]
Location of RRD files? [/usr/local/nagiosgraph/var/rrd]
Location of log files (log-dir)? [/usr/local/nagiosgraph/var/log]
Path of log file? [/usr/local/nagiosgraph/var/log/nagiosgraph.log]
Path of CGI log file? [/usr/local/nagiosgraph/var/log/nagiosgraph-cgi.log]
Base URL? [/nagiosgraph]
URL of CGI scripts? [/nagiosgraph/cgi-bin]
URL of CSS file? [/nagiosgraph/nagiosgraph.css]
URL of JavaScript file? [/nagiosgraph/nagiosgraph.js]
URL of Nagios CGI scripts? [/nagios/cgi-bin]
Path of Nagios performance data file? [/tmp/perfdata.log] /usr/local/nagios/var/perfdata.log <= 調整
username or userid of Nagios user? [nagios]
username or userid of web server user? [www] nginx <= 調整
Modify the Nagios configuration? [n] y <= yで応答
Path of Nagios configuration file? [/usr/local/nagios/etc/nagios.cfg]
Path of Nagios commands file? [/usr/local/nagios/etc/objects/commands.cfg]
Modify the Apache configuration? [n]

configuration:
  ng_prefix            /usr/local/nagiosgraph
  ng_etc_dir           /usr/local/nagiosgraph/etc
  ng_bin_dir           /usr/local/nagiosgraph/bin
  ng_cgi_dir           /usr/local/nagiosgraph/cgi
  ng_doc_dir           /usr/local/nagiosgraph/doc
  ng_examples_dir      /usr/local/nagiosgraph/examples
  ng_www_dir           /usr/local/nagiosgraph/share
  ng_util_dir          /usr/local/nagiosgraph/util
  ng_var_dir           /usr/local/nagiosgraph/var
  ng_rrd_dir           /usr/local/nagiosgraph/var/rrd
  ng_log_dir           /usr/local/nagiosgraph/var/log
  ng_log_file          /usr/local/nagiosgraph/var/log/nagiosgraph.log
  ng_cgilog_file       /usr/local/nagiosgraph/var/log/nagiosgraph-cgi.log
  ng_url               /nagiosgraph
  ng_cgi_url           /nagiosgraph/cgi-bin
  ng_css_url           /nagiosgraph/nagiosgraph.css
  ng_js_url            /nagiosgraph/nagiosgraph.js
  nagios_cgi_url       /nagios/cgi-bin
  nagios_perfdata_file /usr/local/nagios/var/perfdata.log
  nagios_user          nagios
  www_user             nginx
  modify_nagios_config y
  nagios_config_file   /usr/local/nagios/etc/nagios.cfg
  nagios_commands_file /usr/local/nagios/etc/objects/commands.cfg
  modify_apache_config n
  apache_config_dir    
  apache_config_file   
Continue with this configuration? [y] <= エンターを押してインストール

ファイルは “/usr/local/nagiosgraph” 以下に配置されます。

nagiosgraphのディレクトリも権限を調整します。

# chown -R nagios:nagios /usr/local/nagiosgraph
# chmod 664 /usr/local/nagiosgraph/var/log/nagiosgraph-cgi.log

NagiosでNagiosgraphのリンクを表示する設定

上記のようにインストールすると、Nagiosgraphの設定がNagiosに自動で追加されますが、NagiosのGUIからグラフを確認出来た方が楽なのでNagiosgraphのリンクを追加する設定を行います。

まずはNagiosのテンプレートファイルに下記を追加します。

# vi /usr/local/nagios/etc/objects/templates.cfg

----- 追加 -----
define service {
	name		graphed-service
	action_url	/nagiosgraph/cgi-bin/show.cgi?host=$HOSTNAME$&service=$SERVICEDESC$' onMouseOver='showGraphPopup(this)' onMouseOut='hideGraphPopup()' rel='/nagiosgraph/cgi-bin/showgraph.cgi?host=$HOSTNAME$&service=$SERVICEDESC$&period=week&rrdopts=-w+450+-j
	register	0
}

次に、Nagiosgraphのリンクを追加したい箇所にこのように設定します。

# vi /usr/local/nagios/etc/objects/localhost.cfg

----------
define service {
	use						local-service,graphed-service ; <= graphed-serviceを追加
	host_name				localhost
	service_description		PING
	check_command			check_ping!100.0,20%!500.0,60%
}

グラフはNagiosプラグインの応答結果が対応しているかどうかで表示可能かどうか決まります。

ここでは細かく書きませんが、OK, Warning, Critical, Unknownという最低限の応答しか返さないプラグインだとグラフは表示されません。

Nagiosgrapの反映

設定が終わったらNagiosを再起動してNagiosgrapの設定を反映させます。

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
~ 省略 ~
Total Warnings: 0 <= Warnings, Errorsが出ない事を確認
Total Errors:   0

# systemctl restart nagios

NginxでNagiosを表示させる

次はNginxでNagiosを動かす設定をしていきます。

Nagiosの公式が提供するWeb用の設定ファイルはApache用だけなのですが、Apacheもmod_phpが無くなってからはお手軽さが無くなった気がするので、Nginxだけで動かす用に設定ファイルを作っていきます。

Nginxはphp-fpmとCGI用にfcgiwrapが必要なので適時構築します。Nginx + php-fpmはこんな風にいつもインストールしています。

NginxでWordPressを使う時の設定をまとめてみた

fcgiwrapはこのようにインストールしました。

fcgiwrapのインストール

まずはdnfでインストールします。

# dnf -y install fcgiwrap

完了したらfcgiwrap.servicefcgiwrap.socketというファイルを作ります。

# vi /etc/systemd/system/fcgiwrap.service
-----
[Unit]
Description=Simple CGI Server
After=nss-user-lookup.target
Requires=fcgiwrap.socket

[Service]
EnvironmentFile=/etc/sysconfig/fcgiwrap
ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS}
User=nginx
Group=nginx

[Install]
Also=fcgiwrap.socket
# vi /etc/systemd/system/fcgiwrap.socket
-----
[Unit]
Description=fcgiwrap Socket

[Socket]
ListenStream=/run/fcgiwrap.sock
SocketUser=nginx
SocketMode=0660

[Install]
WantedBy=sockets.target

終わったらfcgiwrapを起動します。

# systemctl enable fcgiwrap
# systemctl start fcgiwrap
# systemctl status fcgiwrap

Nginxの設定

Nginxの設定はこんな感じにしてみました。

SSLは必須だと思うので無料のLet’s Encryptで取得しておきます。

# vi /etc/nginx/conf.d/nagios.conf
-----
server {
	listen      80;
	server_name nagios.example.com;
	return 301 https://$host$request_uri;
}

server {
	listen      443 ssl http2;
	server_name nagios.example.com;
	root        /usr/local/nagios/share;
	index       index.php index.html;

	access_log  /var/log/nginx-nagios-access.log combined;
	error_log   /var/log/nginx-nagios-error.log warn;

	ssl_certificate     /etc/letsencrypt/live/nagios.example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/nagios.example.com/privkey.pem;

	# Let’s Encrypt の更新用
	location ^~ /.well-known/acme-challenge/ {
		root /home/www/htdocs;
	}

	location = /.well-known/acme-challenge/ {
		return 404;
	}

	location / {

		auth_basic "Nagios Access";
		auth_basic_user_file /usr/local/nagios/etc/htpasswd.users;

		location /nagios {
			alias /usr/local/nagios/share;
		}

		location /nagiosgraph {
			alias /usr/local/nagiosgraph/share;
		}

		location ~ \.php$ {
			try_files     $uri = 404;
			fastcgi_index index.php;
			fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
			fastcgi_param AUTH_USER $remote_user;
			fastcgi_param REMOTE_USER $remote_user;
			include       fastcgi_params;
		}

		location /nagios/cgi-bin {
			set $cgi_root /usr/local/nagios/sbin;
			rewrite ^/nagios/cgi-bin/(.*)\.cgi /cgi-bin/$1.cgi last;
		}

		location /nagiosgraph/cgi-bin {
			set $cgi_root /usr/local/nagiosgraph/cgi;
			rewrite ^/nagiosgraph/cgi-bin/(.*)\.cgi /cgi-bin/$1.cgi last;
		}

		location /cgi-bin {
			internal;
			root          $cgi_root;
			rewrite       ^/cgi-bin/(.*) /$1 break;
			fastcgi_pass  unix:/var/run/fcgiwrap.sock;
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
			fastcgi_param AUTH_USER $remote_user;
			fastcgi_param REMOTE_USER $remote_user;
			include       fastcgi_params;
		}
	}
}

あとはこの nagios.conf をNginx本体のに読み込ませて適用します。

設定したURLにアクセスして下記のような画面が表示されたら完了です。

Rocky Linux 9にNagiosとNagiosgraphをインストールする

Nagiosgrapはこの位置から確認出来ます。

NagiosのPHP Warningを修正

動作には影響が無いですが、NagiosのトップページにアクセスするとこのようなPHP Warningがログに出るので一応修正しておきます。

エラーログ
2023/01/08 11:25:07 [error] 3250626#0: *15394 FastCGI sent in stderr: “PHP message: PHP Warning: Trying to access array offset on value of type bool in /usr/local/nagios/share/includes/utils.inc.php on line 217” while reading response…
2023/01/08 11:25:07 [error] 3250626#0: *15394 FastCGI sent in stderr: “PHP message: PHP Warning: Trying to access array offset on value of type bool in /usr/local/nagios/share/includes/utils.inc.php on line 217” while reading response…
2023/01/08 11:25:07 [error] 3250626#0: *15394 FastCGI sent in stderr: “PHP message: PHP Warning: Trying to access array offset on value of type bool in /usr/local/nagios/share/includes/utils.inc.php on line 154” while reading upstream,…

該当ファイルを開き、154と214行目を修正します。

# vi /usr/local/nagios/share/includes/utils.inc.php
----- 154, 214行目 -----
if(($fh=@fopen($fname,'r'))!=FALSE){
        // read all lines in the config file
        while(!feof($fh)){
                $s=fgets($fh);

                /* 追加 */
                // 対策: PHP Warning:  Trying to access array offset on value of type bool
                if (is_array($s) == false)
                       continue;
                /* ここまで */

                // skip comments
                if($s[0]=='#')
                        continue;

bool型の値を配列として参照しようとしているのが原因なので、配列じゃない場合に処理をスキップするように修正しました。

これでこの警告は表示されなくなります。

Nagiosgrapのエラーを修正

ここではNagiosgrap関連のエラーをまとめています。

修正しなくてもグラフ描画に問題ないかもしれないですが、グラフが表示されなかったりする場合はこの辺を疑ってみましょう。

nagiosgraph-cgi.logの書き込み権限不足によるエラー

上記手順ではこのエラーに対処していますが、配置される nagiosgraph-cgi.log の書き込み権限不足により下記エラーが表示されました。

エラーログ
2023/01/08 10:44:42 [error] 3250626#0: *14772 FastCGI sent in stderr: “Sun Jan 8 10:44:42 2023 show.cgi 3251851 critical Cannot write to ‘/usr/local/nagiosgraph/var/log/nagiosgraph-cgi.log’, using STDERR instead
CGI::param called in list context from /usr/local/nagiosgraph/etc/ngshared.pm line 234, this can lead to vulnerabilities. See the warning in “Fetching the value or values of a single named parameter” at /usr/share/perl5/vendor_perl/CGI.pm line 414.

このログはNginxユーザーから書き込めるようにする必要があるので、このようにして対処します。

# chmod 664 /usr/local/nagiosgraph/var/log/nagiosgraph-cgi.log

nagiosgraph_ja.confのエラー

翻訳ファイル nagiosgraph_ja.conf が見つからないというエラーも出ました。

エラーログ
Sat Jan 7 13:35:06 2023 show.cgi 95550 warn No translations for ‘ja’ (/usr/local/nagiosgraph/etc/nagiosgraph_ja.conf)

そもそも日本語対応のファイルは公式では用意されていないので自分で頑張って作るか、そうでなければ翻訳ファイルを探す処理をしないようにPerlモジュールを修正して対処します。

ngshared.pmの234行目付近をこのように修正します。

# vi /usr/local/nagiosgraph/etc/ngshared.pm
----- 234行目 -----
#$errmsg = readi18nfile($cgi->param('language'));
$errmsg = readi18nfile(0);
if ($errmsg ne q()) {
    debug(DBWRN, $errmsg);
}

language (ja) が指定されかつファイルが無いとこのエラーが出ますが、languageの値を渡さないとデフォルトの en が使われエラーが出なくなるっぽいです。

CGI::paramのエラーを消す

CGI::param() 絡みのエラーが出るのでこれを消すようにします。

エラーログ
2023/01/08 11:17:01 [error] 3250626#0: *15363 FastCGI sent in stderr: “CGI::param called in list context from /usr/local/nagiosgraph/etc/ngshared.pm line 385, this can lead to vulnerabilities. See the warning in “Fetching the value or values of a single named parameter” at /usr/share/perl5/vendor_perl/CGI.pm line 414″ while reading upstream,…

消すというか警告を無視するだけですが、脆弱性に繋がる使い方をしているため出ているエラーなので、本当なら修正するのが好ましいです。しかし、NagiosはBasic認証下で限られた人しか見ないから、手っ取り早く警告を無視する事にしました。

ngshared.pmの47行目付近に下記1行を追加します。

# vi /usr/local/nagiosgraph/etc/ngshared.pm
----- 47行目 -----
## 追加
$CGI::LIST_CONTEXT_WARN = 0;

$VERSION = '1.5.2';
$CFGNAME = 'nagiosgraph.conf';

これでNagiosgrap関連のエラーは出なくなりました。

スポンサーリンク

コメント

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間