エンジニアブログ

エンジニアブログ
Perl

Perlの勧め(4) Sledgeを使おう2

photo.jpg onagatani 2009年10月06日

onagataniです こんにちわ。
先日新聞の1面を飾るという快挙をしましたが皆さんお元気ですか?

また前回からずいぶん時間をあけてしまいましたが
Perlの勧め第4回です。

前回はapacheとmod_perlのインストールまで完了したので、
今回は実際にSledgeを使用して「hello」を表示する所まで説明したいと思います。

■Sledgeインストール

ThinkIT
こちらにインストール方法及びSledgeの紹介・簡単なアプリの作成まで掲載されていますので、
インストールまでを済ませて下さい。

●アプリの作成の前に。。

ここまで進めた方はお気づきかもしれませんが、SledgeはWebページ毎にトリガスクリプトが必要になります。

例)

  • index.cgi => Exsample::Pages::Root.pmのdispatch_indexを呼び出す
  • hoge/index.cgi => Exsample::Pages::Hoge.pmのdispatch_fooを呼び出す


こんな感じです。

これを運用してしまうと、ちょっと大きなサイトだとトリガスクリプトの数が
膨大になってしまい管理しきれなくなります。

そこでSledgeにはSledge::Dispatcherなどのディスパッチモジュールが別途公開されていて、
これを使用するとURLのパスと対応するクラスを記述したファイルを1つ用意すると、
トリガスクリプトが必要なくなります。

例)設定ファイルの中身

  • / = Exsample::Pages::Root
  • /hoge = Exsample::Pages::Hoge

トリガスクリプトが必要なくなり大分楽になりました。ただしmod_perl専用です。

CGIで動作させたい!設定ファイルなんて用意したくない!という人のために
SledgeではURLのパスから対応するdispatchを自動的に設定するモジュールも公開されています。

Sledge::Engine

Sledge::Engineを使用すると設定ファイルが必要なくなります。

というわけで今後はSledge::Engineを使用してアプリケーションの作成を説明していきます。

・Sledge::Engineのインストール

*事前にSledge本体のインストールは済ませおいて下さい。
*memcachedを使用するのでインストールを事前に済ませておいて下さい。
基本的にはcpan Sledge::Engineでインストールできると思います。
Sledge::Utilsでcpanがエラーになった場合にはSledge::Utilsをダウンロードして、
perl Makefile.pl
make install で直接インストールしてみてください。
再度cpan Sledge::Engineでインストールができるかと思います。

・追加でインストールするモジュール

 

これでやっと準備が整いました。

■アプリケーションの作成
今回は以下の設定でアプリケーションを作成してみたいと思います。

  • 作るもの:サーバ管理用のツール
  • 出来ること:サーバ情報を記録して一覧で閲覧できるようにする
  • プロジェクト名:ServerAdmin
  • パス:/var/www/serveradmin
  • 文字コード:UTF8(unflagged-utf8)

1・パスを作成する

/var/www/serveradminを作成

(都度変更してください)

2・パス以下にlib、etc、htdocs、viewディレクトリを作成する

etc以下にはhttpdディレクトリを作成

3・apache/mod_perlのconfを作成

画像などをフロントのapache、動的処理をバックエンドのmod_perlで処理できるように
apache用のconfを作成しetc/httpd内に設置し、httpd.confからincludeします。

Serveradmin80.conf


    ServerName serveradmin.exsample.com       #適宜変更
    DocumentRoot /var/www/serveradmin/htdocs #適宜変更

    RewriteEngine On
    RewriteRule ^/((.*)\.(js|css|jpg|gif|png|swf))$ /var/www/serveradmin/htdocs/$1 [L]  #適宜変更
    RewriteRule ^/(.*) http://localhost:8080/server/$1 [P,L,QSA]
    ProxyPassReverse / http://localhost:8080/server/

次にmod_perl用のconfを作成し、mod_perl.confからincludeします。

ServerAdmin8080.conf


use lib qw(
    /var/www/serveradmin/lib #適宜変更
);



    PerlModule ServerAdmin
    SetHandler perl-script
    PerlHandler ServerAdmin

4・libディレクトリに移動しslege-setupを実行

# sledge-setup ServerAdmin
ServerAdminディレクトリが生成されます

5・ServerAdmin.pmファイルの作成(Sledge::Engine用)

lib/ServerAdmin.pm

package serverAdmin;
use strict;
use Sledge::Engine;

__PACKAGE__->setup;

1;
__END__

6・Charset.pmファイルの作成

デフォルトの文字コードがeuc-jpなので、
unflagged-utf8に変更する

lib/ServerAdmin/Charset.pm

package ServerAdmin::Charset;

use strict;
use base qw(Sledge::Charset::Null);

sub content_type {
    return 'text/html; charset=UTF-8';
}

1;
__END__

7・Pages.pmファイルの修正

今回作成するアプリケーション用にlib/ServerAdmin/Pages.pmを修正します。

7-1 sessionをmemcachedに変更

Sledge::Session::MySQLをSledge::Session::Memcachedに修正

7-2 charsetをServerAdmin::Charsetに変更

use ServerAdmin::Charset;を追加
Sledge::Charset::DefaultをServerAdmin::Charsetに変更

7-3 テンプレートの設定処理を追加する

useの最終行の下あたりに以下を追加

__PACKAGE__->register_hook(
    BEFORE_DISPATCH => sub {
        my $self = shift;
        my $config = $self->create_config;
        $self->tmpl->set_option(
            INCLUDE_PATH => [
                $config->tmpl_path . '/include', #後でインクルードファイルを追加します
            ],
        );
    },
);

BEFORE_DISPATCHにコードレフにてテンプレートオプションを指定することにより、
dispatch毎に同じ処理を書かなくて済むようになります。

8・lib/ServerAdmin/Config/_common.pmを修正

コンフィグファイルの中身を修正します。本来は_test.pmや_production.pmなど2つ用意して
ステージングと本番を自動的に読み替えるのですが今回は共通の_common.pmだけに記述します。
以下の項目を追加・修正します。

$C{TMPL_PATH}     = '/var/www/serveradmin/view'; #テンプレートファイルのパスを指定します
$C{DATASOURCE}    = [ 'dbi:mysql:serveradmin','serveradmin', 'serveradmin' ]; #データべース名、user、passwdを指定します
$C{COOKIE_NAME}   = 'serveradmin_sid';
$C{MEMCACHE_SERVERS} = [ qw/ 127.0.0.1:11211 / ]; #memcachedのIP、ポート番号を指定します
$C{SESSION_SERVERS}  = $C{MEMCACHE_SERVERS};

9・テスト用にindexページを作成

lib/ServerAdmin/以下にPagesディレクトリを作成(このディレクトリ以下にコントローラを設置します)
Pages以下にRoot.pmファイルを作成。dispatch_indexが実際に実行されるメソッドになります。

lib/Pages/Root.pm

package ServerAdmin::Pages::Root;
use strict;
use base qw(ServerAdmin::Pages);

__PACKAGE__->tmpl_dirname('/');

sub dispatch_index {
    my $self = shift;
    $self->tmpl->param(mes => 'hello'); #テンプレートに値を入れる
}

1;
__END__

10・indexページのテンプレートを作成

TemplateToolkit用のテンプレートファイルを作成します。
文法についてはこちらのページが参考になるでしょう。

view/index.html

[% PROCESS 'header.inc' %]
[% mes %]
[% PROCESS 'footer.inc' %]

11・テンプレートにincludeしているheaderとfooterを作成

view/includeディレクトリを作成しその中に設置する

/view/include/header.inc

<html>
<head>
<title>ServerAdmin</title>
</head>
<body>

/view/include/footer.inc

</body>
</html>

12・apache、mod_perlを再起動する

エラーがでましたらmod_perlのエラーログを確認してみましょう。
問題なければブラウザでhttp://serveradmin.exsample.com/にアクセスすると
helloと表示されるはずです。

ざっと説明しましたが、まだ、実用的ではありません。

次回はDBを使用して、認証を行いサーバの管理情報を記録するまでを行いたいと思います。