概要
ぴゅーっとWebアプリを立ち上げる。
ウェブアプリの名前は「XYZ」で。
- centos
- plenv
- cpanm
- carton
- git
- cpanfile
- mojolicious
- apache
- teng
centos
とりあえず6.5。
ユーザ
もちろん、ユーザアカウントはxyzじゃなくてもいいけど。
$ useradd xyz $ passwd xyz $ usermod -G wheel xyz (wheelグループへ) // wheelグループのユーザだけsuできるように $ su - # vi /etc/pam.d/su auth required pam_wheel.so use_uid (コメント外す) // wheelグループのユーザはsudodできる # visudo %wheel ALL=(ALL) ALL (コメント外す) // すべてのホストから すべてのユーザになれ すべてのコマンド使用可、の意
plenv
インストール
$ cd ~
https://github.com/tokuhirom/plenv の通りにインストール。
Perlのインストール
// インストール可能なバージョンリスト $ plenv install --list // ※偶数が安定板。RC1、RC2…を経て。 // 例えばPerl5.22.0をインストール。 $ plenv install 5.22.0 -Dusethreads $ plenv rehash // とりあえずlocalでそのバージョンへ $ plevn local 5.22.0
cpanm
5.22.0に対して、cpanmを入れる。
$ plenv install-cpanm // 確認 $ plenv exec cpanm -V
carton
plenv経由で。
$ plenv exec cpanm Carton // 確認 $ plenv exec carton -v
git
GithubとかBitbuscketとかでリポジトリ作成。
ディレクトリ準備。
$ cd ~ $ mkdir xyz $ cd ~/xyz // このディレクトリでのPerlバージョンを固定 $ plenv local 5.22.0 // →.perl-version ファイルが作成される。
$ git init $ git remote add origin https://アカウント@bitbucket.org/アカウント/xyz.git // git管理無視リスト作成 $ vi .gitignore
local/ …… cartonで作成されるPerlモジュールディレクトリ xyz_web/log/ …… これから作るMojoliciousのログディレクトリ
コミットしてプッシュ。
$ git status …… どんな感じか確認 $ git add --all …… あれこれを追加 (git add -A と同じ) $ git commit -m "基本ファイル作成" $ git push -u origin master … リポジトリへ反映 (次回からは git push のみで)
※「-u」オプション…追跡設定。git pull時に引数を省略できる。git status時にahead, behindが分かる。
cpanfile
$ cd ~/xyz $ vi cpanfile
requires 'Mojolicious'; requires 'Digest::SHA'; requires 'Time::HiRes'; requires 'Teng'; #requires 'Mouse'; requires 'DBI'; requires 'DBD::mysql'; #requires 'DBD::SQLite'; #requires 'DBD::Oracle';
ローカルのcpanfileを元にモジュールインストール。
$ plenv exec carton install // cpanfile.snapshotを元にするなら (本番環境デプロイ時) $ plenv exec carton install --deployment
mojolicious
スケルトン作成。
$ cd ~/xyz $ plenv exec carton exec -- mojo generate app Xyz::Web
起動してみる。
バックグラウンドへまわすなら、末尾に「&」。
$ plenv exec carton exec -- morbo script/xyz_web // ポート3738で起動なら $ plenv exec carton exec -- morbo --listen="http://*:3738" script/xyz_web
apache 2系
リバースプロキシの設定。
http://192.168.0.37/xyz でアクセスできるように。
→/xyz に来たら、localhost:3738 へ。
$ sudo su - # cd /etc/httpd/conf.d # vi xyz.conf
ProxyPass /xyz http://localhost:3738 nocanon ProxyPassReverse /xyz http://localhost:3738
※nocanonをつけることで、URLの正規化を抑制(つまり通常は正規化される)。
あるいは以下を追加。
<Proxy http://localhost:3738/*> Order deny,allow Allow from all </Proxy>
確認して再起動。
// 確認 # service httpd configtest // 再起動 # service httpd graceful
git
うまく動いたら、ここらでgit commit & git push。
「git add -A」で削除したファイル/ディレクトリも対象に。
$ git status $ git add -A $ git commit -m "スケルトン構築&サーバ起動OK" $ git push
今後、更新されたかもしれないリモートの状態をローカルへ反映させる時は…。
$ git pull
config
$ cd ~/xyz/xyz_web $ mkdir config $ vi default.conf
/config/default.conf
+ { db => { connect_info => [ 'dbi:mysql:xyz_production', 'root', 'password', { mysql_enable_utf8 => 1 } ] } };
/config/dev.conf
+ { db => { connect_info => [ 'dbi:mysql:xyz_development', 'root', 'password', { mysql_enable_utf8 => 1 } ] } };
環境変数 XYZ_CONF で「dev」と指定すると、dev.conf を読み込む、ということにする。
/lib/Xyz/Web.pm
sub startup { my $self = shift; # config my $config_name = $ENV{XYZ_CONFIG} || 'default'; my $config = $self->plugin('Config', {file => "config/$config_name.conf"}); ... }
teng
O/Rマッパ。
/lib/Xyz/Web.pm
sub startup { my $self = shift; ... # db - $self->app->dbでアクセス可能 $self->attr( db => sub { Xyz::DB->new($config->{db}); } ); ... }
/lib/DB.pm
package Xyz::DB; use parent 'Teng'; 1;
/lib/DB/Schema.pm
package Xyz::DB::Schema; use Teng::Schema::Declare; table { name 'memo'; pk 'id'; columns qw[id title body created_at created_by updated_at updated_by]; }; table { name 'user'; pk 'id'; columns qw[id name age]; }; 1;
log
/log/ ディレクトリがあれば、そこにログが出力される。
なければ、標準エラー出力。
本番環境には /log/ 用意。
ツリー
Xyz_web |-- lib | |-- Xyz | | |-- DB | | | `-- Schema.pm | | |-- DB.pm | | |-- Model | | | `-- Category.pm | | |-- Model.pm | | |-- Web | | | `-- Controller | | | `-- Example.pm | | `-- Web.pm | `-- Xyz.pm |-- public | |-- common | | |-- xyz.css | | |-- bootstrap | | | `-- 3.3.5 | | | `-- theme.css | | |-- bootstrap-datetimepicker | | | `-- 4.17.37 | | | |-- css | | | | |-- bootstrap-datetimepicker.css | | | | `-- bootstrap-datetimepicker.min.css | | | `-- js | | | `-- bootstrap-datetimepicker.min.js | | `-- moment | | `-- 2.10.6 | | |-- moment-with-locales.js | | `-- moment-with-locales.min.js | |-- image | | |-- 21249623125_b8b3793b3c_z.jpg | | `-- 21308059141_ae054bc804_m.jpg | `-- index.html |-- script | `-- xyz_web |-- t | `-- basic.t `-- templates |-- at | `-- index.html.ep |-- event | |-- edit.html.ep | `-- index.html.ep |-- example | `-- welcome.html.ep |-- layouts | |-- default.html.ep | `-- normal.html.ep |-- parts | |-- google_ad_responsible.html.ep | `-- site_header.html.ep |-- root `-- user `-- index.html.ep
データベースパスワード等
.bash_profileに設定してプログラムからENVで参照。
$ vi ~/.bash_profile export XYZ_CONFIG=dev export XYZ_DB_USERNAME=root export XYZ_DB_PASSWORD=xYz123XyZ456 // 読み込み直し $ source ~/.bash_profile // 確認 printenv | grep XYZ
アプリサーバ
開発サーバでmorbo(モーボ)
// 起動 $ plenv exec carton exec -- morbo script/xyz_web // ポート3738で起動なら $ plenv exec carton exec -- morbo --listen="http://*:3738" script/xyz_web
本番サーバで
// 起動 $ plenv exec carton exec -- hypnotoad script/xyz_web // 再起動(ホットデプロイ)(同じ) $ plenv exec carton exec -- hypnotoad script/xyz_web // ストップ $ plenv exec carton exec -- hypnotoad --stop script/xyz_web $ plenv exec carton exec -- hypnotoad -s script/xyz_web // フォアグラウンドで起動(バックグラウンドへまわさない) $ plenv exec carton exec -- hypnotoad -f script/xyz_web // ヘルプ plenv exec carton exec -- hypnotoad --help Server available at http://127.0.0.1:8080.