[技術ブログvol.31] Muninで80と443を監視するのは一筋縄ではいかない #2

はじめに

[技術ブログvol.26] Muninで80と443を監視するのは一筋縄ではいかないでは、apache_*のデフォルトプラグイン群がHTTP(80)/HTTPS(443)を同時監視することができないということをお伝えしました。

(前回のハイライト)

ちーん...    ちーん...

今回は、さりとて同時監視がしたいんだ!という方向けに、一つの解決法をご提供します。

結論から

Apacheを多重起動し、それぞれ80番ポートと443番ポートを専任させ、apache_*のソースに少しだけ改変を加えます。

Muninはserver-statusを見に行きます。
一つのApacheで80/443を兼任している場合、同じページ(/server-status)の値を見に行くのがそもそもの原因でした。
ならば、別のページを見るようにすれば良いわけです。

Apacheの多重起動

まずは、Apacheプロセスをhttpdhttpd-sslとわかりやすいプロセス名をつけて、多重起動する環境を作っていきましょう。

多くのウェブサイトで語られていることなので、さっくり行きましょう。

cp -rp /etc/httpd /etc/httpd-ssl

vi /etc/httpd-ssl/conf/httpd.conf
------
↓それぞれ、コメントアウトしたり書き換える

#ServerRoot "/etc/httpd"
ServerRoot "/etc/httpd-ssl"

#PidFile run/httpd.pid
PidFile run/httpd-ssl.pid

#Listen 80(コメントアウトのみ)

ErrorLog logs/error_log
ErrorLog logs/ssl-error_log

#CustomLog logs/access_log combined
CustomLog logs/ssl-access_log combined
------

cp -rp /var/log/httpd /var/log/httpd-ssl
rm -rf /etc/httpd-ssl/logs
ln -s ../../var/log/httpd-ssl logs

cp -p /etc/sysconfig/httpd /etc/sysconfig/httpd-ssl
vi /etc/sysconfig/httpd-ssl
------
以下を追記
OPTIONS="-f /etc/httpd-ssl/conf/httpd.conf"
------

ln -s /usr/sbin/httpd /usr/sbin/httpd-ssl

cp -p /etc/init.d/httpd /etc/init.d/httpd-ssl
vi /etc/init.d/httpd-ssl
------
↓それぞれhttpd-sslに書き換える

# config: /etc/httpd-ssl/conf/httpd.conf
# config: /etc/sysconfig/httpd-ssl
# pidfile: /var/run/httpd/httpd-ssl.pid

if [ -f /etc/sysconfig/httpd-ssl ]; then
. /etc/sysconfig/httpd-ssl

apachectl=/usr/sbin/apachectl-ssl
httpd=${HTTPD-/usr/sbin/httpd-ssl}
prog=httpd-ssl
pidfile=${PIDFILE-/var/run/httpd/httpd-ssl.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd-ssl}
------

cp -p /usr/sbin/apachectl /usr/sbin/apachectl-ssl
vi /usr/sbin/apachectl-ssl
------
if [ -r /etc/sysconfig/httpd-ssl ]; then
. /etc/sysconfig/httpd-ssl
------

色々調整しましたが、いったんこれで完了です。

加えてvirtualhost.confssl.confの設定を調整し、httpdでは80番ポートのみ、httpd-sslでは443番ポートのみを起動するようにできれば、あとは起動するだけです。

chkconfig --add httpd-ssl
chkconfig httpd-ssl on
/etc/init.d/httpd-ssl start

同時監視は、あります!

それでは、前回もやったブラウザチェックを再試行しましょう。
二つの窓でそれぞれにアクセスし、交互に更新を繰り返します。

  • http://"対象サーバのIPアドレス"/server-status?auto
  • https://"対象サーバのIPアドレス"/server-status?auto

おわかりいただけただろうか

値が違ったと思います。
これで、Muninが先ほどのそれぞれのURLを見に行けば、同時監視できる環境が整いました!

apache_*プラグインの調整

Apache側の環境は整ったので、お次はMuninプラグインを同時監視用に手入れします。

どれも同じノリでできるので、apache_accessesを例にポイントを紹介します。

vi /etc/munin/plugins/apache-accesses
------
※一番下のセクション
foreach my $port (@PORTS) {
if ($port == 80) ←追記
{ ←追記
my $url = "http://127.0.0.1/server-status?auto"; ←URLを直接指定
my $response = $ua->request(HTTP::Request->new('GET',$url));
if ($response->content =~ /^Total Accesses:s+(.+)$/im) {
print "accesses$port.value $1n";
} else {
print "accesses$port.value Un";
}
} ←追記

↓さらに追記

if ($port == 443)
{
my $ua = LWP::UserAgent->new(timeout => 30, agent => sprintf("munin/%s (libwww-perl/%s)",
$Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION)); ## UAがリセットされてしまうので、もう一度宣言する必要があるみたい
my $url = "https://127.0.0.1/server-status?auto";
my $response = $ua->request(HTTP::Request->new('GET',$url));
if ($response->content =~ /^Total Accesses:s+(.+)$/im) {
print "accesses$port.value $1n";
} else {
print "accesses$port.value Un";
}
}

}
------

cat /etc/munin/plugin-conf.d/apache
------
[apache*]
env.ports 80 443
------

foreachplugin-conf.denv.portsを読んでいき、80ならhttp://を見て、443ならhttps://を見に行くようになります。

バァーン!    バァーン!

(相変わらず、検証環境のためグラフの値がショボイです...)

余談

UAがリセットされるので再宣言しなければいけない件、実は、たまたま気がついたものなんです。
443の値が正常に取れなくて悩んでおり、検証環境のSSLが自己証明書による実装だったため、それが原因だと踏んで調査していました。
主にLWP::UserAgentに渡す変数を試行錯誤していたのですが、その時にアクセスログにUAが出てないことに気がついたんですね。

結局、私の場合は自己証明書が原因ではなく再宣言で解消されましたが、もしかしたらここで詰まっている方が居るかもしれません。
自己証明書を使ったSSLサイトにHTTP::Requestする場合の、LWP::UserAgentでのエラーは、

ssl_opts => {verify_hostname => 0}

という文字列を、LWP::UserAgent->new(~~に追記することで回避できることがあります。

まとめ

同時監視ができて、とてもよかったです。

技術ブログ中の人
試してませんが、プロセスごとにVirtualHostを切って、各ドメインのアクセス状況を監視するのにも転用できそうですね。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA