スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

apache1.3にmod_rpafを導入する

apache1.3にmod_rpafを導入する

[前提条件]
CentOS6.4
諸事情でapache1.3を使っている。
フロントにapache2.2をリバースプロキシで使っている。
クライアントのIPアドレスをapache1.3側でも取得したい。

(1) 準備
# vi /etc/yum/pluginconf.d/fastestmirror.conf

include_only=.jp


(2) 準備
# yum groupinstall "Development Tools"



(3) openssl取得とコンパイル
# cd
# wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
# make
# make install


デフォルトで以下にインストールされる
INSTALLTOP=/usr/local/ssl



(4) apacheソース取得と準備
# cd
# wget http://archive.apache.org/dist/httpd/apache_1.3.42.tar.gz
# tar xvfz apache_1.3.42.tar.gz
# cd apache_1.3.42


次のエラーを回避するために、ソースを修正する
error: conflicting types for 'getline'
# sed -i 's/getline/apache_getline/' src/support/htdigest.c
# sed -i 's/getline/apache_getline/' src/support/htpasswd.c
# sed -i 's/getline/apache_getline/' src/support/logresolve.c
 参考:Compiling Apache 1.3.x on Modern Linux Distributions


(5) mod_ssl取得とapacheコンパイル
# cd
# wget http://www.modssl.org/source/mod_ssl-2.8.31-1.3.41.tar.gz
# tar mod_ssl-2.8.31-1.3.41.tar.gz
# cd mod_ssl-2.8.31-1.3.41


1.3.42用のmod_sslは無いので、1.3.41用を代用し、依存関係を偽装する
# vi pkg.sslmod/libssl.version

mod_ssl/2.8.31-1.3.42


configure実行。コンパイルはapache側で行う。
# ./configure --with-apache=../apache_1.3.42 --with-ssl=/usr/local/ssl \
--prefix=/usr/local/apache --enable-module=all --enable-shared=max \
--disable-module=auth_db --disable-module=auth_dbm

# cd ../apache_1.3.42


以下のエラーを回避するために、オプションを付けてmakeする
ssl_util_ssl.c:327: error: ‘STACK’ undeclared (first use in this function)
# make OPTIM=-DSTACK=_STACK
# make install
 参考:「Apache mod_sslのコンパイルを通すにはコツがいる」


[確認] apacheがEAPI対応となっているか
# /usr/local/apache/bin/httpd -V | grep EAPI
-D EAPI



(6) mod_rpaf取得とコンパイル
# cd
# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
# tar mod_rpaf-0.6.tar.gz
# cd mod_rpaf-0.6

# vi Makefile

APXS=/usr/local/apache/bin/apxs

# make rpaf
# make install



(7) apache1.3 httpd.confの設定追加
LoadModule rpaf_module modules/mod_rpaf.so
AddModule mod_rpaf.c
<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-For
</IfModule>

Nagios リモート ログ監視

Nagios リモート ログ監視

前回 Nagios ログ監視 の続き。
今回はリモートのログを監視することを考える。
nrpeを使います。

[前提]
・check_log3.plがインストールされている
・nrpe がインストールされている。使い方を知っている。

(1) 下準備 1

nrpeユーザでログを参照できるように、sudoers.dに以下のファイルを追加

/etc/sudoers.d/nrpe
Defaults:nrpe !requiretty
nrpe ALL=NOPASSWD:/usr/lib64/nagios/plugins/check_log3.pl


nrpeユーザでうまくいくかテスト。-p は正規表現が使える。
# sudo -u nrpe sudo /usr/lib64/nagios/plugins/check_log3.pl -l /var/log/messages -s /tmp/_messages -p "(warn|error)"
OK - No matches found.|lines=0


(2) 下準備 2

nrpe のコマンド追加
/etc/nagios/nrpe.cfg
command[check_log]=sudo /usr/lib64/nagios/plugins/check_log3.pl -l $ARG1$ -s $ARG2$ -p "(warn|error)"


nrpe経由でうまくいくかテスト
# /usr/lib64/nagios/plugins/check_nrpe -H 127.0.0.1 -c check_log -a /var/log/messages /tmp/_messages 
OK - No matches found.|lines=0


(3) Nagios設定追加

define service{
use check-log-service
hostgroup_name linux-servers
service_description var_log_messages_rmt
check_command check_nrpe!check_log!/var/log/messages /tmp/_messages
}

※ hostgroup_name は環境に合わせて。

nagiosを再起動して完成。

(4) ここからは任意

現状、正規表現部分がnrpe.cfgファイルに埋め込みになっています。
これを、以下のようにパラメータとして渡せるようにしたい。
command[check_log]=sudo /usr/lib64/nagios/plugins/check_log3.pl -l $ARG1$ -s $ARG2$ -p "$ARG3$"

define service{
use check-log-service
hostgroup_name linux-servers
service_description var_log_messages_rmt
check_command check_nrpe!check_log!/var/log/messages /tmp/_messages "(warn|error)"
}


しかし、これはうまくいきません。
何故か。nrpe がパラメータとして渡しても良い文字を制限しているからのようです。
#define NASTY_METACHARS         "|`&><'\"\\[]{};"

ここでは「|」がひっかかっているようです。「[]」も正規表現的には使いたいところです。


しかたないので、RPMを作り直します。

(1) ソース(nrpe-2.14-3.el6.src.rpm) の取得
# yumdownloader --enablerepo=epel --source nrpe


(2) ソースのインストール
# rpm -i nrpe-2.14-3.el6.src.rpm


/root/rpmbuild/SOURCES あたりに nrpe-2.14.tar.gz があることを確認

(3) ソースの展開
# tar xvfz nrpe-2.14.tar.gz


(4) ソースの修正
# vi nrpe-2.14/src/nrpe.c

  • [前]
    #define NASTY_METACHARS         "|`&><'\"\\[]{};"

  • [後]
    #define NASTY_METACHARS         "`\\{};"



(5) ソースの圧縮
# tar cvfz nrpe-2.14.tar.gz nrpe-2.14


(6) SPECファイルのリリース番号の修正
# vi /root/rpmbuild/SPECS/nrpe.spec

  • [前]
    Release: 3%{?dist}

  • [後]
    Release: 4%{?dist}



(7) ビルド
# rpmbuild -bb /root/rpmbuild/SPECS/nrpe.spec


(8) インストール
# rpm -U /root/rpmbuild/RPMS/x86_64/nrpe-2.14-4.el6.x86_64.rpm


(9) 再起動
#service nrpe restart


これで、「|」や「[]」を含んだ正規表現をパラメータで渡せるようになりました。おつかれさまでした。

Nagios ログ監視

Nagios ログ監視

Nagiosでのログ監視を考えます。

[前提]
CentOS6.4
Nagiosが動作していること
EPELのリポジトリを追加している。nagiosはyumでEPELからインストールした。


(1) 下準備

標準では「check_log」が付随していますが、どうも手抜き感があるので、「check_log3.pl」に差し替えます。
check_log3.pl ダウンロード

ここに配置。実行権限つける。
/usr/lib64/nagios/plugins/check_log3.pl


nagiosユーザでログを参照できるように、sudoers.dに以下のファイルを追加

/etc/sudoers.d/nagios
Defaults:nagios !requiretty
nagios ALL=NOPASSWD:/usr/lib64/nagios/plugins/check_log3.pl


うまくいくかテスト。-p は正規表現が使える。
# sudo -u nagios sudo /usr/lib64/nagios/plugins/check_log3.pl -l /var/log/messages -s /tmp/_messages -p "(warn|error)"
OK - No matches found.|lines=0



(2) Nagiosの設定追加

コマンド定義
define command{
command_name check_log
command_line sudo $USER1$/check_log3.pl -l $ARG1$ -s $ARG2$ -p $ARG3$
}


サービス定義
define service{
use generic-service
name check-log-service
is_volatile 1
max_check_attempts 1
flap_detection_enabled 0
notification_options w,u,c
register 0
}

define service{
use check-log-service
hostgroup_name linux-servers
service_description var_log_messages
check_command check_log!/var/log/messages!/tmp/_messages!"(warn|error)"
}

※ hostgroup_name は環境に合わせて。

nagiosを再起動して完成。

(3) リモートのログ監視は次回につづく


(付録) ここからは趣味

シークファイル(-s hogehoge)を毎回指定するのは面倒なので、プログラムで勝手に決めるようにする。

check_log3.plの277行目あたり($seek_fileの引数チェック前)に、以下をいれちゃう。
# Seek_file defined by program.
my $seek_dir = "/tmp/nagios";
mkdir $seek_dir;
$seek_file = $log_file;
$seek_file =~ s:/:_:g;
$seek_file = "$seek_dir/$seek_file";


シークファイルの指定が不要になって、あぁ、スッキリした。
define command{
command_name check_log
command_line sudo $USER1$/check_log3.pl -l $ARG1$ -p $ARG2$
}

define service{
use check-log-service
hostgroup_name linux-servers
service_description var_log_messages
check_command check_log!/var/log/messages!"(warn|error)"
}


ganglia TCP 用 グラフ

ganglia TCP 用 グラフ

<?php
/* Pass in by reference! */
function graph_tcp_status_report ( &$rrdtool_graph ) {

global $context,
$hostname,
$range,
$rrd_dir,
$size;

$metric_array = array(
array("tcp_closed", "#3366FF", "CLOSED" ),
array("tcp_closewait", "#33FF66", "CLOSE_WAIT" ),
array("tcp_closing", "#BB9933", "CLOSING" ),
array("tcp_established", "#FF3366", "ESTABLISHED" ),
array("tcp_finwait1", "#FFFF00", "FIN_WAIT_1" ),
array("tcp_finwait2", "#00FF00", "FIN_WAIT_2" ),
array("tcp_lastack", "#AA0000", "LAST_ACK" ),
array("tcp_listen", "#FFFFAA", "LISTEN" ),
array("tcp_synrecv", "#FF33CC", "SYN_RECEIVED" ),
array("tcp_synsent", "#FF0000", "SYN_SENT" ),
array("tcp_synwait", "#CC0000", "SYN_WAIT" ),
array("tcp_timewait", "#FF00FF", "TIME_WAIT" )
);

$title = "TCP status";
if ($context != 'host') {
$rrdtool_graph['title'] = $title;
} else {
$rrdtool_graph['title'] = "$hostname $title last $range";
}

$rrdtool_graph['lower-limit'] = '0';
$rrdtool_graph['vertical-label'] = 'connections';
$rrdtool_graph['extras'] = '--slope-mode';

# Initialize some of the RRDtool components
$rrd_defs = "";
$rrd_graphs = "";
$rrd_legend = "";
$counter = 0;
for ( $i = 0 ; $i < sizeof($metric_array); $i++ ) {
$metric = $metric_array[$i];
# Need index for generating RRD labels
$index = chr($counter + 97);
$rrd_file = $rrd_dir . "/" . $metric[0] . ".rrd";
if ( file_exists($rrd_file)) {
$rrd_defs .= "DEF:" . $index . "='" . $rrd_file . "':'sum':AVERAGE ";
$rrd_graphs .= "CDEF:n" . $index . "=" . $index . ",UN,0," . $index . ",IF ";
##################################################################################
if ( $counter == 0) {
$rrd_legend .= "AREA:" . $index . $metric[1] . "91" . ":'" . $metric[2] . "' ";
} else {
$rrd_legend .= "STACK:" . $index . $metric[1] . "91" . ":'" . $metric[2] . "' ";
}
if ($size == 'large') {
$rrd_legend .= "VDEF:n" . $index . "_max" . "=" . $index . ",MAXIMUM ";
$rrd_legend .= "GPRINT:n" . $index . "_max" . ":" . '"Max\:%6.0lf" ';
$rrd_legend .= "VDEF:n" . $index . "_min" . "=" . $index . ",MINIMUM ";
$rrd_legend .= "GPRINT:n" . $index . "_min" . ":" . '"Min\:%6.0lf" ';
$rrd_legend .= "VDEF:n" . $index . "_avg" . "=" . $index . ",AVERAGE ";
$rrd_legend .= "GPRINT:n" . $index . "_avg" . ":" . '"Avg\:%6.0lf" ';
$rrd_legend .= "VDEF:n" . $index . "_last" . "=" . $index . ",LAST ";
# Can't figure out an easy way to line up the legend
$rrd_legend .= "GPRINT:n" . $index . "_last" . ":" .'"Now\:%6.0lf \r" ';
}
$counter++;
}
}

$rrdtool_graph['series'] = $rrd_defs . $rrd_graphs . $rrd_legend;
return $rrdtool_graph;
}
?>

ganglia apache 用 グラフ

ganglia apache 用 グラフ

<?php
/* Pass in by reference! */
function graph_apache_status_report ( &$rrdtool_graph ) {

global $context,
$hostname,
$range,
$rrd_dir,
$size;

$metric_array = array(
array("ap_open_slot", "#3366FF", "Open slot with no current process" ),
array("ap_waiting", "#33FF66", "Waiting for Connection" ),
array("ap_reading_request", "#BB9933", "Reading Request" ),
array("ap_sending_reply", "#FF3366", "Sending Reply" ),
array("ap_keepalive", "#FFFF00", "Keepalive (read)" ),
array("ap_dns_lookup", "#00FF00", "DNS Lookup" ),
array("ap_logging", "#AA0000", "Logging" ),
array("ap_closing", "#FFFFAA", "Closing connection" ),
array("ap_starting", "#FF33CC", "Starting up" ),
array("ap_gracefully_fin", "#FF0000", "Gracefully finishing" ),
array("ap_idle", "#CC0000", "Idle cleanup of worker" )
);

$title = "apache status";
if ($context != 'host') {
$rrdtool_graph['title'] = $title;
} else {
$rrdtool_graph['title'] = "$hostname $title last $range";
}

$rrdtool_graph['lower-limit'] = '0';
$rrdtool_graph['vertical-label'] = 'connections';
$rrdtool_graph['extras'] = '--slope-mode';

# Initialize some of the RRDtool components
$rrd_defs = "";
$rrd_graphs = "";
$rrd_legend = "";
$counter = 0;
for ( $i = 0 ; $i < sizeof($metric_array); $i++ ) {
$metric = $metric_array[$i];
# Need index for generating RRD labels
$index = chr($counter + 97);
$rrd_file = $rrd_dir . "/" . $metric[0] . ".rrd";
if ( file_exists($rrd_file)) {
$rrd_defs .= "DEF:" . $index . "='" . $rrd_file . "':'sum':AVERAGE ";
$rrd_graphs .= "CDEF:n" . $index . "=" . $index . ",UN,0," . $index . ",IF ";
##################################################################################
if ( $counter == 0) {
$rrd_legend .= "AREA:" . $index . $metric[1] . "91" . ":'" . $metric[2] . "' ";
} else {
$rrd_legend .= "STACK:" . $index . $metric[1] . "91" . ":'" . $metric[2] . "' ";
}
if ($size == 'large') {
$rrd_legend .= "VDEF:n" . $index . "_max" . "=" . $index . ",MAXIMUM ";
$rrd_legend .= "GPRINT:n" . $index . "_max" . ":" . '"Max\:%6.0lf" ';
$rrd_legend .= "VDEF:n" . $index . "_min" . "=" . $index . ",MINIMUM ";
$rrd_legend .= "GPRINT:n" . $index . "_min" . ":" . '"Min\:%6.0lf" ';
$rrd_legend .= "VDEF:n" . $index . "_avg" . "=" . $index . ",AVERAGE ";
$rrd_legend .= "GPRINT:n" . $index . "_avg" . ":" . '"Avg\:%6.0lf" ';
$rrd_legend .= "VDEF:n" . $index . "_last" . "=" . $index . ",LAST ";
# Can't figure out an easy way to line up the legend
$rrd_legend .= "GPRINT:n" . $index . "_last" . ":" .'"Now\:%6.0lf \r" ';
}
$counter++;
}
}

$rrdtool_graph['series'] = $rrd_defs . $rrd_graphs . $rrd_legend;
return $rrdtool_graph;
}
?>
検索フォーム
RSSリンクの表示
リンク
exabugsをフォローしましょう
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。