SmokePing はネットワーク遅延を可視化する Web ツールです。インストール手順と基本設定をまとめます。特に CentOS 6 を使用する場合について記述していますが、基本的な流れや考え方は他の OS でも同じです。
こちらで紹介した plenv を利用すると perl およびモジュールのバージョンをプロジェクト内で固定できます。これはとても重要なことで、あるメンバーのマシンでは動作して別のマシンでは動作しないといった事態を回避できます。ここでは plenv をシステムインストールして perl v5.20.0 をインストールすることにしてみます。
$ sudo git clone https://github.com/tokuhirom/plenv.git /usr/local/plenv
$ sudo git clone https://github.com/tokuhirom/Perl-Build.git /usr/local/plenv/plugins/perl-build
$ sudo mkdir /usr/local/plenv/shims
$ sudo mkdir /usr/local/plenv/versions
$ sudo vi /etc/profile.d/plenv.sh (↓のように編集します)
$ source /etc/profile.d/plenv.sh
/etc/profile.d/plenv.sh
export PLENV_ROOT=/usr/local/plenv
export PATH=$PLENV_ROOT/bin:$PATH
eval "$(plenv init -)"
$ sudo yum install gcc
$ sudo yum install openssl-devel
$ sudo yum install patch
$ sudo yum install readline-devel
perl
$ sudo su -l
# plenv install 5.20.0
# plenv rehash
# plenv global 5.20.0
# exit
cpanm
$ sudo su -l
# plenv install-cpanm
# plenv which cpanm
# exit
carton
$ sudo su -l
# plenv exec cpanm Carton
# plenv rehash
# exit
こちらから最新のものをダウンロードします。今回は smokeping-2.6.11.tar.gz をダウンロードして使用しています。
$ cd /path/to/somewhere
$ tar zxvf smokeping-2.6.11.tar.gz
$ cd smokeping-2.6.11
SmokePing が依存する Perl モジュール一覧を確認します。
$ cat PERL_MODULES
FCGI
CGI
CGI::Fast
Config::Grammar
Digest::HMAC_MD5
Net::Telnet
Net::OpenSSH
Net::SNMP
Net::LDAP
Net::DNS
IO::Pty
LWP
carton で perl モジュールをローカルインストールします。まず plenv local によって perl のバージョンを固定します。
$ plenv local 5.20.0
.perl-version が作成されたことが確認できます。
$ cat .perl-version
5.20.0
先程確認した SmokePing が依存する perl モジュールを carton で使用する cpanfile に記載します。
$ vi cpanfile
requires 'FCGI';
requires 'CGI';
requires 'CGI::Fast';
requires 'Config::Grammar';
requires 'Digest::HMAC_MD5';
requires 'Net::Telnet';
requires 'Net::OpenSSH';
requires 'Net::SNMP';
requires 'Net::LDAP';
requires 'Net::DNS';
requires 'IO::Pty';
requires 'LWP';
ローカルディレクトリにインストールします。bundle でキャッシュも作成します。
$ plenv exec carton install
$ plenv exec carton bundle
インストールされたことが確認できます。
$ ls local/
$ ls vendor/cache/
SmokePing は RRDtool というデータのグラフ化システムに依存しています。RRDtool 本体および perl の RRDtool モジュールをインストールする必要があります。
RPM を用いて以下のようにすることで一見インストールできたように思います。
$ sudo yum install rrdtool ← 今回は不要!
$ sudo yum install rrdtool-devel ← 今回は不要!
$ sudo yum install rrdtool-perl ← 今回は不要!
しかしながら、この方法だと system perl にインストールされてしまいます。
$ rpm -ql rrdtool-perl
/usr/lib64/perl5/vendor_perl/RRDp.pm
/usr/lib64/perl5/vendor_perl/RRDs.pm
/usr/lib64/perl5/vendor_perl/auto/RRDs
/usr/lib64/perl5/vendor_perl/auto/RRDs/RRDs.so
/usr/share/doc/rrdtool-perl-1.3.8
/usr/share/doc/rrdtool-perl-1.3.8/html
/usr/share/doc/rrdtool-perl-1.3.8/html/RRDp.html
/usr/share/doc/rrdtool-perl-1.3.8/html/RRDs.html
/usr/share/man/man3/RRDp.3pm.gz
/usr/share/man/man3/RRDs.3pm.gz
$ sudo su -l
# plenv global system
# exit
$ plenv exec perldoc RRDs
plenv で用意した perl からは利用できません。
$ sudo su -l
# plenv global 5.20.0
# exit
$ plenv exec perldoc RRDs
No documentation found for "RRDs".
plenv でインストールした perl に対して RRDtool をインストールする方法としては、現在のところソースコードからインストールするのが一番簡単です。こちらからソースコードをダウンロードして解凍します。今回は rrdtool-1.4.9.tar.gz を選択しています。
$ cd /path/to/somewhere
$ tar zxvf rrdtool-1.4.9.tar.gz
$ cd rrdtool-1.4.9
必要なソフトウェアをインストールします。
$ sudo yum install libxml2
$ sudo yum install libxml2-devel
$ sudo yum install pango
$ sudo yum install pango-devel
$ sudo yum install liberation-sans-fonts ← グラフの豆腐化対策です。必ずしもこのフォントでなくてもよいです。
ビルドを実行します。インストールしたい Perl の Version (今回は 5.20.0) が出力されることを確認します。
$ ./configure --disable-tcl --disable-lua --disable-python --disable-ruby \
--with-perl-options='INSTALLDIRS="site"' --prefix=/opt/rrdtool-perl5.20.0
...
Config is DONE!
...
Perl Version: 5.20.0 ← ★
Perl Options: INSTALLDIRS="site"
...
$ make
plenv で global 指定した perl に RRDtool を扱うためのモジュールをインストールします。
$ sudo make install
$ ls /opt/rrdtool-perl5.20.0
確かに RRDs モジュールがインストールされました。
$ plenv version
5.20.0 (set by /usr/local/plenv/version)
$ plenv exec perldoc RRDs
先程解凍したディレクトリに戻ります。
$ cd /path/to/somewhere/smokeping-2.6.11
以下のコマンドでインストールします。
$ plenv exec carton exec ./configure --prefix=/opt/smokeping-perl5.20.0
$ sudo make install
$ ls /opt/smokeping-perl5.20.0
/opt/smokeping-perl5.20.0 にも perl モジュールをインストールします。
$ cd /path/to/somewhere/smokeping-2.6.11
$ sudo cp cpanfile cpanfile.snapshot .perl-version /opt/smokeping-perl5.20.0/
$ sudo mkdir /opt/smokeping-perl5.20.0/vendor
$ sudo cp -r vendor/cache /opt/smokeping-perl5.20.0/vendor/
$ sudo su
# cd /opt/smokeping-perl5.20.0
# plenv exec carton install --deployment --cached
# exit
SmokePing は fping に依存しているためインストールします。こちらで紹介した epel レポジトリに格納されています。
$ sudo yum install epel-release
$ sudo yum install fping
CGI を動作させることができるウェブサーバをインストールします。Apache でもよいですが nginx を利用する場合は以下のようにします。CentOS 6 の場合は fping と同様に epel レポジトリで提供されています。
$ sudo yum install epel-release
$ sudo yum install nginx
動作させるために必要な最低限の設定は以下の通りです。
$ cd /opt/smokeping-perl5.20.0
$ sudo cp etc/config.dist etc/config
$ sudo mkdir cache data var
$ sudo chmod 777 cache data var
$ sudo chmod o-r etc/smokeping_secrets.dist
以下のコマンドがエラーなく実行されることを確認します。
$ plenv exec carton exec ./bin/smokeping --config=/opt/smokeping-perl5.20.0/etc/config --debug
実際にデーモンを起動するためには以下のようにします。
$ plenv exec carton exec ./bin/smokeping --config=/opt/smokeping-perl5.20.0/etc/config --logfile=smoke.log
起動していることが確認できます。
$ pgrep -l smoke
11291 ./bin/smokeping
$ sudo tail /var/log/messages
...
Apr 4 15:43:35 localhost smokeping[11248]: Starting syslog logging
Apr 4 15:43:35 localhost smokeping[11291]: Smokeping version 2.006011 successfully launched.
Apr 4 15:43:35 localhost smokeping[11291]: Not entering multiprocess mode for just a single probe.
Apr 4 15:43:35 localhost smokeping[11291]: FPing: probing 1 targets with step 300 s and offset 16 s.
一旦停止しましょう。
$ pkill smoke
RRDtool で出力されるグラフの時刻を JST に合わせるため、例えば以下のように環境変数を設定します。一旦ログアウトして再度ログインすると設定が反映されます。なお LANG を ja_JP.UTF-8 とするとグラフの一部が豆腐化する可能性があります。ja_JP.UTF-8 としつつ豆腐化を回避する方法は現在のところ不明です。
/etc/environment
export LANG=en_US.UTF-8
export TZ=Asia/Tokyo
export S_TIME_DEF_TIME=UTC
PSGI (Perl Web Server Gateway Interface) を用いると
Webサーバ(Apache,nginx等) → インターフェース(CGI,FastCGI,mod_perl等) → Perl CGI スクリプト
という構造が
Webサーバによるリバースプロキシ(Apache,nginx等) → PSGIサーバ → Perl PSGI アプリケーション
と変化します。PSGI サーバというレイヤーが追加されることによってアプリケーション開発者は PSGI の仕様にさえ準拠していれば CGI, FastCGI, mod_perl 等の差異を意識しなくてもよいというメリットが発生します。Ruby の Rack のようなものです。Web サーバをリバースプロキシとして利用するため負荷分散もできます。Perl PSGI アプリケーションを作成するための便利なフレームワークのようなものが Plack です。SmokePing は CGI および FastCGI に対応した Perl CGI スクリプトを提供していますが、上述のようなメリットを享受するために Plack で Perl PSGI アプリケーション化してみましょう。今回の構成は以下の通りです。
cpanfile に以下の行を追加します。
$ cd /opt/smokeping-perl5.20.0
$ sudo vi cpanfile
...
requires 'Plack', '0.9980';
requires 'Starman', '0.2000';
requires 'CGI::Emulate::PSGI';
インストールを実行します。キャッシュも作成しておきましょう。
$ sudo su
# plenv exec carton install
# plenv exec carton bundle
# exit
以下のファイルを作成するだけです。
$ sudo vi app.psgi
app.psgi
#!/usr/local/plenv/versions/5.20.0/bin/perl
use strict;
use warnings;
use lib '/opt/smokeping-perl5.20.0/lib';
use CGI::Emulate::PSGI;
my $app = CGI::Emulate::PSGI->handler(sub {
use CGI;
use Smokeping;
CGI::initialize_globals();
my $cfg = "/opt/smokeping-perl5.20.0/etc/config";
my $q = CGI->new;
Smokeping::cgi($cfg, $q);
});
$ plenv exec carton exec starman -p 8080 app.psgi
$ curl http://127.0.0.1:8080/ ←別ターミナルなどで実行
Perl PSGI アプリケーションを起動します。
$ sudo su
# plenv exec carton exec starman -p 8080 \
--access-log /opt/smokeping-perl5.20.0/var/access_log \
--error-log /opt/smokeping-perl5.20.0/var/error_log \
--user nobody --group nobody --daemonize app.psgi
# exit
オプションの意味は以下のコマンドで確認できます。
$ plenv exec carton exec perldoc starman
例えばログファイルを以下のディレクトリに作成するように指示しています。
$ tail /opt/smokeping-perl5.20.0/var/access_log
$ tail /opt/smokeping-perl5.20.0/var/error_log