muninを使ったサーバ監視+Apacheの追加監視とWordPressの共存
安定したサーバの運用には、サーバの監視が欠かせません。とはいうものの、24時間サーバの様子を見続けることなど不可能なので、弊社では「munin」「awsの管理画面」「pingdom」の3つを使ってサーバの監視を行っています。
munin - サーバやネットワークの監視ツール。オープンソースである。
awsの管理画面 - 様々なリソースの状況を確認できる。
pingdom - 世界各地のデータセンタから死活確認をするサービス。
本記事ではmuninを使ってApacheを監視する方法、および、Wordpress等を運用している場合に発生する注意事項を紹介します。
前提条件
本記事は以下の環境にて動作確認を行っております。
Amazon Web Services の AmazonLinuxで、Apache2.4をインストール済
Muninのインストール
Muninは以下の手順でインストールできます。
sudo yum install munin munin-node #インストール
sudo chkconfig munin-node on #サービスを自動起動するように設定
sudo service munin-node start #サービスを起動
sudo htpasswd -c /etc/munin/munin-htpasswd admin #パスワードを設定します
これで5分程度経過すると、/munin/にサーバの監視結果が表示されます。
監視結果が存在しない場合は以下のような画面が表示されます。(ディレクトリインデックス(=ディレクトリ内のファイル一覧表示)を許可している場合のみ)
監視結果が生成されると以下のような画面が表示されます。
これでmuninを使えるようになりましたが、先程設定したパスワードが無視され、誰でも監視結果が見える状態になっています。これはセキュリティー上の問題があります。(攻撃者に弱点がバレてしまいます)
Apacheの再起動
Apacheを再起動するとMuninのログイン制限が有効化されます。これでmuninを使った基本的なサーバ監視の基本的な設定は完了です。
sudo service httpd restart
監視項目の追加
基本的なセットアップだけでも、サーバのかなり詳細情報が取れるようになりました。ディスク、ネットワーク、CPUなどOSレベルで気にするべき多くの項目は網羅されています。
バージョン2.0.20では、デフォルトで38の監視項目が有効化されています(1つの項目の中でも10程度の値をモニタリングしているものもあります)が、全体では232の監視項目が準備されています。
全て追加してしまえば良いように思うかもしれませんが、オススメしません。そんなことをすると、監視のための負荷が発生したり、監視結果の保存スペースが余分に必要になったり、そもそも、muninの画面に不要な項目が羅列され、目的の項目を探しづらくなってしまいます。
デフォルトで有効化されている監視項目
ls /etc/munin/plugins/
cpu diskstats fw_packets interrupts memory ntp_kernel_pll_freq ntp_states processes sendmail_mailstats threads vmstat
df entropy if_err_eth0 irqstats netstat ntp_kernel_pll_off open_files proc_pri sendmail_mailtraffic uptime
df_inode forks if_eth0 load ntp_kernel_err ntp_offset open_inodes sendmail_mailqueue swap users
リンクするだけで直ぐに使える監視項目
ls /usr/share/munin/plugins/
acpi diskstat_ ip_ nfs4_client postgres_checkpoints snmp__cpuload snort_traffic
amavis diskstats ipac-ng nfs_client postgres_connections_ snmp__df spamstats
apache_accesses ejabberd_ ipmi_ nfsd postgres_connections_db snmp__df_ram squeezebox_
apache_processes entropy ipmi_sensor_ nfsd4 postgres_locks_ snmp__fc_if_ squid_cache
apache_volume exim_mailqueue ircu nginx_request postgres_oldest_prepared_xact_ snmp__fc_if_err_ squid_icp
apc_envunit_ exim_mailqueue_alt irqstats nginx_status postgres_prepared_xacts_ snmp__if_ squid_objectsize
apc_nis exim_mailstats jmx_tomcat_dbpools nomadix_users_ postgres_querylength_ snmp__if_err_ squid_requests
apt fail2ban load ntp_kernel_err postgres_scans_ snmp__if_multi squid_traffic
apt_all files_ loggrep ntp_kernel_pll_freq postgres_size_ snmp__load surfboard
asterisk_channels foldingathome lpar_cpu ntp_kernel_pll_off postgres_streaming_ snmp__memory swap
asterisk_channelstypes foldingathome_rank lpstat ntp_offset postgres_transactions_ snmp__netapp_diskusage_ tcp
asterisk_codecs foldingathome_wu mailman ntp_states postgres_tuples_ snmp__netapp_inodeusage_ threads
asterisk_meetme forks mailscanner nut_misc postgres_users snmp__netstat tomcat_access
asterisk_meetmeusers freeradius_acct mbmon_ nutups_ postgres_xlog snmp__print_pages tomcat_jvm
asterisk_sipchannels freeradius_auth memcached_ nut_volts proc snmp__print_supplies tomcat_threads
asterisk_sippeers freeradius_proxy_acct meminfo nvidia_ processes snmp__processes tomcat_volume
asterisk_voicemail freeradius_proxy_auth memory open_files proc_pri snmp__rdp_users uptime
bind9 fw_conntrack mhttping open_inodes proxy_plugin snmp__sensors_fsc_bx_fan users
bind9_rndc fw_forwarded_local multiping openvpn ps_ snmp__sensors_fsc_bx_temp varnish_
bonding_err_ fw_packets multips perdition psu_ snmp__sensors_fsc_fan vlan_
buddyinfo haproxy_ multips_memory pgbouncer_connections qmailqstat snmp__sensors_fsc_temp vlan_inetuse_
cmc_tc_sensor_ haproxy_ng munin_stats pgbouncer_requests qmailscan snmp__sensors_mbm_fan vlan_linkuse_
courier_ hddtemp munin_update ping_ qmailscan-simple snmp__sensors_mbm_temp vmstat
courier_mta_mailqueue hddtemp2 mysql_ plugin.sh quota_usage_ snmp__sensors_mbm_volt vserver_cpu_
courier_mta_mailstats hddtempd mysql_bytes plugins.history samba snmp__swap vserver_loadavg
courier_mta_mailvolume hddtemp_smartctl mysql_innodb pm3users_ selinux_avcstat snmp__uptime vserver_resources
cps_ hp2000_ mysql_isam_space_ pop_stats sendmail_mailqueue snmp__users yum
cpu http_loadtime mysql_queries port_ sendmail_mailstats snmp__winload zimbra_
cpuspeed if_ mysql_slowqueries postfix_mailqueue sendmail_mailtraffic snmp__winmem
cupsys_pages if_err_ mysql_threads postfix_mailstats sensors_ snort_alerts
df ifx_concurrent_sessions_ named postfix_mailvolume slapd_ snort_bytes_pkt
df_abs interrupts netopia postgres_autovacuum slapd_bdb_cache_ snort_drop_rate
df_inode iostat netstat postgres_bgwriter slony_lag_ snort_pattern_match
digitemp_ iostat_ios netstat_multi postgres_cache_ smart_ snort_pkts
Apacheに対する監視項目を追加
では、Apacheに関する監視項目を追加してみましょう。
以下の3ステップで設定できます。(Wordpressがなければ2ステップの場合が多い)
Apacheの拡張ステータス表示を有効化する
.htaccessが悪さをしている場合は記述を修正する(必要な場合のみ)
muninに監視対象を追加する
Apacheの拡張ステータス表示を有効化
/etc/httpd/conf/httpd.conf の末尾に以下の設定を追加する。/server-statusにアクセスしたとき、server-statusハンドラで処理するように指定している。また、外部からアクセスできると、セキュリティー上問題があるので、ローカルホストからのアクセスしか許可していない。
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from localhost
</Location>
Allow from のlocalhostはmuninからのアクセスにつかう。
これで、/server-status にアクセスしてサーバステータスが取得できれば問題ない。
外部からのアクセスを許可していないので、 wget http://localhost/server-status などとして、アクセスできるか確認すること。
WordpressなどのCMSが入っている場合、それらの.htaccessが悪さをしている場合があるので修正する。
.htaccessを修正する(必要な場合のみ)
/var/www/html/.htaccessに、URLのリライト設定がされていて、その設定が悪さをしている場合がある。「RewriteCond %{REQUEST_URI} !=/server-status」を追加することで、サーバのステータス取得URLをリライト対象外とする。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/server-status
RewriteRule . /index.php [L]
</IfModule>
muninに監視対象を追加する
シンボリックリンクを貼れば良い。以下のコピペでApacheに関する監視項目を追加できる。
sudo ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
sudo ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
sudo ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume
シンボリックリンクを追加したあとは必ず、munin-nodeをリスタートすること。
service munin-node restart
設定がうまくいっていれば、apacheの項目が追加され、グラフが描画され始めます。
まとめ
muninを使えば手軽にサーバ監視を開始できます。今回の例ではApacheについて追加監視の指定を行いましたが、必要に応じて適切なプラグインを追加し、実用的なサーバ監視体制を構築しましょう。