Nikushi's blog Our Time is Limited.

SmokePingをPlack + Perlbrew + Alien::RRDtoolで動かす

SmokePingをApache+CGIではなくPlackだけで動かしてみた。

以前書いたSmokePingをインストールしてみたという記事ではシステムPerl + Apache CGI + yumからrrdtool, rrdtoo-perlをインストールする方法でやったが、今回は違う方針で入れてみた。

やりたいこと

  • システムPerlではなくperlbrewで入れたperlを使う
  • PlackでApache無しでWeb画面を立ち上げる

なお、RRDToolをシステムのパッケージシステムからインストールしPerlで使おうとするとCentOSの場合、rrdtoolとrrdtool-perlを入れることになる。rrdtool-perlを使うにはシステムPerlを使わなければならず、今回やりたいperlbrew perlを使えない。そこでAlien::RRDtoolを使ってrrdtoolをbuildすることでRRDToolをperlbrew perlで使えるようになる。Alien::RRDtoolは@gfxさんのAlien::RRDtool - RRDtoolをCPANから入れるが大変参考になる。

Plack化するためCGI::Emulate::PSGIを使う。

以下CentOS6での作業

RRDToolのbuildに必要なパッケージを入れる

# yum install cairo cairo-devel pango pango-devel libxml2-devel bitmap-console-fonts vlgothic-fonts vlgothic-fonts-common

PerlbrewでSmokePing用Perlをbuildする

perlbrewの--asオプションを使ってperlを名前付きでインストールする。今回の作業で必須ではないが、perlのバージョンを上げたいときに普通にインストールするとshebangのパスを書き換えないといけないが、--asオプションを付けると変えなくて済むので便利。

まずsmokepingユーザを作成する

# groupadd smokeping
# useradd smokeping -g smokeping
# su - smokeping

続いてperlbrewをsmokepingユーザ環境化に入れる

$ \curl -L http://install.perlbrew.pl | bash
$ echo 'source $HOME/perl5/perlbrew/etc/bashrc' >> ~/.bashrc
$ source ~/.bashrc

build

$ perl_version=5.20.2
$ perl_name=smokeping
$ perlbrew install $perl_version --as $perl_name  -j 4 -v 
   => ~/perl5/perlbrew/perls/$perl_name にperlがインストールされる

SmokePingのsourceをダウンロード

次のcpanmの工程で必要なので、まずsourceをダウンロードしておく

$ wget http://oss.oetiker.ch/smokeping/pub/smokeping-2.6.11.tar.gz
$ tar zxf smokeping-2.6.11.tar.gz
$ cd smokeping-2.6.11

CPANモジュールインストール

SmokePingが依存するCPANモジュール、 Alien::RRDtool、Plack関連モジュールをインストールする

まず、perlbrew perlを使ってまずcpanmを入れる

$ perlbrew use $perl_name
$ curl -L https://cpanmin.us | perl - App::cpanminus

続いてcpanmを使ってperlbrew perl以下にCPANモジュールをインストール

$ cpanm Alien::RRDtool CGI::Emulate::PSGI Plack `cat PERL_MODULES`

PERL_MODULESはSmokePingのsourceに含まれているファイルでインストールすべきモジュールリストが定義されているのでここでインストールしておく。

SmokePingをインストール

SmokePingを普通に./configure -> make -> make installするとシステムPerlを使おうとするので一工夫が必要で、configure時にPERL環境変数で使うperlを指定することが出来る。また--enable-pkgonlyオプションを指定することでSmokePingのインストーラ自身がCPANモジュールをインストールするのを止めている。

$ PERL=/home/smokeping/perl5/perlbrew/perls/smokeping/bin/perl ./configure --prefix=/usr/local/SmokePing --enable-pkgonly
$ make 
$ sudo /usr/bin/gmake install
$ sudo chown -R smokeping:smokeping /usr/local/SmokePing

本当にperlbrew perlを使ってるかshebangを確認してみる

$ head -1  /usr/local/SmokePing/bin/smokeping
#!/home/smokeping/perl5/perlbrew/perls/smokeping/bin/perl

plackupする

準備は整ったのでsmokepinユーザでplackupしてみる。なお今回は/smokepingをSmokePingのrootにした。

まず、SmokePingの設定ファイルのうち以下の項目の修正が必要。

imgcache = /usr/local/SmokePing/cache
imgurl   = /smokeping/cache
cgiurl   = http://localhost:5000/smokeping/  # URLは適宜読み替えてください

以下のapp.psgiを/usr/local/Smokeping/に置く。

use warnings;
use strict;

use Plack::Builder;
use CGI::Emulate::PSGI;
use CGI qw();

use Smokeping;

my $smokeping = sub {
    CGI::initialize_globals();
    my $q = CGI->new;
    # 適宜configは作成してください
    Smokeping::cgi("/usr/local/Smokeping/etc/config", $q);
};
$smokeping  = CGI::Emulate::PSGI->handler( $smokeping );

builder {
    use Plack::App::File;
    mount "/smokeping/cache" => Plack::App::File->new(root => './cache')->to_app;
    mount "/smokeping/cropper" => Plack::App::File->new(root => './htdocs/cropper')->to_app;
    mount "/smokeping" => $smokeping;
};

/cacheと/cropperはそれぞれ画像ファイルとjsファイルの参照のため。

plackup

$ cd /usr/local/SmokePing
$ plackup

http://localhost:5000/smokeping でweb画面が見れます!!!

あとはpingプロセスを立ち上げる。これもsmokepingユーザで動かす。別途fping等インストールしておく。

$ /usr/local/SmokePing/bin/smokeping

まとめ

何がいいの? システムPerl使いたくない人向け。また管理画面なのでCGIでも十分ではあるけどApache立てずに動かしたい人には便利。