概要
ぴゅーっと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.