CentOS7でnginx + Muninによるサーバ監視環境を構築した際のメモです。
構築する環境について
今回はCentOS7をminmalでインストールした「munin.server-memo.net」というサーバに「nginx」と「Munin」をインストールして、自分自身を監視する環境を構築することろまでを解説していきます。
事前準備
今回インストールしていく「nginx」および「Munin」は、CentOS7の標準リポジトリには収録されていないため、サードパーティのリポジトリである「epel」を使用します。
ですので「yum」に「epel」リポジトリの追加を行っていない場合は、下記の手順で追加を行ってください。
epelリポジトリ追加方法
「epel」リポジトリは「yum」を使用して追加することができます。
# yum -y install epel-release
epelリポジトリの設定
「epel」リポジトリとOS標準のリポジトリが混合しないように、明示的に指定しない限り「epel」リポジトリを使用しない設定を行います。
# vi /etc/yum.repos.d/epel.repo
設定内容
[epel]部分の「enabled=1」を「enabled=0」に変更します。
リポジトリの追加方法はこちらのページで詳しく説明していますので、よろしければ参考にしてください。
nginxインストール
「epel」リポジトリから「yum」を使って「nginx」のインストールを行っていきます。
# yum --enablerepo=epel install nginx
nginx起動・自動起動設定
「nginx」のインストールが完了しましたら、「nginx」の起動と自動起動の設定を行っておきます。
起動
# systemctl start nginx
自動起動設定
# systemctl enable nginx
「Munin」を公開するための設定は、「Munin」のインストールおよび設定が完了してから実施します。
Muninインストール
「Munin」でサーバ監視を行うために必要なパッケージをインストールしていきます。
# yum --enablerepo=epel install munin munin-nginx spawn-fcgi
Munin用ディレクトリ作成
インストールが完了しましたら、まず「Munin」が生成するグラフ画像やhtml等のデータを格納するディレクトリを作成します。
今回は「nginx」のバーチャルホスト機能を使用して「Munin」を公開していくので、「munin.server-memo.net」用のドキュメントルート「/usr/share/nginx/html/munin」を作成して、その中に「Munin」が生成するデータを格納するディレクトリとして「munin」というディレクトリを作成するという構成にします。
ちょっとわかりづらいかもしれませんが、実際は下記のような感じでディレクトリを作成する形になります。
# mkdir -p /usr/share/nginx/html/munin/munin # chown munin:munin /usr/share/nginx/html/munin/munin
ディレクトリの作成場所については特に決まりはありませんので、「nginx」で公開することを考慮した上でお好きな場所に作成してください。
監視サーバ設定
監視サーバの設定ファイルは「/etc/munin/munin.conf」ですので、バックアップを行ってから編集作業を行っていきます。
# cp -p /etc/munin/munin.conf /etc/munin/munin.conf_yyyymmdd # vi /etc/munin/munin.conf
設定内容
今回は下記の項目について設定を行っていきます。
- 生成データ格納フォルダの変更(htmldir)
- グラフの動的生成(graph_strategy,html_strategy)
生成データ格納フォルダの変更
先ほど「Munin」が生成するデータを格納するためのディレクトリを作成しましたので、そこにデータをその都度生成する方式に設定を行います。
変更前
#htmldir /var/www/html/munin
変更後
htmldir /usr/share/nginx/html/munin/munin
グラフ・htmlの動的生成
初期設定では、グラフ画像やhtmlデータの作成は「cron」に登録されたジョブが実行されるたびに、監視対象として登録されているすべてのサーバ分のデータが生成されていきます。
この場合、監視対象が増えていくとそれに比例して生成されるデータの数が増えていき、その分多くのサーバリソースが必要となり監視サーバの負荷が増えていってしまいます。
そのため、ブラウザから確認する度にグラフ等を動的生成し、必要な分だけのデータを生成させるという方法に設定することで、監視サーバの負荷を減らしていきます。
変更前
graph_strategy cron html_strategy cron
変更後
graph_strategy cgi html_strategy cgi
グラフ・html生成用アプリ起動
グラフとhtmlを動的生成に変更したので、それぞれを生成するためのアプリケーションの起動および自動起動設定を行います。
起動
「munin-fcgi-html」がhtml生成用で「munin-fcgi-graph」がグラフ生成用となります。
# systemctl start munin-fcgi-html # systemctl start munin-fcgi-graph
自動起動設定
# systemctl enable munin-fcgi-html # systemctl enable munin-fcgi-graph
監視サーバ(Munin)の起動方法について
「Munin」がインストールされると、「/etc/cron.d/munin」ファイルが作成されて、「cron」により実行されるジョブとして登録されます。
そのため、特に自動起動の設定を行わなくてもインストール直後から「Munin」の監視サーバは動作を開始します。
「/etc/cron.d/munin」の初期設定では、5分毎に監視対象のサーバにインストールされているエージェント(munin-node)と通信することで、監視対象のデータを収集しグラフなどを生成していきます。
監視エージェント(munin-node)設定
監視サーバの設定が完了しましたので、つぎは監視サーバから監視されるために必要なエージェントである「munin-node」の設定を行っていきます。
# cp -p /etc/munin/munin-node.conf /etc/munin/munin-node.conf_yyyymmdd # vi /etc/munin/munin-node.conf
設定内容
とりあえずホスト名の設定を行うだけで最低限の監視は可能となりますので、まずはそこだけ設定を行い「Munin」で正常に監視できるかどうかの確認を行っていきます。
変更前
host_name localhost.localdomain
変更後
host_name munin.server-memo.net
この状態では初期設定されている項目のみしか監視できませんが、正常に「Munin」で監視が行えることが確認できましたら、その後必要に応じて監視するサーバを追加したり、監視項目(プラグイン)を増やしていきましょう。
munin-node起動・自動起動設定
「munin-node」の設定が完了しましたら、起動と自動起動の設定を行います。
「munin-node」は監視サーバとは異なり「cron」から呼び出されるわけではありませんので、通常のパッケージと同じように「systemctl」を使用して、起動と自動起動の設定を行う必要があります。
起動
# systemctl start munin-node
自動起動
# systemctl enable munin-node
Munin公開用のnginx設定
最後に「Munin」の監視結果を「nginx」で公開させるための設定を行っていきます。
「Munin」公開用の設定ファイルのひな型は、「munin-nginx」をインストールすることで「/etc/nginx/conf.d/munin.conf」として作成されていますので、このファイルを使って設定を行っていきます。
# cp -p /etc/nginx/conf.d/munin.conf /etc/nginx/conf.d/munin.conf_yyyymmdd # vi /etc/nginx/conf.d/munin.conf
「/etc/nginx/conf.d/munin.conf」は、「nginx」のバーチャルホスト設定を使用した想定の設定ファイルとなっていますので、すでに「nginx」をwebサーバとして運用している場合は、必要な部分をコピーするなりして設定を行ってください。
設定内容
最低限の設定項目として下記の2項目を設定していきます。
- バーチャルホストのサーバ名とドキュメントルート設定
- dynazoomのバグ対策
バーチャルホストのサーバ名とドキュメントルート設定
サーバ名を「munin.server-memo.net」に設定し、「Munin」をインストールした際に作成したディレクトリをドキュメントルートとして設定していきます。
変更前
listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; }
変更後
listen 80; server_name munin.server-memo.net; location / { root /usr/share/nginx/html/munin; index index.html index.htm; }
dynazoomのバグ対策
2016.09.20現在、CentOS7環境のepelで提供される「Munin」(バージョン2.0.25)には、グラフを拡大させるズーミング機能にバグがあるらしく、正常にグラフが表示されたりされなかったりしてしまいます。
色々調査をしてみると、グラフをクリックしてズームさせるためのリンクURLが下記の2パターンでランダムに変わってしまうという現象が発生していました。
ズーミング機能が正常に動作する場合のURLパターン
Muninをトップ画面にアクセスするためのURLのすぐ後に「static/dynazoom.html」と続く場合は、ズーミング機能が正常に動作してクリックしたグラフが正常に表示されます。
http://munin.server-memo.net/munin/static/dynazoom.html?cgiurl_graph=/...
正常にグラフの拡大画像が表示されています。
ズーミング機能が動作しない(グラフが表示されない)場合のURLパターン
Muninをトップ画面にアクセスするためのURLのすぐ後に「グループ名/ホスト名/static/dynazoom.html」といったようなURLが続く場合は、ズーミング機能が正常に動作せずにグラフが表示されません。
http://munin.server-memo.net/munin/localhost/localhost/static/dynazoom.html?cgiurl_graph=/...
グラフの拡大画像は表示されていません。
対処方法
原因不明でしばらく途方に暮れていたのですが、Muninのgithubで同じような現象に悩んで相談されている方の情報を見つけることができました。
https://github.com/munin-monitoring/munin/issues/460
内容を確認してみると、原因はバグっぽいようなことが書いてあって、対応としてはnginxのrewrite機能を使って対処すれば良いみたいだったので試してみました。
「group\.name」と「hostname」の部分は、環境にあわせて変更する必要があります。
rewrite ^(.*)/group\.name/hostname.*(/static/.*)$ $1$2;
今回の場合は「http://munin.server-memo.net/munin/localhost/localhost/static/dynazoom.html?cgiurl_graph=/...」の「localhost/localhost」部分が邪魔なので「server_name」の下に、下記の記述を追加します。
rewrite ^(.*)/localhost/localhost.*(/static/.*)$ $1$2;
ちなみに、監視サーバ増えるたびに同様の設定を追加する必要があるので、その場合は「localhost/localhost.*」の部分を適宜変更してください。
/etc/nginx/conf.d/munin.conf
下記が全部の設定を行ったあとの設定ファイルとなります。
server { # Example configuration! Change this to suit your needs. # Access munin at http://localhost/munin/ # NOTE - Do not remove this file, otherwise munin package upgrade # recreates this. listen 80; server_name munin.server-memo.net; rewrite ^(.*)/localhost/localhost.*(/static/.*)$ $1$2; location / { root /usr/share/nginx/html/munin; index index.html index.htm; } # redirect server error pages to the static page /40x.html # error_page 404 /404.html; location = /40x.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ^~ /munin-cgi/munin-cgi-graph/ { access_log off; fastcgi_split_path_info ^(/munin-cgi/munin-cgi-graph)(.*); fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass unix:/var/run/munin/fcgi-graph.sock; include fastcgi_params; } location /munin/static/ { alias /etc/munin/static/; } location /munin/ { fastcgi_split_path_info ^(/munin)(.*); fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass unix:/var/run/munin/fcgi-html.sock; include fastcgi_params; } }
設定反映
設定が完了しましたら、「nginx」をリスタートさせて設定を反映させます。
# systemctl restart nginx
動作確認
全ての設定が完了しましたら、webブラウザでにアクセスして動作確認を行ってください。
今回の環境の場合は「http://munin.server-memo.net/munin/」にアクセスすると、下の図のような「Munin」の監視画面にアクセスすることができます。
「Cateories」から確認したい項目を選択すると、その項目についてのグラフが表示されます。
表示されたグラフをさらにクリックしていくと、「day」「week」「month」「year」といった期間毎のグラフが表示され、さらにクリックしていくとグラフの拡大表示を行うことができます。
無事グラフが表示されることが確認できたら作業は完了となります。
セキュリティについて
インターネット上に「Munin」の監視サーバを構築していて、不特定多数の人からアクセスが可能な場合は、最低でも「nginx」のベーシック認証ぐらいは設定しておきましょう。
「nginx」にベーシック認証を設定する方法はこちらのページにまとめてありますので、よろしければ参考にしてください。
関係のない第3者にサーバの情報を提供するのは、セキュリティ的にあまりよくありませんからね。
また、可能であればSSLによる通信の暗号化や、IPによるアクセス制限を行うとより安心できるでしょう。
/var/run/munin/fcgi-html.sock failed 対応
(2017.05.25追記)「munin」を新規インストールしてみると、上記の手順通りだと下記のエラーが発生してWebブラウザでアクセスすることが出来ませんでした。
2017/05/25 08:00:03 [crit] 2841#2841: *1 connect() to unix:/var/run/munin/fcgi-html.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.1.74, server: test3.server-memo.net, request: "GET /munin/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/munin/fcgi-html.sock:", host: "test.server-memo.net" |
エラー内容が「Permission denied」という事なので、該当ソケットを確認してみると「munin」ユーザが所有者になっていることが確認できました。
# ls -la /var/run/munin/fcgi-html.sock srwxr-xr-x 1 munin munin 0 5月 25 07:55 /var/run/munin/fcgi-html.sock # ls -la /var/run/munin/fcgi-graph.sock srwxr-xr-x 1 munin munin 0 5月 25 07:55 /var/run/munin/fcgi-graph.sock
このソケットは「nginx」ユーザが所有者である必要があるため「Permission denied」が発生したのでしょう。
そこで「munin-fcgi-html」「fcgi-graph」の自動起動用設定ファイルを調査して、どのようにソケットを作成しているのかを確認してみることにします。
設定ファイル
- /usr/lib/systemd/system/munin-fcgi-html.service
- /usr/lib/systemd/system/munin-fcgi-graph.service
それぞれの設定内容を確認すると、ソケットを作成する際に「nginx」ユーザでソケット作成するという設定(-U nginx)が抜けていたのでそれを追加していきます。
munin-fcgi-html.service編集
# cd /usr/lib/systemd/system # cp -p munin-fcgi-html.service munin-fcgi-html.service_yyyymmdd # vi munin-fcgi-html.service
編集前
ExecStart=/usr/bin/spawn-fcgi -s /run/munin/fcgi-html.sock -u munin -g munin /var/www/cgi-bin/munin-cgi-html -P /run/munin/fcgi-html.pid
編集後
-U nginxを追加
ExecStart=/usr/bin/spawn-fcgi -s /run/munin/fcgi-html.sock -U nginx -u munin -g munin /var/www/cgi-bin/munin-cgi-html -P /run/munin/fcgi-html.pid
munin-fcgi-graph.service編集
# cp -p munin-fcgi-graph.service munin-fcgi-graph.service_yyyymmdd # vi munin-fcgi-graph.service
編集前
ExecStart=/usr/bin/spawn-fcgi -s /run/munin/fcgi-graph.sock -u munin -g munin /var/www/cgi-bin/munin-cgi-graph -P /run/munin/fcgi-graph.pid
編集後
-U nginxを追加
ExecStart=/usr/bin/spawn-fcgi -s /run/munin/fcgi-graph.sock -U nginx -u munin -g munin /var/www/cgi-bin/munin-cgi-graph -P /run/munin/fcgi-graph.pid
※以前は「-U nginx」は最初から設定されていたんですが、パッケージ更新の際に変更になったみたいです。パッケージ更新時のバグかな…
設定反映
systemdのUnit設定ファイルを変更したので、daemon-reloadで再読み込みさせます。
# systemctl daemon-reload
ソケット再作成
サービスを再起動させてソケットを再作成させます。
# systemctl restart munin-fcgi-html.service # systemctl restart munin-fcgi-graph.service
ソケットの確認
念のため再作成されたソケットを確認して「nginx」ユーザが所有者であることを確認しておきましょう。
# ls -la /var/run/munin/fcgi-*.sock srwxr-xr-x 1 nginx nginx 0 5月 25 12:23 /var/run/munin/fcgi-graph.sock srwxr-xr-x 1 nginx nginx 0 5月 25 12:22 /var/run/munin/fcgi-html.sock
これでwebブラウザからアクセスが出来るようになっているはずですので、実際にアクセスして動作確認を行ってみたください。