Amon2 の Large Flavor をインストールする。

ハマったのでメモ・・・・。

cpanm が必要なので、cpanm をインストールしておく必要がある。
インストールし終わったらamonをインストールする。

# cpanm Amon2  

プロジェクト内のモジュールの依存関係を解決する carton もインストールする。

# cpanm Carton

カレントディレクトリにプロジェクトを作成する。
*amon2 には実装テンプレがいくつかあり、フレーバーと呼ばれている。
 以下のコマンドだと、Large という大規模向けのプロジェクトが作られる。
 Lite, Basic というフレーバーもあるが、Large がCakePHP, FuelPHPのような感じになるので、Large がいいと思う。

# amon2-setup.pl --flavor=Large MyProject

プロジェクト内で必要なモジュールをインストールする。

# cd MyProject
# carton install

さらに依存している モジュールをインストールする。
SQLite or mysql は利用する方だけでいい。

# cpanm Plack::Middleware::ReverseProxy DBD::SQLite
# cpanm DBD::SQLite
# cpanm DBD::mysql

Plack::Middleware::ReverseProxyは
このモジュールはアクセス元がプロキシサーバを介してアプリケーションサーバにアクセスする場合にも、
アプリケーションサーバでアクセス元のIPアドレスを参照することが出来る仕組みを提供してくれる。

この追加でインストールするところでハマった。
carton install で依存するモジュール全部インストールしておいて欲しい・・・。

設定ファイル MyProject/script/myproject-server でホストを設定する。
この myproject-server というスクリプト名はプロジェクト名によって変わる。

my $host        = '192.168.33.12'; //$hostを任意のIPに修正する。初期だと 127.0.0.1 になっているが、VM用に 192.168.33.12 に変更した。

起動はそれ用のスクリプトをcartonで起動する。
*ちなみに、以前はルートディレクトリ直下に app.psgi というのがあって、それを利用したらしい。

# carton exec -- plackup -Ilib -R ./lib -p 5000 --access-log=/dev/null -a ./script/xxxx-server
  • p ... ポート指定
    • access-log ... アクセスログに出力先。 指定しない場合はコンソールに表示されてしまう。

あとは myproject-server で指定したIPにアクセスするだけだが、エラーが出ると思う。

これはDB設定をしていないのが原因だった。

amon2にはデモとしてsessionを利用したアクセス数表示機能が実装されている。
lib/Gacha/Web/C/Root.pm を見ると分かると思う。
そして、amon2ではこのsessionがDBで管理されている。
myproject-server を見ると、以下のようにsessionがDBで管理されているのを確認できる。

enable 'Plack::Middleware::Session',
    store => Plack::Session::Store::DBI->new( #←DBIになってる。
        get_dbh => sub {
            state $db_config = Gacha->config->{DBI} || die "Missing configuration for DBI";
            DBI->connect( @$db_config ) #←接続しにいってる。
                or die $DBI::errstr;
        }
    );

なので、DB接続できないとamon2のデモページにアクセスできない。
sessionなんだからファイルにしてくれればいーのに・・・。

ということで、DBの設定をする。
amon2はmysqlsqliteをサポートしていて、それぞれ設定方法が違う。

sqlite
デフォルトではsqliteになっているので、sqliteを利用する場合は
以下のように用意されているサンプルデータをインポートすれば正常にアクセスできるようになる。

# sqlite3 db/development.db < sql/sqlite.sql

sql/sqlite.sql に session というテーブルが確認できる。
このテーブルにsession情報が入るのだろう。


mysql
mysqlの場合は config/development.pl を修正する。
これはDBの接続情報が載っているファイル。
初期だとsqlite用のファイルになっているはず。
それをmysqlに変更する。

use File::Spec;
use File::Basename qw(dirname);
my $basedir = File::Spec->rel2abs(File::Spec->catdir(dirname(__FILE__), '..'));
my $dbpath = File::Spec->catfile($basedir, 'db', 'development.db');

+{
    'DBI' => [
        "dbi:mysql:db1", 'root', 'pass', # ←db名、ユーザ名、パスワードを設定
        +{ }
    ],
};

あとは sql/mysql.sqlmysqlにインポートすればアクセスできるようになる。

当然、DBによるsession管理にもハマった・・・。

以上でサンプルにアクセスできるはず。