muninを使ったサーバ監視+Apacheの追加監視とWordPressの共存

サーバ構築, 管理者blog

安定したサーバの運用には、サーバの監視が欠かせません。とはいうものの、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について追加監視の指定を行いましたが、必要に応じて適切なプラグインを追加し、実用的なサーバ監視体制を構築しましょう。