はじめに
[技術ブログvol.26] Muninで80と443を監視するのは一筋縄ではいかないでは、apache_*のデフォルトプラグイン群がHTTP(80)/HTTPS(443)を同時監視することができないということをお伝えしました。
(前回のハイライト)
今回は、さりとて同時監視がしたいんだ!という方向けに、一つの解決法をご提供します。
結論から
Apacheを多重起動し、それぞれ80番ポートと443番ポートを専任させ、apache_*のソースに少しだけ改変を加えます。
Muninはserver-statusを見に行きます。
一つのApacheで80/443を兼任している場合、同じページ(/server-status)の値を見に行くのがそもそもの原因でした。
ならば、別のページを見るようにすれば良いわけです。
Apacheの多重起動
まずは、Apacheプロセスをhttpd
とhttpd-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.conf
やssl.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
------
foreach
でplugin-conf.d
のenv.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を切って、各ドメインのアクセス状況を監視するのにも転用できそうですね。