CentOS6.xにMuninをインストールして最低限の設定をする


Zabbixはめんどくさいので、ひとまずMuninで少数のサーバのリソースを監視する方法。

##やりたいこと

とりあえずMuninで以下のことができれば良い。Muninはyumでインストールしたい。

* マシン（OS）の監視
* Apacheの監視
* MySQLの監視
* 何かあればメール送信

##参考

* ほぼ、[ここ](http://knowledge.sakura.ad.jp/beginner/3669/)の内容の通りですが（ありがたい話です）、自分の環境とちょっと違うところもあるので、補足。
* 各種数値の見方は[こちら](https://www.seeds-std.co.jp/seedsblog/488.html)。

##前提

* CentOS6.x(6.8を利用）
* Apache(2.2)インストール済
* MySQL(5.6)インストール済

各サーバ類のインストールは[こちら](http://qiita.com/zaburo/items/4f9f12d7f94e5bcd7ab6)をどうぞ。

##Muninのインストール

Muninをyumでインストールするため、epelリポジトリを追加する。
Muninは

* munin（サーバ）
* munin-node（クライアント）

から構成されます。今回は、サーバ件、クライアントを1台のサーバにインストールし監視します。

###epelの追加

```bash
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

>私はここで/etc/yum.repos.d/epel.repのenabled=1を0とて標準では無効化します。

###Muninのインストール

muninを入れるとmunin-clientもインストールされるようです。epelを有効化してインストールします。

```bash
yum install munin --enablerepo=epel
```

>muninをインストールすると/etc/cron.d/muninが作成され、5分おきに実行されるようになるようです。必要に応じて間隔を調整します。実行されるファイルは/usr/bin/munin-cronです。

###Basic認証の設定

Muninをインストールすると/etc/httpd/conf.d/munin.confが生成され、そこに<Directory /var/www/html/muni>の設定が生成されます(httpd.conf自体は変更されません）。そこで、標準の認証としてBasic認証が設定されており、パスワードファイルとして/etc/munin/munin-htpasswdが指定されていますが、ファイル自体は生成されていないため、生成します。

>/etc/httpd/conf.d/以下のファイルはapache実行時にhttpd.confと合わせて読み込まれます。これは、httpd.confの中でInclude conf.d/*.confとなっているためです。

```bash
htpasswd -c /etc/munin/munin-htpasswd admin
```

設定が完了したら、各サービス再起動（起動）させます。

apacheの再起動。

```bash
service httpd restart
```
munin-nodeの起動。

```bash
service munin-node start
```

munin-nodeの永続化。

```bash
chkconfig munin-node on
```

ここで、http://servername/munin/し、認証を終えると、おなじみの管理画面が登場します。

>最初のcronが走るまでは、空のディレクトリか、Forbiddenが表示されます。少々待ちましょう（また無くてもcronが事項している/usr/bin/munin-cronを直接実行する方法もあります）。

##Apacheの監視

###プラグインの追加

標準的なプラグインは/usr/share/以下にあるので、/etc/munin/plugins/以下にコピーするかシンボリックリンクを張って有効化します。

```bash
ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume
```

その他、より高度なプラグインについては[こちら](http://usedoor.jp/howto/web/server/munin-apache/)等を参考に。

###httpd.confの編集

各種ステータスを取得できるように、/etc/httpd/conf/httpd.confの#ExtendedStatus Onをコメントインします。

```bash
ExtendedStatus On
```

###設定ファイルの追加

server-statusを利用するために/etc/httpd/conf.d/以下にstatus.confを作成し、以下の内容を記述します。

```bash
<IfModule mod_status.c>
    ExtendedStatus On
    <Location /server-status>
        SetHandler server-status
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Location>
</IfModule>
```

###サービスの再起動

準備ができたら関連のサービスを再起動します。

```bash
service httpd restart
service munin-node restart
```

###動作の確認

muninからApacheの情報が取得できているか確認します。各プラグインの動作をmunin-runコマンドで確認します。
この時、Uと表示されると設定がうまくいっていません。うまく行っていると数値が表示されます。

```bash
munin-run apache_accesses
munin-run apache_processes
munin-run apache_volume
```

##MySQLの監視

続いてMySQLの監視を追加します。

###監視用のユーザーを作成

まずはMySQLにて専用のユーザーを作成します。
全ての権限を与えます。

```bash
>mysql grant all on *.* to 'munin'@'127.0.0.1' identified by 'password';
```

###プラグインの追加

必要なプラグインを追加します。

```bash
ln -s /usr/share/munin/plugins/mysql_bytes /etc/munin/plugins/
ln -s /usr/share/munin/plugins/mysql_queries /etc/munin/plugins/
ln -s /usr/share/munin/plugins/mysql_slowqueries /etc/munin/plugins/
ln -s /usr/share/munin/plugins/mysql_threads /etc/munin/plugins/
```

その他のプラグインについては[こちら](http://tech.basicinc.jp/munin/2013/11/10/mysql_munin/)等を参考に。

###アクセス情報の追加

/etc/munin/plugin-conf.d/munin-nodeを開き、以下の記述を追記します。

```bash
[mysql*]
env.mysqlopts -u munin -ppassword -h 127.0.0.1 --port=3306
```

###slow queryログの設定(5.5系）

my.cnfに以下を追加します。ここでは10秒以上のクエリをslow queryとして定義。

```bash
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow.log
long_query_time=10
```

ログファイルの作成と権限の変更。
ログファイルをmysqlから操作できるよう権限を変更。

```bash
touch /var/log/mysql-slow.log
chown mysql:mysql /var/log/mysql-slow.log
```

###再起動

変更内容が反映されるよう関連サービスを再起動。

```bash
service mysqld restart
service munin-node restart
```

###動作確認

各プラグインをmunin-runコマンドでチェック。

```bash
munin-run mysql_bytes
munin-run mysql_queries
munin-run mysql_slowqueries
munin-run mysql_threads
```

###負荷をかけてみる

何もしなくても負荷がかかる環境ならいいのですが、そうでない場合は負荷をかけてみます。

###CPU

CPUに負荷をかけるにはstressツールを使います。Muninと同じepelでインストールるできるので、楽ちんです。

```bash
yum install stress --enablerepo=epel
```

例として1スレッドで1mのストレスをかけます。

```bash
stress -c 1 --timeout 1m
```

stressコマンドの詳細は[こちら](http://dev.classmethod.jp/server-side/server/use-stress-tool-on-ec2/)や[こちら](https://blog.supersonico.info/?p=223)ををどうぞ。CPUだけじゃなく、メモリ、IOなど、目的に応じて使い分けられます。

###Apache

Apacheの負荷はabコマンドを利用してみます。

100ユーザーが同時に10リクエストを行う。

```bash
ab -c 100 -n 1000 http://servername/
```


##メール送信

次に一定以上の負荷が発生した際にメールを送信するように設定してみます。
設定は/etc/munin/munin.confをいじります。

>mailコマンドを利用するので、入っているかどうか確認します。CentOS minimalでは入っていませんでした。その場合はyum intall mailでインストール。

```bash
#ログ設定(logはcontact identifierなので任意の名前）
contact.log.command tee -a /var/log/munin/alert.log

#メール設定(mailはcontact identifierなので任意の名前）
#mailコマンドを実行しているだけなので、そもそもmailコマンドでメールが送信できるか事前に確認する。
contact.mail.command mail -s "Munin Alerts ${var:group}::${var:host}" to@test.com
contact.mail.always_send warning critical

#サーバ毎に閾値の設定
[localhost]
    address 127.0.0.1
    use_node_name yes
    cpu.user.warning 10 #cpuのuserパラメータが10%を超えたらwarning
```

メールアドレスを複数設定したい場合は、,で区切ればいいようです。
設定は起動毎に呼び出されるので特に再起動等は必要ないようです。

##その他

###強制実行したい

基本、cronが実行しているスクリプトを実行すればいいのですが、muninユーザーじゃないと実行出来ないので、下記のようにします。

```bash
su - munin --shell=/usr/bin/munin-cron
```

###一度リセットしたい

/etc/munin/munin.confでdbdirとして指定されているフォルダ以下のファイルを削除。

```bash
rm -rf /var/lib/munin/*
```

htmlを一度消したい場合は、/var/www/html/munin以下を削除。次の実行で復活します。